返回顶部
首页 > 资讯 > 操作系统 >概述Linux TTY/PTS的区别
  • 223
分享到

概述Linux TTY/PTS的区别

LinuxTTYLinuxPTSLinuxTTYPTS 2022-06-04 23:06:29 223人浏览 泡泡鱼
摘要

当我们在键盘上敲下一个字母的时候,到底是怎么发送到相应的进程的呢?我们通过ps、who等命令看到的类似tty1、pts/0这样的输出,它们的作用和区别是什么呢? TTY历史 支持多任务的计算机出现之前 在计算机出来以

当我们在键盘上敲下一个字母的时候,到底是怎么发送到相应的进程的呢?我们通过ps、who等命令看到的类似tty1、pts/0这样的输出,它们的作用和区别是什么呢?

TTY历史

支持多任务的计算机出现之前

在计算机出来以前,人们就已经在使用一种叫teletype的设备,用来相互之间传递信息,看起来像下面这样:


+----------+   Physical Line   +----------+
| teletype |<--------------------->| teletype |
+----------+            +----------+

两个teletype之间用线连接起来,线两端可能也有类似于调制解调器之类的设备(这里将它们忽略),在一端的teletype上敲键盘时,相应的数据会发送到另一端的teletype,具体功能是干什么的,我也不太了解。(我脑袋里面想到画面是在一端敲字,另一端打印出来)

这些都是老古董了,完全没接触过,所以只能简单的推测。

支持多任务的计算机出现之后

等到计算机支持多任务后,人们想到把这些teletype连到计算机上,作为计算机的终端,从而可以操作计算机。

使用teletype的主要原因有两个(个人见解):

  • 现实中已经存在了大量不同厂商的teletype,可以充分利用现有资源
  • teletype的相关网络已经比较成熟,连起来方便

于是连接就发展成这样:


                                   +----------+ 
+----------+  +-------+   Physical Line   +-------+  +------+  |     |
| Terminal |<->| Modem |<--------------------->| Modem |<->| UART |<->| Computer |
+----------+  +-------+            +-------+  +------+  |     |
                                   +----------+
  • 左边的Terminal就是各种各样的teletype
  • 物理线路两边用上了Modem,就是我们常说的“猫”,那是因为后来网络已经慢慢的变发达了,大家可以共享连接了。(大概推测,可能不对)
  • UART可以理解为将teletype的信号转换成计算机能识别的信号的设备

内核TTY子系统

计算机为了支持这些teletype,于是设计了名字叫做TTY的子系统,内部结构如下:


  +-----------------------------------------------+
  |          Kernel           |
  |                 +--------+  |
  |  +--------+  +------------+  |    |  |    +----------------+
  |  | UART |  |  Line  |  | TTY  |<---------->| User process A |
<------>|    |<->|      |<->|    |  |    +----------------+
  |  | driver |  | discipline |  | driver |<---------->| User process B |
  |  +--------+  +------------+  |    |  |    +----------------+
  |                 +--------+  |
  |                        |
  +-----------------------------------------------+
  • UART driver对接外面的UART设备
  • Line discipline主要是对输入和输出做一些处理,可以理解它是TTY driver的一部分
  • TTY driver用来处理各种终端设备
  • 用户空间的进程通过TTY driver来和终端打交道

为了简单起见,后面的介绍中不再单独列出UART driver和Line discipline,可以认为它们是TTY driver的一部分

TTY设备

对于每一个终端,TTY driver都会创建一个TTY设备与它对应,如果有多个终端连接过来,那么看起来就是这个样子的:


           +----------------+
           |  TTY Driver  |
           |        |
           |  +-------+  |    +----------------+
 +------------+    |  |    |<---------->| User process A |
 | Terminal A |<--------->| ttyS0 |  |    +----------------+
 +------------+    |  |    |<---------->| User process B |
           |  +-------+  |    +----------------+
           |        |
           |  +-------+  |    +----------------+
 +------------+    |  |    |<---------->| User process C |
 | Terminal B |<--------->| ttyS1 |  |    +----------------+
 +------------+    |  |    |<---------->| User process D |
           |  +-------+  |    +----------------+
           |        |
           +----------------+

