历史是什么:是过去传到将来的回声,是将来对过去的反映。  ——雨果(法)《笑面人》

阅读本文大概需要花费你15分钟

文章导航:

  1. 计算机的发展
  2. UNIX系统的诞生
  3. UNIX系统的发展
  4. 终端与控制台
  5. 什么是shell
  6. GUI和伪终端

1. 计算机的发展

第一台计算机是什么时候诞生的?这不是一个容易回答的问题,因为有很多不同的“计算机”定义的分类,比如机械计算机、电子计算机,我甚至可以将算盘也定义成一种计算机。

1946年2月14日(美国时间2月15日 :D),世界上第一台电脑 ENIAC 在美国宾夕法尼亚大学诞生。它发明的目的是用于二战,这部机器使用了18800个真空管,长50英尺,宽30英尺, 占地1500平方英尺,重达30吨(大约是一间半的教室大,六只大象重)。它的计算速度快,每秒可从事5000次的加法运算,运作了九年之久。吃电很凶, 据传ENIAC每次一开机,整个费城西区的电灯都为之黯然失色。

另外,真空管的损耗率相当高,几乎每15分钟就可能烧掉一支真空管,操作人员须花15分钟以上的时间才能找出坏掉的管子,使用上极不方便。曾有人调侃道:“只要那部机器可以连续运转五天,而没有一只真空管烧掉,发明人就要额手称庆了”。

下面的图片就是 ENIAC 的真身:

从上面的图可以看出早期的计算机是多么庞大和笨重,下面看一下早期计算机的配置

历史内存大小及其价格

  时间  生产商 大小(KB) 销售价(美元) 造价(美元)/MB
  1957  C.C.C. 0.00098 392 411,041,792
  1960 E.E.Co. 0.00098 5 5,242,880
  1965 IBM 0.00098 2.52 2,642,412
  1970 IBM 0.00098 0.70 734,003
  1975 MITS 0.25 103 421,888
  1980 Interface Age 64 405 6,480
  1985 Do Kay BYTE 512 440 880
  1990 Unitex BYTE 8,192 851 106
  1995 Pacific Coast Micro 16,384 494 30.9
  2000 Crucial 65,536 72 1.12
  2005 Corsair 1,048,576 189 0.185
  2010 Kingston 8,388,608 99 0.0122
  2013 Crucial 16,777,216 88 0.0054
  2014 Patriot 32,000,000 294 0.0091

从表格中可以看到,1995年,电脑的内存大概在16M的规模,2000年的时候,大概在64M的规模,价格约500元人民币,此时我才小学四年级??对此没有印象,但相信有的人对此记忆犹新吧。

1960年时,计算机的价格是令人难以承受的,早期的大型计算机的价格大约是在500万美元到1000万美元之间,每个月按月出租也需要17000美元,这样昂贵的设备只有大公司和大学教育机构才能负担的起。

2. UNIX系统的诞生

由于大型机过高的价格,美国国防部部门想要在这样的计算机上开发出一套系统multics:该系统通过建置在美国通用电力公司的大型机GE-645,来连接1000部终端机,支持300的用户同时上线。通俗来说,就是国防部门想要一个分时操作系统达到注册用户1000人,最高并发300人的效果。

下图是类似GE645的GE-235大型机:

该项目由AT&T、通用电器公司、麻省理工学院参与,经过4年时间,最终还是失败。两位神一样的人物:Ken Thompson和Dennis MacAlistair Ritchie 在此之后发明了UNIX和C语言。Ken Thompson参与了multics项目,从中获得经验和灵感,并利用小型机pdp-7开发出了UNIX,之后还和Dennis MacAlistair Ritchie共同发明了C语言,并用C语言重写了UNIX使其可以在不同品牌的机器上快速移植。

下面是小型机pdp-7的图片,该型号小型机目前在美国的西雅图Living Computer Museum(活电脑博物馆)还能看到。

3. UNIX系统的发展

随后,由于UNIX易用、可移植且免费,之后迅速扩散开来,但UNIX是Ken Thompson和Dennis MacAlistair Ritchie在AT&T公司的贝尔实验室工作期间鼓捣出来的,版权属于AT&T,起初AT&T由于垄断电信通讯业务,美国政府不允许其涉足计算机行业,另外AT&T也觉得UNIX是个小玩意不挣钱,未予关注,任其发展。后来UNIX壮大后,AT&T欲利用UNIX从事商业软件活动,作为其商业产品欲营利,为了一家独大,AT&T想要收回起初免费使用UNIX的权利。而此时UNIX已经因为源代码公开而形成了很多的实现和版本。

总结来说:1969年Ken Thompson在AT&T公司发明了Unix系统,而后Thompson在加州大学伯克利分校和AT&T公司的Unix部门各自维护了一个实现,分裂成了2种版本。

