程序员的网络日志 程序员的网络日志
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理
  • C语言
  • 数据结构
  • 汇编语言
  • 操作系统
  • Linux
  • 编译原理
  • 计算机网络
  • 数据库
  • Java基础
  • JavaWeb
  • 笔记软件
  • Quicker
  • Qttabar
  • Wgesture
  • 浏览器与插件
  • 视频播放器
  • 待办清单
  • 终端软件
  • uTools
  • 番茄盒子
  • 网站日记
  • 赞赏支持
  • 关于本站
  • 如何搭建一个博客
  • 如何搭建一个邮箱
GitHub (opens new window)
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理
  • C语言
  • 数据结构
  • 汇编语言
  • 操作系统
  • Linux
  • 编译原理
  • 计算机网络
  • 数据库
  • Java基础
  • JavaWeb
  • 笔记软件
  • Quicker
  • Qttabar
  • Wgesture
  • 浏览器与插件
  • 视频播放器
  • 待办清单
  • 终端软件
  • uTools
  • 番茄盒子
  • 网站日记
  • 赞赏支持
  • 关于本站
  • 如何搭建一个博客
  • 如何搭建一个邮箱
GitHub (opens new window)
  • 计算机科学导论

  • 数字电路

  • 计算机组成原理

  • 数据结构

  • 操作系统

    • 操作系统
    • 操作系统概述
    • 什么是操作系统
    • 进程
    • 存储
    • 文件
    • IO
    • 死锁
    • 多媒体操作系统
    • 多处理机系统
    • 安全
    • 实例研究1:Linux
      • 10.1 UNIX与Linux的历史
  • Linux

  • 编译原理

  • 计算机网络

  • 数据库

  • 计算机科学导论
  • 计算机基础
  • 操作系统
程序狗
2022-07-25
目录

实例研究1:Linux

# 第10章 实例研究1:Linux

在前面的章节中,我们大体上学习了很多关于操作系统的原理、抽象、算法和技术。现在分析一些具体的操作系统,看一看这些原理在现实世界中是怎样应用的。我们将从Linux开始,它是UNIX的一个很流行的衍生版本,可以运行在各类计算机上。它不仅是高端工作站和服务器上的主流操作系统之一,还在移动电话到超级计算机的一系列系统中得到应用。Linux系统也体现了很多重要的操作系统设计原理。

我们将从Linux的历史以及UNIX与Linux的演化开始讨论,然后给出Linux的概述,从而使读者对它的使用有一些概念。这个概述对那些只熟悉Windows系统的读者尤为有用,因为Windows系统实际上对使用者隐藏了几乎所有的系统细节。虽然图形界面可以使初学者很容易上手,但它提供了很少的灵活性而且不能使用户洞察到系统是如何工作的。

接下来是本章的核心内容,我们将分析Linux的进程与内存管理、I/O、文件系统以及安全机制。对于每个主题,我们将先讨论基本概念,然后是系统调用,最后讨论实现机制。

我们首先应该解决的问题是:为什么要用Linux作为例子?的确,Linux是UNIX的一个衍生版本,但UNIX自身有很多版本,还有很多其他的衍生版本,包括AIX、FreeBSD、HP-UX、SCO UNIX、System VSolaris等。幸运的是,所有这些系统的基本原理与系统调用大体上是相同的(在设计上)。此外,它们的总体实现策略、算法与数据结构也很相似,不过也有一些不同之处。为了使我们的例子更具体,最好选定一个系统然后从始至终地对它进行讨论。因为大多数读者相对于其他系统而言更容易接触到Linux,故我们选中Linux作为例子。况且除了实现相关的内容,本章的大部分内容对所有UNIX系统都是适用的。有很多书籍介绍怎样使用UNIX,但也有一些介绍其高级特性以及系统内核(Bovet和Cesati,2005;Maxwell,2001;McKusick和Neville-Neil,2004;Pate,2003;Stevens和Rago,2008;Vahalia,2007)

# 10.1 UNIX与Linux的历史

UNIX与Linux有一段漫长而又有趣的历史,因此我们将从这里开始我们的学习。UNIX开始只是一个年轻的研究人员(Ken Thompson)的业余项目,后来发展成价值数十亿美元的产业,涉及大学、跨国公司、政府与国际标准化组织。在接下来的内容里我们将展开这段历史。

# 10.1.1 UNICS

