本系列博文是《現代操作系統(英文第三版)》(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 asignal to another process that is not in its process group?譯:
你認為是什么原因促使Linux的設計者不允許一個進程向和它不是同一個進程組的進程發送信號?
Answer:
Malicious users could wreak havoc with the system if they could send signalsto arbitrary unrelated processes. Nothing would stop a user from writing aprogram consisting of a loop that sent a signal to the process with PID i for alli from 1 to the maximum PID. Many of these processes would be unpreparedfor 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 ofFig. 10-17(e). Two new requests come infor eight pages each. At this pointthe bottom 32 pages of memory are owned by four different users, each witheight pages. Now users 1 and 2 release their pages, but users 0 and 3 holdtheirs. This yields a situation with eight pages used, eight pages free, eightpages free, and eight pages used. We have two adjacent blocks of equal sizethat 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"。
新聞熱點
疑難解答