当驱动收到一个终端的连接时,就会根据终端的型号和参数创建相应的tty设备(上图中设备名称叫ttyS0是因为大部分终端的连接都是串行连接),由于每个终端可能都不一样,有自己的特殊命令和使用习惯,于是每个tty设备的配置可能都不一样。比如按delete键的时候,有些可能是要删前面的字符,而有些可能是删后面的,如果没配置对,就会导致某些按键不是自己想要的行为,这也是我们在使用模拟终端时,如果默认的配置跟我们的习惯不符,需要做一些个性化配置的原因。

后来随着计算机的不断发展,teletype这些设备逐渐消失,我们不再需要专门的终端设备了,每个机器都有自己的键盘和显示器,每台机器都可以是其它机器的终端,远程的操作通过ssh来实现,但是内核TTY驱动这一架构没有发生变化,我们想要和系统中的进程进行I/O交互,还是需要通过TTY设备,于是出现了各种终端模拟软件,并且模拟的也是常见的几种终端,如VT100、VT220、XTerm等。

  • 可以通过命令toe -a列出系统支持的所有终端类型
  • 可以通过命令infocmp来比较两个终端的区别,比如infocmp vt100 vt220将会输出vt100和vt220的区别。

程序如何和TTY打交道

在讨论TTY设备是如何被创建及配置之前,我们先来看看TTY是如何被进程使用的:


#先用tty命令看看当前bash关联到了哪个tty
dev@debian:~$ tty
/dev/pts/1

#看tty都被哪些进程打开了
dev@debian:~$ lsof /dev/pts/1
COMMAND PID USER  FD  TYPE DEVICE SIZE/OFF node NAME
bash   907 dev  0u  CHR 136,1   0t0  4 /dev/pts/1
bash   907 dev  1u  CHR 136,1   0t0  4 /dev/pts/1
bash   907 dev  2u  CHR 136,1   0t0  4 /dev/pts/1
bash   907 dev 255u  CHR 136,1   0t0  4 /dev/pts/1
lsof  1118 dev  0u  CHR 136,1   0t0  4 /dev/pts/1
lsof  1118 dev  1u  CHR 136,1   0t0  4 /dev/pts/1
lsof  1118 dev  2u  CHR 136,1   0t0  4 /dev/pts/1

#往tty里面直接写数据跟写标准输出是一样的效果
dev@dev:~$ echo aaa > /dev/pts/2
aaa

pts也是tty设备,它们的关系后面会介绍到

通过上面的lsof可以看出,当前运行的bash和lsof进程的stdin(0u)、stdout(1u)、stderr(2u)都绑定到了这个TTY上。

下面是tty和进程以及I/O设备交互的结构图:


  Input  +--------------------------+  R/W   +------+
----------->|             |<---------->| bash |
      |     pts/1      |      +------+
<-----------|             |<---------->| lsof |
  Output  | Foreground process group |  R/W   +------+
      +--------------------------+                
  • 可以把tty理解成一个管道(pipe),在一端写的内容可以从另一端读取出来,反之亦然。
  • 这里input和output可以简单的理解为键盘和显示器,后面会介绍在各种情况下input/ouput都连接的什么东西。
  • tty里面有一个很重要的属性,叫Foreground process group,记录了当前前端的进程组是哪一个。process group的概念会在下一篇文章中介绍,这里可以简单的认为process group里面只有一个进程。
  • 当pts/1收到input的输入后,会检查当前前端进程组是哪一个,然后将输入放到进程组的leader的输入缓存中,这样相应的leader进程就可以通过read函数得到用户的输入
  • 当前端进程组里面的进程往tty设备上写数据时,tty就会将数据输出到output设备上
  • 当在shell中执行不同的命令时,前端进程组在不断的变化,而这种变化会由shell负责更新到tty设备中