回到20世纪40~50年代,当时使用计算机的标准方式是签约租用一个小时的机时,然后在这个小时内独占整台机器。至少从这个角度,所有的计算机都是个人计算机。当然,这些机器体积庞大,在任何时候只有一个人(程序员)能使用它们。当批处理系统在20世纪60年代兴起时,程序员把任务记录在打孔卡片上并提交到机房。当机房积累了足够的任务后,将由操作员在一次批处理中处理。这样,往往在提交任务一个甚至几个小时后才能得到结果。在这种情况下,调试成为一个费时的过程,因为一个错位的逗号都会导致程序员浪费数小时。

为了摆脱这种公认的令人失望且没有效率的设计安排,Dartmouth学院与M.I.T发明了分时系统。Dartmouth系统只能运行BASIC,并且经历了短暂的商业成功后就消失了。M.I.T的系统CTSS用途广泛,在科学界取得了巨大的成功。不久之后,来自Bell实验室与通用电器(随后成为计算机的销售者)的研究者与M.I.T合作开始设计第二代系统MULTICS(MULTiplexed Information and Computing Service,多路复用信息与计算服务),我们在第一章讨论过它。

虽然Bell实验室是MULTICS项目的创始方之一,但是它后来撤出了这个项目,仅留下一位研究人员Ken Thompson寻找一些有意思的东西继续研究。他最终决定在一台废弃的PDP-7小型机上自己写一个精简版的MULTICS(当时使用汇编语言)。尽管PDP-7体积很小,但是Thompson的系统实际上可以工作并且能够支持他的开发成果。随后,Bell实验室的另一位研究者Brian Kernighan有点开玩笑地把它叫做UNICS(UNiplexed Information and Computing Service,单路信息与计算服务)。尽管"EUNUCHS"的双关语是对MULTICS的删减,但是这个名字保留了下来,虽然其拼写后来变成了UNIX。

# 10.1.2 PDP-11 UNIX

Thompson的工作给很多他在Bell实验室的同事留下了深刻的印象,很快Dennis

Ritchie加入进来,接着是他所在的整个部门。在这段时间,UNIX系统有两个重大的发展。第一,UNIX从过时的PDP-7计算机移植到更现代化的PDP-11/20,然后是PDP-11/45和PDP-11/70。后两种机器在20世纪70年代占据了小型计算机的主要市场。PDP-11/45和PDP-11/70的功能更为强大,有着在当时较大的物理内存(分别为256KB与2MB)。同时,它们有内存保护硬件,从而可以同时支持多个用户。然而,它们都是16位机器,从而限制了单个进程只能拥有64KB的指令空间和64KB的数据空间,即使机器能够提供远大于此的物理内存。

第二个发展则与编写UNIX的编程语言有关。直到现在,为每台新机器重写整个系统显然是一件很无趣的事情,因此Thompson决定用自己设计的一种高级语言B重写UNIX。B是BCPL的简化版(BCPL自己是CPL的简化版,而CPL就像PL/I一样从来没有好用过)。由于B的种种缺陷,尤其是缺乏数据结构,这次尝试并不成功。接着Ritchie设计了B语言的后继者,很自然地命名为C。Ritchie同时为C编写了一个出色的编译器。Thompson和Ritchie一起工作,用C重写了UNIX。C是恰当的时间出现的一种恰当的语言,从此统治了操作系统编程。

1974年,Ritchie和Thompson发表了一篇关于UNIX的里程碑式的论文(Ritchie和Thompson,1974)。由于他们在论文中介绍的工作,他们随后获得了享有盛誉的图灵奖(Ritchie,1984;Thompson,1984)。这篇论文的发表使许多大学向Bell实验室索要UNIX的复制。由于Bell实验室的母公司AT&T在当时作为垄断企业受到监管,不允许经营计算机业务,它很愿意能够通过向大学出售UNIX获取适度的费用。

一个偶然事件往往能够决定历史。PDP-11正好是几乎所有大学的计算机系选择的计算机,而PDP-11预装的操作系统使大量的教授与学生望而生畏。UNIX很快地填补了这个空白。这在很大程度上是因为UNIX提供了全部的源代码,人们可以(实际上也这么做了)不断地进行修补。大量科学会议围绕UNIX举行,在会上杰出的演讲者们站在台上介绍他们在系统核心中找到并改正的隐蔽错误。一位澳大利亚教授John