分裂的2种版本各自吸收使用了对方的一些特色和专有源码,并相互起诉,最终和解。

分裂的2种版本导致各种不同的演化,结果是UNIX的各种实现很乱,上层的应用程序不便移植,最后大家要求统一,最终由此产生了统一标准。

更详细的说明,可参考阮一峰先生的文章:Unix版权史

总之,UNIX分裂成了两大主流分支,很多其他的分支实现基本上是基于BSD或者System V。

4. 终端与控制台

Ken Thompson和Dennis MacAlistair Ritchie发明的UNIX可以在pdp-7上使用,相比于大型机500万—1000万美元的价格虽然不多,但pdp-7的价格也不菲,高达72000美元。仍然没有办法人手一台,但总算让一个普通公司有可能采购了。

一台小型机有控制台、Terminal终端、主机三大部分。在文章的第二个图片“类似GE645的GE-235大型机”那里,为什么我要贴那样的照片?就是想让你直观感受一下:小型机有控制台、Terminal终端、主机。

想象一下,我们平时用的台式机器:主机+键盘+显示器,这里的主机就和以前的小型机的主机一样,负责计算,内含CPU、主板等原件。今天的台式机,主机负责运行操作系统,跑程序,键盘负责打字输入,显示器负责输出显示结果。

那么以前的小型机的控制台和Terminal终端是干什么用的?控制台,英文叫做console,从字面意思可以看出是用来做控制的。回忆一下课本上关于计算机操作系统发展历史的说明:

最初的电脑并没有操作系统,人们通过各种操作按钮来控制计算机,后来出现了汇编语言,操作人员通过有孔的纸带将程序输入电脑进行编译。这些将语言内置的电脑只能由操作人员自己编写程序来运行,不利于设备、程序的共用。为了解决这种问题,就出现了操作系统,这样就很好实现了程序的共用,以及对计算机硬件资源的管理。

那时候,一台大型机或者小型机的使用,不仅有程序员写程序,还有专业机器操作人员和管理人员,每个人有每个人所负责的部分,各人分工不同。这里的管理人员就是对计算机进行控制的工作人员。那么,控制计算机什么呢?需要在计算机启动时控制它的各个硬件,比如寄存器,拔插各种连接线,可以回头看一下本文开头关于 ENIAC 的图片,上面是不是很多的线需要连接?另外还要根据系统启动和运行时的实时情况来查看指示灯的状态和系统运行的告警、错误等日志信息,这就是控制台。从这里的说明可以看出,控制台因为要控制硬件和连接线,所以务必是要直接连接在大小型机的主机上的。

下面图中红色方框的就是console了:

有了console控制台,可以控制大小型机的启动和对其进行硬件管理,但计算机是拿来提供服务的,只能管理是远远不够的,如何为用户或者程序员提供服务呢?那就是通过终端terminal来和计算机进行交互,告诉计算机你想要做什么,然后计算机在终端中显示处理的结果。

通常在系统启动之前,终端是不能连接到主机的,只能console控制台连接。下图就是console和terminal的实物图:

从图中,我们可以看到,一个显示器样的屏幕和一个键盘,这就是终端terminal,用来输入输出,和计算机交互的设备。至此,我们应该彻底明白,console控制台和terminal终端的区别了:一个负责控制;一个负责供用户使用,与计算机进行工作交互。那么,在这里有一个问题:在Linux系统上,当你按下CTRL + ALT + F1时启动的那个黑色界面是console还是terminal?答案是terminal,为什么?因为你是在那里进行登录后与计算机交互。当你重启Server版纯命令行的Linux系统时,会看到屏幕上有很多的信息输出,那一刻你的屏幕则是console控制台的角色。

UNIX是从multics获得的灵感,而multics设计的初衷就是多用户,基于pdp-7开发出的UNIX自然也是一个支持多用户的操作系统,但pdp-7只有一个终端,只能同时一个用户使用,如何支持多用户呢?Ken Thompson和Dennis MacAlistair Ritchie使用了电传打字机来替代终端,电传打字机的英文名称是Teletype,缩写为TTY。电传打字机带一个键盘,也能打印纸张进行文字输出,而且价格低廉,因此可以用来作为UNIX的另一种终端。

需要注意的是,起初Terminal终端和TTY打字机并不是同一种东西,Terminal终端是只有一个,而TTY打字机可以有一到多个。另外,Terminal终端是本地,TTY打字机是远程,此远程非今天的网络远程,是地理位置上的远程,比如TTY打字机用很长的线缆连接到小型机的插口上,无需互联网,而且当时也没有网络。因为TTY打字机是一种终端设备,硬件连接到主机,所以终端的数量也是有限的。由于Terminal终端和TTY打字机扮演的终端的功能相同,所以后来用TTY来统称各种类型的终端设备。另外,之后的TTY终端设备可以通过串口来连接主机进行通信(串行点到点),这个名字也用来指任何的串口终端设备。