从上面可以看出,进程和tty打交道很简单,只要保证后台进程不要读写tty就可以了,即写后台程序时,要将stdin/stdout/stderr重定向到其它地方(当然deamon程序还需要做很多其它处理)。

先抛出两个问题(后面有答案):

  • 当非前端进程组里面的进程(后台进程)往tty设备上写数据时,会发生什么?会输出到outpu上吗?
  • 当非前端进程组里面的进程(后台进程)从tty设备上读数据时,会发生什么?进程会阻塞吗?

TTY是如何被创建的

下面介绍几种常见的情况下tty设备是如何创建的,以及input和output设备都是啥。

键盘显示器直连(终端)

先看图再说话:


          +-----------------------------------------+
          |     Kernel             |
          |              +--------+  |    +----------------+ 
 +----------+   |  +-------------------+  | tty1 |<---------->| User processes |
 | Keyboard |--------->|          |  +--------+  |    +----------------+
 +----------+   |  | Terminal Emulator |<->| tty2 |<---------->| User processes |
 | Monitor |<---------|          |  +--------+  |    +----------------+
 +----------+   |  +-------------------+  | tty3 |<---------->| User processes |
          |              +--------+  |    +----------------+
          |                     |
          +-----------------------------------------+

键盘、显示器都和内核中的终端模拟器相连,由模拟器决定创建多少tty,比如你在键盘上输入ctrl+alt+F1时,模拟器首先捕获到该输入,然后激活tty1,这样键盘的输入会转发到tty1,而tty1的输出会转发到显示器,同理用输入ctrl+alt+F2,就会切换到tty2。

当模拟器激活tty时如果发现没有进程与之关联,意味着这是第一次打开该tty,于是会启动配置好的进程并和该tty绑定,一般该进程就是负责login的进程。PwIBrbJk

当切换到tty2后,tty1里面的输出会输出到哪里呢?tty1的输出还是会输出给模拟器,模拟器里会有每个tty的缓存,不过由于模拟器的缓存空间有限,所以下次切回tty1的时候,只能看到最新的输出,以前的输出已经不在了。

不确定这里的终端模拟器对应内核中具体的哪个模块,但肯定有这么个东西存在

SSH远程访问


 +----------+    +------------+
 | Keyboard |------>|      |
 +----------+    | Terminal |
 | Monitor |<------|      |
 +----------+    +------------+
             |
             | ssh protocol
             |
             ↓
          +------------+
          |      |
          | ssh server |--------------------------+
          |      |      fork      |
          +------------+             |
            |  ↑                |
            |  |                |
         write |  | read             |
            |  |                |
         +-----|---|-------------------+      |
         |   |  |          |      ↓
         |   ↓  |   +-------+  |    +-------+
         |  +--------+  | pts/0 |<---------->| shell |
         |  |    |  +-------+  |    +-------+
         |  | ptmx |<->| pts/1 |<---------->| shell |
         |  |    |  +-------+  |    +-------+
         |  +--------+  | pts/2 |<---------->| shell |
         |        +-------+  |    +-------+
         |  Kernel          |
         +-----------------------------+

这里的Terminal可能是任何地方的程序,比如windows上的putty,所以不讨论客户端的Terminal程序是怎么和键盘、显示器交互的。由于Terminal要和ssh服务器打交道,所以肯定要实现ssh的客户端功能。

这里将建立连接和收发数据分两条线路解释,为了描述简洁,这里以sshd代替ssh服务器程序:

建立连接

1.Terminal请求和sshd建立连接

2.如果验证通过,sshd将创建一个新的session

3.调用api(posix_openpt())请求ptmx创建一个pts,创建成功后,sshd将得到和ptmx关联的fd,并将该fd和session关联起来。