Lions用通常是为乔叟(Chaucer)或莎士比亚(Shakespeare)作品保留的格式为UNIX的源代码编写了注释(1996年以Lions的名义重新印刷)。这本书介绍了版本6,之所以这么命名是因为它出现在UNIX程序员手册的第6版中。源代码包含8200行C代码以及900行汇编代码。由于以上所有这些活动,关于UNIX系统的新想法和改进迅速传播开来。

在几年内,版本6被版本7代替,后者是UNIX的第一个可移植版本(运行在PDP-11以及Interdata 8/32上),已经有18 800行C代码以及2100行汇编代码。在版本7上培养了整整一代的学生,这些学生毕业去业界工作后促进了它的传播。到了20世纪80年代中期,各个版本的UNIX在小型机与工程工作站上已广为使用。很多公司甚至买下源代码版权开发自己的UNIX版本,其中有一家年轻小公司叫做Microsoft(微软),它以XENIX的名义出售版本7好几年了,直到它的兴趣转移到了其他方向上。

# 10.1.3 可移植的UNIX

既然UNIX是用C编写的,将它移动或者移植(正式说法)到一台新机器上比早先的时候要容易多了。移植首先需要为新机器写一个C编译器,然后需要为新机器的I/O设备,如显示器、打印机、磁盘等编写设备驱动。虽然驱动的代码是用C写的,但由于没有两个磁盘按照同样的方式工作,它不能被移植到另一台机器,并在那台机器上编译运行。最终,一小部分依赖于机器的代码,如中断处理或内存管理程序,必须重写,通常使用汇编语言。

从PDP-11向外的第一次移植是到Interdata

8/32小型机上。这次实践显示出UNIX在设计时暗含了一大批关于系统运行机器的假定,例如假定整型的大小为16位,指针的大小也是16位(暗示程序最大容量为64KB),还有机器刚好有三个寄存器存放重要的变量。这些假定没有一个与Interdata机器的情况相符,因此整理修改UNIX需要大量的工作。

另一个问题来自Ritchie的编译器。尽管它速度快,能够产生高质量的目标代码,这些代码只是基于PDP-11机器。有别于针对Interdata机器写一个新编译器的通常做法,Bell实验室的Steve

Johnson设计并实现了可移植的C编译器,只需要适量的修改工作就能够为任何设计合理的机器生成目标代码。多年以来,除了PDP-11以外几乎所有机器的C编译器都是基于Johnson的编译器,因此Johnson的工作极大地促进了UNIX在新计算机上的普及。

由于所有的开发工作都必须在惟一可用的UNIX机器PDP-11上进行,这台机器正好在Bell实验室的第五层,而Interdata在第一层,因此最初向Interdata机器的移植进度缓慢。生成一个新版本意味着在五楼编译,然后把一个磁带搬到一楼去检查这个版本是否能用。在搬了几个月的磁带后,有人提出:"要知道我们是一家电话公司,为什么我们不把两台机器用电线连接起来?"这样UNIX网络诞生了。在移植到Interdata之后,UNIX又移植到VAX和其他计算机上。

在AT&T于1984年被美国政府拆分后,它获得了设立计算机子公司的法律许可,并很快就这样做了。不久,AT&T发布了第一个商业化的UNIX产品------System

III。它并没有被很好地接受,因此在一年之后就被一个改进的版本System

V取代。关于System

IV发生了什么是计算机科学史上最大的未解之谜之一。最初的System

V很快就被System

V的第2版,第3版,接着是第4版取代,每一个新版本都更加庞大和复杂。在这个过程中,UNIX系统背后的初始思想,即一个简单、精致的系统,逐渐地消失了。虽然Ritchie与Thompson的小组之后开发了UNIX的第8、第9与第10版,由于AT&T把所有的商业力量都投入到推广System

V中,它们并没有得到广泛的传播。然而,UNIX的第8、第9与第10版的部分思想被最终包含在System

V中。AT&T最后决定,它毕竟是一家电话公司而不是一家计算机公司,因此把UNIX的生意在1993年卖给了Novell。Novell随后在1995年把它又卖给了Santa

Cruz

Operation。那时候谁拥有UNIX的生意已经无关紧要了,因为所有主要的计算机公司都已经拥有了其许可证。

# 10.1.4 Berkeley UNIX

加州大学伯克利分校(University of California at

上次更新: 2022/8/7 09:00:48
安全
Linux

← 安全 Linux→

最近更新
01
关于我
10-19
02
如何搭建个人邮箱
08-03
03
编译原理概述
07-31
更多文章>
Theme by Vdoing | Copyright © -2022 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式