无论使用本地Terminal终端还是TTY打字机终端登录系统时,都属于终端登录,与此相对应的是网络登录,进而引申出来伪终端,至于什么是伪终端,我们稍后再讲解。

下面的图就是电传打字机:

仔细观察上图电传打字机的键盘,细心的读者会发现,该打字机的键盘和我们今天的键盘不太一样,少了好几个按键,比如上下左右,比如回车(Enter),比如删除(有的还没有退格键),但也多几个按键,比如第二排的最后两个键。

前面我们说过,电传打字机带一个键盘,也能打印纸张进行文字输出。电传打字机的输出印在纸上,用户输入的字符就像打字机一样也是删不掉的,而且用户输入什么就会立刻传给主机,由于这种终端很弱,所以也被称作"哑终端";由于哑终端的可行和廉价,哑终端开始流行起来,之后一些制造商开始实验生成终端基本的图像功能,其中比较注明的就是DEC公司的vt系列终端。再后来有了以电子显示器为输出设备的终端,一开始也只能一个字符一个字符地给主机发信息,到七十年代末能用终端设备自带的缓冲来缓存用户输入的信息,然后再一次性给主机发送一整行信息的"智能"终端才成为主流。由于终端设备能够进行缓存,所以在发送给主机之前可以进行修改错误的输入,此时键盘上才有了现代电脑用户觉得司空见惯的上下左右方向键和删除退格键,以便对输入进行修改。

这里还涉及到一个历史典故:回车和换行的故事。从上面的电传打字机的图片中可以看到,该打字机每次打印一行,打印一行之后磁头和纸张接触的那个地方位于纸张当前行的最右侧,磁头要回到纸张的下一行最左侧的地方继续打印,从上一行最右侧移动到下一行最左侧这个过程需要耗费0.2秒,这0.2秒内正好可以打两个字符。如果一行只能打印10个字符,而打字机收到连续20个字符,那么在打完10个字符之后,换到下一行用去的0.2秒就会导致有2个字符没打印出来而丢失,最终只有18个字符。

如何解决这个问题?研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。这样刚好用回车和换行这2个无意义字符占用移动磁头所需的0.2秒的时间空缺,也即打字机收到22个字符,1-10字符有意义,11-12字符为回车和换行,13-24字符有意义,在应该打印到11-12字符时,打字机换到下一行最左侧,丢掉11-12字符,不会导致信息错误。

早期的打字机(计算机发明之前)似乎还是手动回车和换行,所以上面的图片能看到"回车"(RE-TURN,第二排最后一个)和"换行"(LINE FEED,第二排倒数第二个)按键。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵(可以回头看一下本文前面关于内存大小及其价格的表格),一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧,Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";Mac系统里,每行结尾是"<回车>"。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

当然,今天随着技术的进步,早已没有了换行和回车的区别,也就不再有RE-TURN和LINE FEED这两个键,统一的使用Enter来替代了。

之后,还是随着技术的进步,CPU、主板、输入输出设备等设备和缓冲技术的飞速发展,console控制台、tty终端这些不再是单独的设备,而是全部被现代的键盘和显示器所整合、代替。因此,console控制台和tty终端也就消失了。现在计算机的console控制台和tty终端都是虚拟出来的概念了,在概念上,键盘和显示器既是console,又是tty。至于什么时候是console,什么时候是tty,取决于那一刻在做什么。比如在我们的系统启动时,我们还能看的console控制台的影子。

下面的图就是类UNIX系统启动时的日志输出,也是退化后的console(退化后的console不再管理各种连接线,简单地保留了日志查看的基本功能,或者当你忘记root密码时,进行系统的“修理”)

5. 什么是shell

在了解了什么是终端和控制台之后,就很容易理解什么是shell了。再次回忆一下,什么是计算机系统?套用鸟哥的一句话:没有插电的计算机是一堆废铁,那么插了电的计算机是什么? 答案是:"一堆会电人的废铁"! 是的,插了电的计算机只是一堆会电人的废铁而已,要想发挥计算机的作用,不仅要有硬件,还要有软件,要安装系统,要上网就要用浏览器,要聊天,就得安装QQ。因此,计算机系统由计算机硬件和软件两部分组成。同样的,终端也是有两部分组成,一部分是终端的硬件:键盘+显示器,另一部分就是shell软件。你在终端里面敲键盘打字,shell软件接收你的输入,然后传递给操作系统,操作系统接收后进行处理,处理完毕后返回。相信到这里,shell是什么概念就不言而喻了,用晦涩的术语来描述就是:shell是人机交互的接口。

6. GUI和伪终端