#pty(pseudo terminal device)由两部分构成,ptmx是master端,pts是slave端,
#进程可以通过调用API请求ptmx创建一个pts,然后将会得到连接到ptmx的读写fd和一个新创建的pts,
#ptmx在内部会维护该fd和pts的对应关系,随后往这个fd的读写会被ptmx转发到对应的pts。

#这里可以看到sshd已经打开了/dev/ptmx
dev@debian:~$ sudo lsof /dev/ptmx
COMMAND PID USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd  1191 dev  8u  CHR  5,2   0t0 6531 /dev/ptmx
sshd  1191 dev  10u  CHR  5,2   0t0 6531 /dev/ptmx
sshd  1191 dev  11u  CHR  5,2   0t0 6531 /dev/ptmx

4.同时sshd创建shell进程,将新创建的pts和shell绑定

收发消息

1.Terminal收到键盘的输入,Terminal通过ssh协议将数据发往sshd

2.sshd收到客户端的数据后,根据它自己管理的session,找到该客户端对应的关联到ptmx上的fd

3.往找到的fd上写入客户端发过来的数据

4.ptmx收到数据后,根据fd找到对应的pts(该对应关系由ptmx自动维护),将数据包转发给对应的pts

5.pts收到数据包后,检查绑定到自己上面的当前前端进程组,将数据包发给该进程组的leader

6.由于pts上只有shell,所以shell的read函数就收到了该数据包

7.shell对收到的数据包进行处理,然后输出处理结果(也可能没有输出)

8.shell通过write函数将结果写入pts

9.pts将结果转发给ptmx

10.ptmx根据pts找到对应的fd,往该fd写入结果

11.sshd收到该fd的结果后,找到对应的session,然后将结果发给对应的客户端

键盘显示器直连(图形界面)


 +----------+    +------------+
 | Keyboard |------>|      |
 +----------+    | Terminal |--------------------------+
 | Monitor |<------|      |      fork      |
 +----------+    +------------+             |
            |  ↑                |
            |  |                |
         write |  | read             |
            |  |                |
         +-----|---|-------------------+      |
         |   |  |          |      ↓
         |   ↓  |   +-------+  |    +-------+
         |  +--------+  | pts/0 |<---------->| shell |
         |  |    |  +-------+  |    +-------+
         |  | ptmx |<->| pts/1 |<---------->| shell |
         |  |    |  +-------+  |    +-------+
         |  +--------+  | pts/2 |<---------->| shell |
         |        +-------+  |    +-------+
         |  Kernel          |
         +-----------------------------+

为了简化起见,本篇不讨论linux下图形界面里Terminal程序是怎么和键盘、显示器交互的。

这里和上面的不同点就是,这里的Terminal不需要实现ssh客户端,但需要把ssh服务器要干的活也干了(当然ssh通信相关的除外)。

SSH + Screen/Tmux

常用Linux的同学应该对screen和tmux不陌生,通过它们启动的进程,就算网络断开了,也不会受到影响继续执行,下次连上去时还能看到进程的所有输出,还能继续接着干活。

这里以tmux为例介绍其原理:


 +----------+    +------------+
 | Keyboard |------>|      |
 +----------+    | Terminal |
 | Monitor |<------|      |
 +----------+    +------------+
             |
             | ssh protocol
        PwIBrbJk     |
             ↓
          +------------+
          |      |
          | ssh server |--------------------------+
          |      |      fork      |
          +------------+             |
            |  ↑                |
            |  |                |
         write |  | read             |
            |  |                |
         +-----|---|-------------------+      |
         |   ↓  |          |      ↓
         |  +--------+  +-------+  |    +-------+ fork  +-------------+
         |  | ptmx |<->| pts/0 |<---------->| shell |-------->| tmux client |
         |  +--------+  +-------+  |    +-------+     +-------------+
         |  |    |        |                ↑
         |  +--------+  +-------+  |    +-------+        |
         |  | ptmx |<->| pts/2 |<---------->| shell |        |
         |  +--------+  +-------+  |    +-------+        |
         |   ↑  | Kernel      |      ↑          |
         +-----|---|-------------------+      |          |
            |  |                |          |
            |w/r|  +---------------------------+          |
            |  |  |      fork                |
            |  ↓  |                        |
          +-------------+                       |
          |       |                       |
          | tmux server |<--------------------------------------------+
          |       |
          +-------------+

