Press "Enter" to skip to content

Tag: 操作系统

系统接口的比较和再认识

install, config, register, init, open, write, ioctr

在软件世界、程序开发领域,甚至整个工业圈和生活圈充斥这样的一些动词术语:安装、配置、注册、初始化和打开等,这些术语都是奔向一个共同的目标——让所需的功能可用。每一个动词都描述了一个【系统的逻辑接口】,并且这些接口的操作的内容对应着【作业人员】的一项工作。而在具体的情景内,一个作业人员可能身兼多项工作,这样会混淆这些术语的逻辑本质,看不清它们之间的细微差别。本文细究一下这些术语的差别,并以我个人的专业——程序开发领域为例子作一些说明。

操作系统与系统调用再认识

操作系统是什么操作的系统?

一直觉得【操作系统】这个名字很怪异,对所谓【操作系统】有一定认识后发现,这个名字并没有深刻表达所谓【操作系统】这个东西的内涵。【操作系统】这个名字表明【操作系统】是一种【系统】,但没有指明是什么【操作】。

对【操作系统】理论有研究的同学都知道,【操作系统】在计算机使用过程中充当两个角色,第一是虚拟机,为用户提供高级的机器接口;第二是资源管理,实现计算机资源多道使用。资源的多道管理只是【操作系统】一些内部精制的算法,于系统外部是感觉不到的;【操作系统】的系统角色体现在它提供的逻辑接口,这些接口就是行话【系统调用(system call)】。系统论告诉我们,系统与操作接口是一对一的关系,只要我们对系统的操作接口集作一定归纳总结,便略知操作系统的是什么操作的系统。

编译程序与操作系统的关系

和很多程序员一样,编译器到目前为止对我还存在一些让我迷惑的地方。比如编译器与操作系统的关系,编译器与CPU的关系,动态链接器从哪查找共享库等。让人困惑的原因有几,第一是编译器的功能角色特殊,编译器是生成程序的程序;第二是编译过程变得越来越复杂[注],一支编译器支持多种程序语言、支持共享库、编译优化,编译与链接可分开等;第三,操作系统的介入。本文试着从第三点——操作系统介入编译过程后对编译器的影响,看看操作系统与编译器有什么关系。

注:编译过程变复杂源于计算机应用变复杂。例如应用程序项目越来越庞大,功能越来越多;为了管理大项目,拆分源程序文件为多个;为了提高程序的性能,目标程序文件的链接期被延迟到运行前;为了程序的灵活安装和升级,引入各种脚本工具,如make,configure(shell)。

Linux内核的概念体系结构

2.3 Overview of the Kernel Structure

下图展示了Linux内核的五个子系统之间的关系,箭头由依赖子系统指向被依赖的子系统:

Figure 2.2: Kernel Subsystem Overview

从图中可以看出来,【进程调度子系统】是内核的核心子系统:其它子系统都对【进程调度子系统】有依赖,因为其它子系统都有暂停(suspend)和恢复(resume)进程的功能需要。通常,某子系统会在等待硬件操作而暂停进程,尔后在操作完成后恢复进程。例如,当进程发一条网络消息后,网络接口可能需要暂停进程,直到硬件成功地完成信息的发送。在消息被发出后,网络接口返回一个代码表示操作的成功与否,然后恢复进程。其它子系统(内存管理子系统、虚拟文件系统、进程互通信子系统)都有类似的原因而依赖于进程调度子系统。

Solaris的线程模型

Solaris实现了一种不一般的多层的线程模型,这种线程模型为开拓处理器性能提供有效且灵活的方案。

KEMIN: 应用程序功能复杂化使程序具有很好的并发性,而一开始操作系统实现的是多进程模型,但当多进程的模型的实现代价超出并发带来效益时,人们开始改造这种并发模型,线程概念及线程模型出现。

多线程构架

Solaris2.X引入了四个线程相关的概念:

  • 进程(process):这是直接引用原来的UNIX的进程概念,包括用户地址空间、堆栈和进程控制块;
  • 用户级线程(User-level threads)用户级线程是通过在进程地址空间内的线程库实现的,这种线程是内核不可见的。
  • 轻量进程(Lightweight processes)一个轻量进程可以看成是用户级线程到内核线程之间的映射。每个轻量进程可以把一个或多个用户级线程映射为一个内核线程。轻量进程被内核单独调度并且可在多处理器间并行运行。
  • 内核线程(Kernel thread)内核线程是基本被调度实体,并且也是被指派(dispatch)到多处理器之中一个上运行的独立实体。

下图展示了这四个概念之间的关系。注意每个轻量进程都对应一个内核线程的。轻量进程在进程内是可见的,所以轻量进程的数据结构存放相应的进程地址空间内。同时,每一个轻量进程都绑定到单独可指派的(dispatchable)内核线程,而内核线程数据结构是在内核空间内的。

操作系统是什么?

操作系统是什么?它的本质是什么?操作系统是集策略和机制( policy and mechanism)、法则与无法则(algorithm and heuristic)和思想理论与实践经验于一身的高度复杂的混合物(mixtures)。本手册(vade mecum)尝试揉合对操作系统的各种不同观点,一步一步地引导初学者掌握这个计算机科学最复杂的主题。

操作系统主题内容之广以及独立内容之多,以致于学生和教师常常只关注局部而忽视统览全局的思想。我希望通过本书提出的双重思想——资源管理思想(resource management )和美化思想(beautification),矫正这种情况。

(KEMIN:所谓的揉合各种观点其实是抽象出操作系统最一般的理论,指出操作系统的本质)

操作系统发展史

3.1 Open shop

早期的计算机体积庞大、价值昂贵,并且难以使用。计算机用户必须是专业人员,而且用户既是程序员,又是操作员,使用前必须先预约一段(blocks )时间(KEMIN:意思是说时间到了没计算完必须再次预约)。会话情形大似如下:

前OS.png

我们看看1964年时使用计算机 IBM 1620一个会话情况,这台计算机执行程序需要多步的编译:

首先,用户首轮载入FORTRAN的编译器,操作包括:

  • 通过控制台命令按钮清空主存;
  • 把编译器(用穿孔卡片保存的)放入读卡器;
  • 把待编译的源程序(穿孔卡片)放在编译器的后面,与编译器一起读入;
  • 按下读卡器的“load”按钮;

首轮计算输出的卡片叫“中间输出(intermediate output)”。如果有任何编译错误,控制台的灯会闪,错误信息出显示在控制台的打字机上(typewriter)。