GUI是图形界面的术语称呼。

虚拟终端和伪终端不同,资源抽象,一个真实存在,一个为提供逻辑抽象而虚拟的接口。

最后,本文根据互联网搜索、部分书籍参考、博客和问答社区以及英文翻译综合整理写出,由于对整个计算机历史并不了解,因此必然存在某些错误,恳请读者予以批评和指正,感谢!

关于Unix/Linux的终端、伪终端、控制台和shell的更多相关文章

  1. UNIX/Linux系统管理技术手册(1)----脚本和shell

    1. 管道和重定向 (i) 要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个 && 符号把两条命令隔开.例如: $ > /dev/null && cd ...

  2. Unix/Linux环境C编程入门教程(39) shell命令之系统管理

    df命令 用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况.命令的使用格式如下: df  [选项] 常用参数及含义如下表所示. df -a:显示所有文件系统的磁盘 ...

  3. Unix/Linux环境C编程入门教程(38) shell命令进阶演示

     1.w命令 该命令也可以查看登录当前系统的用户信息.与who命令相比,w命令的功能更强大,它不但可以显示当前有哪些用户登录到系统,还可以显示这些用户正在进行的操作,并给出更加详细和科学的统计数据 ...

  4. Unix/Linux环境C编程入门教程(37) shell常用命令演练

     cat命令 cat命令可以用来查看文件内容. cat [参数] 文件名. grep-指定文件中搜索指定字符内容. Linux的目录或文件. -path '字串' 查找路径名匹配所给字串的所有文件 ...

  5. Unix/Linux环境C编程新手教程(37) shell经常使用命令演练

     cat命令 cat命令能够用来查看文件内容. cat [參数] 文件名称. grep-指定文件里搜索指定字符内容. Linux的文件夹或文件. -path '字串' 查找路径名匹配所给字串的全部 ...

  6. Unix环境高级编程(二十)伪终端

    1.综述 伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端.从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的.伪终端总 ...

  7. Linux 伪终端(pty)

    通过<Linux 终端(TTY)>一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端.使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vS ...

  8. Linux 串行终端,虚拟终端,伪终端,控制终端,控制台终端的理解

    转自Linux 串行终端,虚拟终端,伪终端,控制终端,控制台终端的理解 终端:输入和输出设备(键盘 + 显示器). 串行终端:与机器的串口对应,每一个串口对应一个串行终端,串口对应的是物理终端. 虚拟 ...

  9. linux的终端,网络虚拟终端,伪终端(转)

      blog.csdn.net/todd911/article/details/8025540 Linux上许多网络服务应用,如l2tp.pptp.telnet,都用到了伪终端.有朋友在问这方面的概念 ...

随机推荐

  1. Thread start()方法和run()方法的区别

    转自:http://www.cnblogs.com/skywang12345/p/3479083.html start():作用一个新的线程,新线程会执行相应的run()方法,start()不能被重复 ...

  2. php三种方法从控制结构或脚本中跳出

    PHP中,如果希望停止一段代码,根据需要达到的效果不同,可以有三种方法实现: 1. break: 如果在循环中使用了break语句,脚本就会从循环体后面的第一条语句开始执行: 2. continue: ...

  3. mysql 开发基础系列3

    日期类型 如果要用来表示年月日,通常用DATE 来表示. 如果要用来表示年月日时分秒,通常用DATETIME 表示. 如果只用来表示时分秒,通常用TIME 来表示. TIMESTAMP表示格式 :YY ...

  4. 多进程编程之用户ID和用户组ID

      实际用户ID(real user id):用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的uid:(实际用户组ID类似) 有效用户ID(effect ...

  5. Java并发编程:线程池

    一.为什么使用线程池 使用线程的时候直接就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降 ...

  6. 【刷题】BZOJ 3626 [LNOI2014]LCA

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. ...

  7. 【刷题】BZOJ 3591 最长上升子序列

    Description 给出1~n的一个排列的一个最长上升子序列,求原排列可能的种类数. Input 第一行一个整数n. 第二行一个整数k,表示最长上升子序列的长度. 第三行k个整数,表示这个最长上升 ...

  8. String,static,final

    1. String 下面代码创建了几个对象? String s1 = new String("Hello"); String s2 = new String("Hello ...

  9. Maven问题合集

    背景:总结maven使用过程中的相关问题,方便以后查询! 1 问题汇总 今天在导入github上下载的maven项目时候,出现了一堆错误,一时间不知道该如何下手. 根据错误提示,发现是一些依赖的jar ...

  10. POI上传,导入excel文件到服务器1

    首先说一下所使用的POI版本3.8,需要用的的Jar包: dom4j-1.6.1.jarpoi-3.8-20120326.jarpoi-ooxml-3.8-20120326.jarpoi-ooxml- ...