系统中的ptmx只有一个,上图中画出来了两个,目的是为了表明tmux服务器和sshd都用ptmx,但它们之间又互不干涉。

这种情况要稍微复杂一点,不过原理都是一样的,前半部分和普通ssh的方式是一样的,只是pts/0关联的前端进程不是shell了,而是变成了tmux客户端,所以ssh客户端发过来的数据包都会被tmux客户端收到,然后由tmux客户端转发给tmux服务器,而tmux服务器干的活和ssh的类似,也是维护一堆的session,为每个session创建一个pts,然后将tmux客户端发过来的数据转发给相应的pts。

由于tmux服务器只和tmux客户端打交道,和sshd没有关系,当终端和sshd的连接断开时,虽然pts/0会被关闭,和它相关的shell和tmux客户端也将被kill掉,但不会影响tmux服务器,当下次再用tmux客户端连上tmux服务器时,看到的还是上次的内容。

TTY和PTS的区别

从上面的流程中应该可以看出来了,对用户空间的程序来说,他们没有区别,都是一样的;从内核里面来看,pts的另一端连接的是ptmx,而tty的另一端连接的是内核的终端模拟器,ptmx和终端模拟器都只是负责维护会话和转发数据包;再看看ptmx和内核终端模拟器的另一端,ptmx的另一端连接的是用户空间的应用程序,如sshd、tmux等,而内核终端模拟器的另一端连接的是具体的硬件,如键盘和显示器。

常见的TTY配置

先先来看看当前tty的所有配置:


dev@dev:~$ stty -a
speed 38400 baud; rows 51; columns 204; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

stty还可以用来修改tty的参数,用法请参考man stty

只要是有权限的程序,都可以通过Linux提供的API来修改TTY的配置,下面介绍一些常见的的配置项。

rows 51; columns 204;

这个配置一般由终端控制,当终端的窗口大小发生变化时,需要通过一定的手段修改该配置,比如ssh协议里面就有修改窗口大小的参数,sshd收到客户端的请求后,会通过API修改tty的这个参数,然后由tty通过信号SIGWINCH通知前端程序(比如shell或者vim),前端程序收到信号后,再去读tty的这个参数,然后就知道如何调整自己的输出排版了。

intr = ^C

tty除了在终端和前端进程之间转发数据之外,还支持很多控制命令,比如终端输入了CTRL+C,那么tty不会将该输入串转发给前端进程,而是将它转换成信号SIGINT发送给前端进程。这个就是用来配置控制命令对应的输入组合的,比如我们可以配置“intr = ^E”表示用CTRL+E代替CTRL+C。

start = ^Q; stop = ^S;

这是两个特殊的控制命令,估计经常有人会碰到,在键盘上不小心输入CTRL+S后,终端没反应了,即没输出,也不响应任何输入。这是因为这个命令会告诉TTY暂停,阻塞所有读写操作,即不转发任何数据,只有按了CTRL+Q后,才会继续。这个功能应该是历史遗留,以前终端和服务器之间没有流量控制功能,所以有可能服务器发送数据过快,导致终端处理不过来,于是需要这样一个命令告诉服务器不要再发了,等终端处理完了后在通知服务器继续。

该命令现在比较常用的一个场景就是用tail -f命令监控日志文件的内容时,可以随时按CTRL+S让屏幕停止刷新,看完后再按CTRL+Q让它继续刷,如果不这样的话,需要先CTRL+C退出,看完后在重新运行tail -f命令。

echo

在终端输入字符的时候,之所以我们能及时看到我们输入的字符,那是因为TTY在收到终端发过去的字符后,会先将字符原路返回一份,然后才交给前端进程处理,这样终端就能及时的显示输入的字符。echo就是用来控制该功能的配置项,如果是-echo的话表示disable echo功能。

