本系列博文是《现代操做系统(英文第三版)》(Modern Operating Systems,简称MOS)的阅读笔记,定位是正文精要部分的摘录和课后习题精解,所以不会事无巨细的全面摘抄,仅仅根据我的状况进行记录和推荐。因为是英文版,部份内容会使用英文原文。数组
第十章是关于Linux的简略介绍。一百页的篇幅致使介绍不可能面面俱到,也不如专门的Linux书籍(好比LKD、APUE、UNP)精细深刻。不过一些习题不错,有助于理解Linux的某些细节的设计意图。ide
接下来的两章“实例研究2:Windows Vista和”“实例研究3:Symbian”我的暂时没有研究的兴趣,仅仅粗略翻了下,不打算专门作笔记。oop
对于第十三章“操做系统设计”,基本是对全书的回顾,这里仅仅整理最有帮助的“机制与策略”部分。学习
Linux的/proc目录实际上是一个文件系统,其思想源于4.4BSD和System V,基本概念是为每个进程在这个目录下建立一个目录,名称即PID的十进制表示,该目录下是和这个进程相关的信息。之前经过/proc来查看过进程信息,不过没想到它是一种文件系统。这些文件在磁盘上其实是不存在的。this
另外,非特权用户能够经过/proc来了解进程信息,甚至能够经过写入的方式改变系统参数。spa
译:操作系统
你认为是什么缘由促使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.blog
答案译文:
恶意用户能够经过向不相关的进程发送信号以形成系统灾难。没法阻止一个用户编写一个循环地向全部PID进程发送信号的程序。大量的进程将因未作好处理信号的准备而崩溃。kill掉本身的进程是合理的,可是kill其余用户的进程是没法接受的。
分析:
除非是系统管理员,不然不该该容许一个用户kill掉另外一个用户的进程。
译:
为何进程的任务结构中须要保存父进程的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来肯定应该把它的退出状态传给谁。
译:
伙伴系统中是否有可能存在两个一样大小的邻接块为空,但不会被合并成一个块?解释你的答案。
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)的空闲块,这是不合理的。
1.P525图12-1,“显式”应为“显示”。
原先在学习《Linux内核设计与实现》时,没搞清楚机制与策略究竟是什么差异。做为UNIX的一大特点,“机制与策略相分离”在《现代操做系统》中被仔细分析,值得研读一番。
先来看看《现代操做系统》上提到的机制与策略分离的好处:有助于体系结构一致性、有助于使系统保持小型和良好的结构。那么,所谓的“分离”,即指:“将机制放入操做系统而将策略留给用户进程,从而在改变策略时系统保持不变”。退一步地,“即便策略模块必须保留在内核时,若是可能也应与机制相隔离”。
再看看书中提到的几个例子,首先是两个现实中的例子。
例1,一家大型公司,拥有负责向员工发放薪水的工资部门,该部门拥有计算机、软件、空白支票、与银行的契约及更多机制,以便准确地发出薪水。然而,策略——肯定谁该得到多少薪水——是彻底与机制分开的,而且是由管理部门决定的,工资部门只是作他们被要求作的事。
例2,一家饭店,拥有提供餐饮的机制,包括餐桌、餐具、服务员、充满设备的厨房、与信用卡公司的契约等等。策略是由厨师长设定的,他来决定菜单上有什么。若是决定撤掉豆腐换上牛排,那么这一新的策略仍然能够由原有机制来处理。
接下来是操做系统的例子。
例3,考虑线程调度,优先级调度器用于选出最高优先级的线程,其机制是一个数组,以优先级为索引。而策略是设定优先级,能够存在不一样的策略:优先I/O、根据用户级别决定、根据运行状况动态改变、甚至由用户设定。
例4,分页。机制涉及MMU管理、维护使用页面和空闲页面的列表、将页面移入移出磁盘的代码,而策略是页面故障时作什么:基于LRU仍是FIFO的或是其它某种。
例5,容许模块装载到内核中。机制关系它们如何被插入、连接、能够发生什么调用、对它们能够发出什么调用,策略是肯定容许谁(哪些用户)将模块装载到内核之中以及装载哪些模块。可能只有超级用户能够装载模块,也许任何用户均可以装载被适当权威机构数字签名的模块。
这样,个人理解即是:机制是一系列配套设施,用来完成各类工做;而策略来代表如何使用这套设施来完成怎么样的工做。
1.P961第二段末尾多出一个"The"。