本系列博文是《现代操作系统(英文第三版)》(Modern Operating Systems,简称MOS)的阅读笔记,定位是正文精要部分的摘录和课后习题精解,因此不会事无巨细的全面摘抄,仅仅根据个人情况进行记录和推荐。由于是英文版,部分内容会使用英文原文。
第十章是关于Linux的简略介绍。一百页的篇幅导致介绍不可能面面俱到,也不如专门的Linux书籍(比如LKD、APUE、UNP)精细深入。不过一些习题不错,有助于理解Linux的某些细节的设计意图。
接下来的两章“实例研究2:Windows Vista和”“实例研究3:Symbian”个人暂时没有研究的兴趣,仅仅粗略翻了下,不打算专门做笔记。
对于第十三章“操作系统设计”,基本是对全书的回顾,这里仅仅整理最有帮助的“机制与策略”部分。
第十章
1./proc文件系统(P796)
Linux的/proc目录其实是一个文件系统,其思想源于4.4BSD和System V,基本概念是为每一个进程在这个目录下创建一个目录,名称即PID的十进制表示,该目录下是和这个进程相关的信息。以前通过/proc来查看过进程信息,不过没想到它是一种文件系统。这些文件在磁盘上实际上是不存在的。
另外,非特权用户可以通过/proc来了解进程信息,甚至可以通过写入的方式改变系统参数。
习题
10. Why do you think the designers of Linux made it impossible for a process to send a signal to another process that is not in its process group?
译:
你认为是什么原因促使Linux的设计者不允许一个进程向和它不是同一个进程组的进程发送信号?
Answer:
Malicious users could wreak havoc with the system if they could send signals to arbitrary unrelated processes. Nothing would stop a user from writing a program consisting of a loop that sent a signal to the process with PID i for all i from 1 to the maximum PID. Many of these processes would be unprepared for the signal and would be killed by it. If you want to kill off your own processes, that is all right, but killing off your neighbor’s processes is not acceptable.
答案译文:
恶意用户可以通过向不相关的进程发送信号以造成系统灾难。无法阻止一个用户编写一个循环地向所有PID进程发送信号的程序。大量的进程将因未做好处理信号的准备而崩溃。kill掉自己的进程是合理的,但是kill其他用户的进程是无法接受的。
分析:
除非是系统管理员,否则不应该允许一个用户kill掉另一个用户的进程。
14. In every process' entry in the task structure, the PID of the parent is stored. Why?
译:
为什么进程的任务结构中需要保存父进程的PID?
Answer:
When the process exits, the parent will be given the exit status of its child.The PID is needed to be able to identify the parent so the exit status can be
transferred to the correct process.
分析:
进程退出时,其父进程需要获得它的退出状态,因此进程需要父进程PID来确定应该把它的退出状态传给谁。
25. Is it possible that with the buddy system of memory management it ever occurs that two adjacent blocks of free memory of the same size co-exist without being merged into one block? If so, explain how. If not, show that it is impossible.
译:
伙伴系统中是否有可能存在两个同样大小的邻接块为空,但不会被合并成一个块?解释你的答案。
Answer:
It is possible if the two blocks are not buddies. Consider the situation of Fig. 10-17(e). Two new requests come infor eight pages each. At this point the bottom 32 pages of memory are owned by four different users, each with eight pages. Now users 1 and 2 release their pages, but users 0 and 3 hold theirs. This yields a situation with eight pages used, eight pages free, eight pages free, and eight pages used. We have two adjacent blocks of equal size that cannot be merged because theyare not buddies.
分析:
答案描述的是下图的情形,两个块虽然相邻,但它们并非来自同一个16个页面的块,因而不能合并。
如果仍然不理解为何不可这样合并,那么设想一下:如果这种情况是允许的,那么这64个页面的块可能会被分为16-32-16的分割,而合并的两个块大小应该一样,显然无法合并,不能形成更大(64)的空闲块,这是不合理的。
第12章
中文版勘误
1.P525图12-1,“显式”应为“显示”。
第13章
1.机制与策略(P975)
原先在学习《Linux内核设计与实现》时,没搞清楚机制与策略到底是什么差别。作为UNIX的一大特色,“机制与策略相分离”在《现代操作系统》中被仔细分析,值得研读一番。
先来看看《现代操作系统》上提到的机制与策略分离的好处:有助于体系结构一致性、有助于使系统保持小型和良好的结构。那么,所谓的“分离”,即指:“将机制放入操作系统而将策略留给用户进程,从而在改变策略时系统保持不变”。退一步地,“即使策略模块必须保留在内核时,如果可能也应与机制相隔离”。
再看看书中提到的几个例子,首先是两个现实中的例子。
例1,一家大型公司,拥有负责向员工发放薪水的工资部门,该部门拥有计算机、软件、空白支票、与银行的契约及更多机制,以便准确地发出薪水。然而,策略——确定谁该获得多少薪水——是完全与机制分开的,并且是由管理部门决定的,工资部门只是做他们被要求做的事。
例2,一家饭店,拥有提供餐饮的机制,包括餐桌、餐具、服务员、充满设备的厨房、与信用卡公司的契约等等。策略是由厨师长设定的,他来决定菜单上有什么。如果决定撤掉豆腐换上牛排,那么这一新的策略仍然可以由原有机制来处理。
接下来是操作系统的例子。
例3,考虑线程调度,优先级调度器用于选出最高优先级的线程,其机制是一个数组,以优先级为索引。而策略是设定优先级,可以存在不同的策略:优先I/O、根据用户级别决定、根据运行情况动态改变、甚至由用户设定。
例4,分页。机制涉及MMU管理、维护使用页面和空闲页面的列表、将页面移入移出磁盘的代码,而策略是页面故障时做什么:基于LRU还是FIFO的或是其它某种。
例5,允许模块装载到内核中。机制关系它们如何被插入、链接、可以发生什么调用、对它们可以发出什么调用,策略是确定允许谁(哪些用户)将模块装载到内核之中以及装载哪些模块。可能只有超级用户可以装载模块,也许任何用户都可以装载被适当权威机构数字签名的模块。
这样,我的理解便是:机制是一系列配套设施,用来完成各种工作;而策略来表明如何使用这套设施来完成怎么样的工作。
勘误
1.P961第二段末尾多出一个"The"。