-tostop

如果你在shell中运行程序的时候,后面添加了&,比如./myapp &,这样myapp这个进程就会在后台运行,但如果这个进程继续往tty上写数据呢?这个参数就用来控制是否将输出转发给终端,也即结果会不会在终端显示,这里“-tostop”表示会输出到终端,如果配置为“tostop”的话,将不输出到终端,并且tty会发送信号SIGTTOU给myapp,该信号的默认行为是将暂停myapp的执行。

TTY相关信号

除了上面介绍配置时提到的SIGINT,SIGTTOU,SIGWINCHU外,还有这么几个跟TTY相关的信号

SIGTTIN

当后台进程读tty时,tty将发送该信号给相应的进程组,默认行为是暂停进程组中进程的执行。暂停的进程如何继续执行呢?请参考下一篇文章中的SIGCONT。

SIGHUP

当tty的另一端挂掉的时候,比如ssh的session断开了,于是sshd关闭了和ptmx关联的fd,内核将会给和该tty相关的所有进程发送SIGHUP信号,进程收到该信号后的默认行为是退出进程。

SIGTSTP

终端输入CTRL+Z时,tty收到后就会发送SIGTSTP给前端进程组,其默认行为是将前端进程组放到后端,并且暂停进程组里所有进程的执行。

跟tty相关的信号都是可以捕获的,可以修改它的默认行为

结束语

本文介绍了常见的tty功能和特点,下一篇中将详细介绍和tty密切相关的进程session id,进程组,job,后台程序等,敬请期待。

参考

The TTY demystified

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

--结束END--

本文标题: 概述Linux TTY/PTS的区别

本文链接: https://lsjlt.com/news/20811.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 概述Linux TTY/PTS的区别
    当我们在键盘上敲下一个字母的时候,到底是怎么发送到相应的进程的呢?我们通过ps、who等命令看到的类似tty1、pts/0这样的输出,它们的作用和区别是什么呢? TTY历史 支持多任务的计算机出现之前 在计算机出来以...
    99+
    2022-06-04
    Linux TTY Linux PTS Linux TTY PTS
  • 分析概述IPv6与IPv4的应用与区别
    网购、网游、网聊、网络直播、网上… 这个年代要是没有了这张“网” 我们的生活几乎无法运行 你有想过网络互通如何实现的吗? 虚拟世界如何确定网上的...
    99+
    2024-04-02
  • 简述Python2与Python3的区别
    Python2与Python3的区别 python解释器默认编码(python2与python3的区别一) python2 解释器默认编码:ascii python3 解释器默认编码:utf-8 输入(python2与pyth...
    99+
    2023-01-31
    区别
  • Linux用户和用户组的概念及管理概述
    这篇文章主要介绍“Linux用户和用户组的概念及管理概述”,在日常操作中,相信很多人在Linux用户和用户组的概念及管理概述问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux用户和用户组的概念及管理概述...
    99+
    2023-06-13
  • Linux操作系统的概述与简介
    目录1. 什么是操作系统2. Linux的起源3. Linux基本特性4. Linux的应用引言: 这些年,我学习计算机领域的知识之前,习惯于思考知识本身的几个基本要素:**1. 是...
    99+
    2024-04-02
  • 关于Linux和web服务器的概述
    Linux是一种开源的操作系统,它提供了广泛的功能和灵活性,适用于各种用途,包括作为Web服务器的操作系统。Web服务器是一种软件,...
    99+
    2023-09-14
    Linux
  • Linux分区的概念
    这篇文章主要介绍“Linux分区的概念”,在日常操作中,相信很多人在Linux分区的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux分区的概念”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一、...
    99+
    2023-06-16
  • Python turtle.right与turtle.setheading的区别讲述
    目录一、概念二、举例三、区别四、turtle文档链接一、概念 turtle.right与turtle.left用法一致,我们以turtle.right为例进行讲述。 turtle.r...
    99+
    2024-04-02
  • .Net Framework .Net.NET Standard的概念及区别
    目录.Net Framework .Net  .NET Standard的区别一、.NET Framework二、.Net三、.NET Standard三、实际操作说明.N...
    99+
    2024-04-02
  • Linux中进程与线程的概念以及区别是什么
    本篇文章为大家展示了Linux中进程与线程的概念以及区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。linux进程与线程的区别,早已成为IT界经常讨论但热度不减的话题。无论你是初级程序员,还...
    99+
    2023-06-05
  • Python类、模块、包的概念及区别
    类类的概念在许多语言中出现,是面向对象编程的基础,很容易理解。抽象出不同物体的共同特征,根据相似性原则,把彼此相似的物体归于相同的类概念, 它将数据和操作进行封装,以便将来的复用。 模块模块,在Python中一个文件就可以认为是一个模块。在...
    99+
    2023-01-31
    模块 区别 概念
  • 简述虚拟主机与云服务器的区别
    虚拟主机和云服务器都是在计算机上提供虚拟化服务的技术。它们的区别在于它们的用途和优点。以下是它们之间的一些区别和比较: 用途:虚拟主机通常用于网站托管,可以为网站提供可靠的访问,而且通常是按需提供的。而云服务器则通常用于数据存储或虚拟化...
    99+
    2023-10-27
    虚拟主机 区别 服务器
  • linux主分区和扩展分区的概念是什么
    在Linux中,主分区和扩展分区是磁盘分区的两个概念。1. 主分区:主分区是指硬盘上被分区表所识别的物理分区,每个硬盘最多可以有4个...
    99+
    2023-10-12
    linux
  • Linux下“/”和“~”的区别详解
    ”/“是根目录,”~“是家目录。linux存储是以挂载的方式,相当于PofNAHfXm是树状的,源头就是”/“,也就是根目录。而每个用户都有”家“目录,也就是用户的个人目录,比如root用户的”家“目录就是/root,普...
    99+
    2022-06-04
    Linux “/”和“~”区别 Linux /和~
  • linux和windows系统的区别
    在21世纪的今天,互联网可以说是当代发展最为迅速的行业,举个很简单的例子,现在的我们不论什么年龄阶层,几乎人手都有一部手机,上面的某博,某音,末手等软件,更是受到多数人的热爱,并且人们不仅仅用其来消遣娱乐,甚至是用来赚钱,比如说现在深受80...
    99+
    2023-06-05
  • linux中cached和buffers的区别
    这篇文章主要讲解了“linux中cached和buffers的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux中cached和buffers的区别”吧!在linux下使用free...
    99+
    2023-06-05
  • linux下chown与chmod的区别
    本篇内容介绍了“linux下chown与chmod的区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!chown 修改文件和文件夹的用户和用...
    99+
    2023-06-05
  • SQL与NoSQL数据库二者的概念与区别
    这篇文章主要介绍“SQL与NoSQL数据库二者的概念与区别”,在日常操作中,相信很多人在SQL与NoSQL数据库二者的概念与区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 简述虚拟主机与云服务器的区别与联系
    区别: 1. 技术原理不同:虚拟主机是基于Web服务器的一种软件,使用者通过配置Web服务器的IP地址和其他配置文件来管理和运行应用程序。而云服务器则是一种基于云计算平台的服务器架构,通过云计算技术来提供虚拟化的资源供用户使用。 2. 可用...
    99+
    2023-10-27
    虚拟主机 区别 服务器
  • 简述虚拟主机与云服务器的区别是什么
    用途 虚拟主机通常用于建立网站或应用程序。它们提供了一种快速、便宜的方式来构建您的网站和应用程序。云服务器是一种托管服务器,可以提供可扩展性和可靠性。云服务器通常包含云计算基础设施,如计算、存储和网络等,以便您可以将数据和应用程序存储在任...
    99+
    2023-10-27
    虚拟主机 区别 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作