本書彌閤瞭操作係統理論課程和操作係統編碼實現之間的斷層。以Linux真實操作係統為觀察對象,主要利用proc文件係統展示齣來的內核行為數據來講述操作係統的核心概念。
目錄
第1章Linux安裝與訪問1
1.1安裝Linux1
1.1.1下載CentOS 71
1.1.2CentOS 7安裝3
1.2虛擬機安裝Linux9
1.2.1VirtualBox安裝9
1.2.2虛擬機配置17
1.2.3虛擬機安裝Linux19
1.3ssh遠程終端訪問21
1.4初次接觸Linux24
1.4.1簡單操作24
1.4.2運行HelloWorld程序29
1.4.3操作係統接口32
1.5閱讀注意事項33
1.6本章小結34
第2章進程控製35
2.1進程基本概念35
2.1.1進程實體37
2.1.2進程間組織關係38操作係統之編程觀察目錄2.1.3進程控製命令42
2.2創建與撤銷進程44
2.2.1fork()創建子進程44
2.2.2孤兒進程和僵屍進程47
2.2.3exec函數族49
2.2.4通過kill()撤銷進程51
2.2.5創建守護進程51
2.3創建pthread綫程56
2.3.1進程與綫程57
2.3.2創建方法58
2.4進程和綫程資源開銷60
2.4.1PCB開銷60
2.4.2內存描述符開銷63
2.5本章小結64
2.6練習65
第3章進程調度66
3.1調度與均衡66
3.1.1調度與均衡框架71
3.1.2全係統的調度統計72
3.2進程狀態及其轉變75
3.2.1進程狀態75
3.2.2狀態轉換80
3.2.3進程的調度統計83
3.3進程的調度88
3.3.1普通進程的CFS調度88
3.3.2實時進程調度93
3.4進程遷移與負載均衡103
3.4.1CFS進程的負載均衡104
3.4.2實時進程的負載均衡111
3.5本章小結114
3.6練習114
第4章進程間通信與同步115
4.1進程間通信115
4.1.1管道115
4.1.2System V IPC120
4.2進程間同步133
4.2.1System V IPC信號量集133
4.2.2POSIX信號量145
4.3本章小結154
4.4練習154
第5章內存管理156
5.1虛存空間管理156
5.1.1進程映像156
5.1.2堆區161
5.1.3文件映射區168
5.1.4棧區171
5.1.5訪問任意進程的虛存176
5.1.6虛存使用的物理頁幀179
5.2分頁機製與頁錶181
5.2.1分頁機製182
5.2.2進程頁錶186
5.3物理內存組織管理193
5.3.1頁幀、節點、內存域193
5.3.2空閑頁幀管理——buddy係統200
5.3.3物理內存分配與迴收204
5.3.4內存迴收215
5.4本章小結227
5.5練習228
第6章綜閤——新進程創建到運行229
6.1shell讀入命令229
6.1.1用戶空間與內核空間229
6.1.2讀入命令231
6.2創建進程237
6.2.1fork()復製進程237
6.2.2替換進程映像238
6.2.3開始運行新進程239
6.2.4進程映像與缺頁240
6.3本章小結240
6.4練習241
第7章VFS文件係統242
7.1VFS242
7.1.1VFS對象243
7.1.2文件係統類型245
7.2文件基本操作246
7.2.1命令行基本操作246
7.2.2編程接口248
7.3目錄結構253
7.3.1樹形結構253
7.3.2軟/硬鏈接254
7.3.3文件係統創建與安裝258
7.4頁緩存264
7.4.1頁緩存基本概念265
7.4.2頁緩存動態變化266
7.5非文件功能268
7.5.1交換268
7.5.2設備接口273
7.5.3proc文件係統279
7.6本章小結280
7.7練習280
第8章EXT2文件係統281
8.1EXT2磁盤數據的組織281
8.1.1整體布局281
8.1.2超級塊283
8.1.3塊組描述符285
8.1.4索引節點286
8.1.5目錄結構289
8.2EXT2文件係統的創建291
8.2.1分配磁盤空間291
8.2.2創建環迴設備292
8.2.3創建EXT2文件係統293
8.2.4安裝文件係統293
8.3查看EXT2磁盤數據294
8.3.1布局信息294
8.3.2塊組描述符299
8.3.3索引節點與文件內容300
8.3.4目錄結構304
8.4本章小結309
8.5練習310
附錄vi編輯命令311
第5章
內存管理
在學習內存管理的時候,需要注意區分虛擬內存、物理內存,以及連續內存管理方式、離散內存管理方式等幾個概念的關係。本書假設讀者已經學習過操作係統原理性課程,對虛擬內存的工作原理有初步瞭解。
本章中“物理頁幀”通常用“頁幀”指代,而虛存空間的頁通常用“虛頁”指代。
5.1虛存空間管理
首先來觀察一個進程內部的進程空間是如何管理的。迴顧圖2��2和圖2��3可知,進程空間是一個虛存空間,被分割成兩大區域——內核空間(所有進程共享該空間)和進程的用戶空間。多個進程各自的虛存空間並存於係統中,形成圖2��8所示的內存子係統完整視圖。其中用戶空間則是由多個內存區間(VMA)構成,其他未分配的空間不能使用,否則齣現非法錯誤。該進程PCB(struct task_struct)的mm成員(struct mm_struct)描述整個進程用戶空間,而mm_struct結構體內部有管理著該進程內部全部的虛存空間(struct vm_area_struct),具體如圖2��3所示。內核空間的管理未進行討論。
5.1.1進程映像
如果運行HelloWorld�瞘etchar程序,然後用ps獲得其PID,就能通過/proc/PID/maps查看這些區間的地址範圍和相關屬性,如屏顯5��1所示。
屏顯5��1中cat /proc/25085/maps命令輸齣的是進程25085(即HelloWorld�瞘etchar)內存布局信息。每一行是一個具有特定屬性的連續內存區,每行的開頭是該區間的地址範圍。後麵的rwxp分彆代錶: r=可讀、w=可寫、x=可執行、s=共享以及p=操作係統之編程觀察第5章內存管理屏顯5��1HelloWorld�瞘etchar的內存布局
[lqm@localhost ~]$ps
PID TTYTIME CMD
4330 pts/000:00:00 bash
25085 pts/000:00:00 HelloWorld-getc
25090 pts/000:00:00 ps
[lqm@localhost ~]$cat /proc/25085/maps
00400000-00401000 r-xp 00000000 fd:00 12641267/home/lqm/HelloWorld-getchar
00600000-00601000 r--p 00000000 fd:00 12641267 /home/lqm/HelloWorld-getchar
00601000-00602000 rw-p 00001000 fd:00 12641267 /home/lqm/HelloWorld-getchar
7f0e039a7000-7f0e03b5d000 r-xp 00000000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03b5d000-7f0e03d5d000 ---p 001b6000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d5d000-7f0e03d61000 r--p 001b6000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d61000-7f0e03d63000 rw-p 001ba000 fd:00 262222 /usr/lib64/libc-2.17.so
7f0e03d63000-7f0e03d68000 rw-p 00000000 00:00 0
7f0e03d68000-7f0e03d88000 r-xp 00000000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f70000-7f0e03f73000 rw-p 00000000 00:00 0
7f0e03f84000-7f0e03f87000 rw-p 00000000 00:00 0
7f0e03f87000-7f0e03f88000 r--p 0001f000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f88000-7f0e03f89000 rw-p 00020000 fd:00 262215 /usr/lib64/ld-2.17.so
7f0e03f89000-7f0e03f8a000 rw-p 00000000 00:00 0
7ffe7dc5e000-7ffe7dc7f000 rw-p 00000000 00:00 0 [stack]
7ffe7dd0a000-7ffe7dd0c000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
[lqm@localhost ~]$
序
深圳大學計算機與軟件學院正在進行教學改革,基於明仲教授和王誌強教授兩位領導的構想,計算機與軟件學院參照美國紐約賓漢姆敦大學教學要求,將其課程在深圳大學原樣重現。對計算機係統係列課程和操作係統課程都進行瞭改革,其中操作係統課程縮減瞭理論授課,增加瞭實驗操作環節。同時深圳大學計算機與軟件學院計算機係統課程組正在承擔廣東省教育廳應用型人纔培養項目(計算機係統係列核心課課程),強調豐富的動手實踐經驗並提高係統能力、係統思維。在上述環境下,為瞭充實實驗內容,保持學生在課程學習中全程充實,我們完成瞭本書以配閤理論教學。
在過去的操作係統教學過程中,作者深感理論教學與實踐的脫節之睏。雖然也有老師講授Linux工程實踐和係統編程,從而拉近瞭兩者的距離,但都還未能與操作係統的核心概念緊密聯係,仍似隔靴搔癢,可望而不可即。另外也考慮過將Linux內核源碼分析或增強作為實踐內容,但是由於學習麯綫過於陡峭需要花費太多的時間,並不太適閤作為課程內容——難以在一個學期課程中結閤進來,甚至還可能讓學生産生無功而返的挫敗感。
根據我們在個人高性能計算機(PHPC)係統研製過程中對研究生培養的經驗積纍,將Linux係統編程的基礎知識結閤Linux的內核行為觀察,利用/proc文件係統中探測到的內核數據,以及其他各種工具收集的內核數據,直觀生動地將進程與內核的交互、內核的行為展示給學生,獲得非常好的學習效果。學生對進程行為、內存分配管理、進程間通信和文件係統等各方麵的認知,都遠比傳統的操作係統課程教學效果好。
讀者在學習和體驗操作係統各種概念的同時,也獲得瞭初步的係統編程實踐鍛煉,並為進一步閱讀Linux內核源代碼做好瞭充足的準備。將proc文件係統和相關工具加入到操作係統的學習過程中,相當於有瞭電路係統課程中的“萬用錶、示波器和邏輯分析儀”等工具,有瞭觀測工具後,操作係統的教學和實驗纔算基本成熟瞭。正因為這些觀測工具,使得一些讀者在完成全書學習後可能會覺得: “哦,原來這纔是操作係統!”經過這樣的實踐鍛煉後,讀者不僅可以在後續學習中加快係統編程的學習進度,還可以加快獲得分析和修改Linux內核代碼能力的培養進程。
本書是作者這些年在本科教學和研究生培養過程中積纍的經驗匯總,相信讀者會喜歡。
限於作者的水平和能力,書中會有疏漏,歡迎讀者指正。
編者
2018年4月操作係統之編程觀察
緻謝
本書獲得深圳市科創委基礎研究JCYJ20150930105133185項目和JCYJ20170302153920897雲環境中的異構存儲資源分配與性能優化研究的資助。感謝深圳大學計算機與軟件學院操作係統課程組的各位老師,大傢一起完成瞭操作係統實驗課程的改革,特彆是張滇和周明洋兩位老師在相關實驗內容的檢查和教學工作中做齣瞭極大的貢獻。
還需要感謝2014級幾位同學在相關的材料整理和實驗代碼的設計中做齣的貢獻。其中林潤勝同學完成瞭第5章的匿名映射、文件映射、meminfo和zoneinfo解讀及相關代碼,第8章的EXT2文件係統中文件內容讀取、目錄讀取及相關代碼,協助完成瞭第6章的勘誤;張永昌同學完成瞭5.1.1節、7.3.3節的內容和相應的代碼。這兩位同學一起提供瞭5.3.3節的部分內容,完成瞭第5章內存管理和第8章EXT2文件係統的勘誤工作。羅文傑同學完成瞭4.2.1節的信號量集相關代碼和材料。2017級研究生湯釗揚同學作為第一位讀者,協助驗證代碼和完成勘誤工作。
在上述老師和同學的大力支持下,本書終於完稿並與讀者見麵,再次對他們錶示衷心的感謝!
這本書的包裝比我想象中的要紮實許多,封麵設計也挺彆緻的,那種沉穩的藍色調,配上燙金的字體,給人一種厚重感,仿佛裏麵藏著不少寶藏。我一直對計算機底層的東西很感興趣,但又苦於找不到閤適的入門書籍,很多技術類的書要麼太晦澀難懂,要麼就是泛泛而談,看得我雲裏霧裏。聽朋友推薦說這本書講解得比較透徹,於是就抱著試試看的心態下單瞭。拿到手之後,翻開目錄,初步看起來似乎內容不少,但願真的能像朋友說的那樣,把我從“小白”級彆提升一點點。我比較期待的是書中對一些核心概念的解釋,比如進程、綫程、內存管理這些,希望它能用更直觀、更易懂的方式來呈現,而不是乾巴巴的術語堆砌。我個人平時喜歡把學到的知識和實際操作結閤起來,所以如果書中能有一些代碼示例,或者引導讀者去思考如何實際應用,那就更好瞭。總之,對這本書抱有相當大的期待,希望能通過它,對操作係統有一個更深入的理解,也為我之後學習更高級的編程技術打下堅實的基礎。
評分我平時是個比較注重實踐的學習者,拿到一本新書,我最先關注的往往是它的案例和代碼。這本書到貨後,我迫不及待地翻到瞭後麵的章節,看有沒有一些實際操作的指導。封麵設計雖然樸實,但給人一種踏實的感覺,不像有些書那樣花裏鬍哨。我一直對操作係統如何管理硬件資源、如何調度任務這些問題感到好奇,總覺得那些底層的東西纔是計算機運行的靈魂。我看瞭一下目錄,似乎涵蓋瞭操作係統很多重要的方麵,比如文件係統、設備驅動等等,這些都是我比較陌生的領域,但又覺得非常關鍵。如果書中的講解能夠結閤一些實際的例子,比如如何通過代碼來觀察進程的行為,或者如何理解文件是如何在磁盤上存儲的,那我一定會學得更有勁頭。我希望這本書能讓我理解“為什麼”會這樣,而不是僅僅知道“是什麼”。畢竟,隻有理解瞭原理,纔能更好地進行開發和優化。我個人有個習慣,就是邊讀邊做筆記,然後嘗試去復現書中的一些例子,看看能不能跑起來,能不能達到預期的效果。所以,對於這本書,我非常期待它能給我帶來一些能實際操作的靈感。
評分這本書的封麵設計很耐看,沒有那種浮誇的廣告風格,給人的感覺就是那種“乾貨滿滿”的書。我之所以會選擇這本書,是因為我總感覺自己在編程時,就像是在使用一個被封裝好的“黑盒子”,我能調用各種API,但對底層的原理卻知之甚少。尤其是在處理一些復雜的並發場景或者內存相關的問題時,常常會感到力不從心。聽說這本書能夠從編程者的角度去觀察和理解操作係統,我對此深感好奇。我希望能通過這本書,瞭解進程和綫程之間是如何切換的,內存是如何分配和迴收的,以及文件係統是如何工作的。如果書中有提供一些實用的工具或者方法,能夠讓我直接“看到”操作係統的內部活動,那就太棒瞭。我希望這本書能夠幫助我打破對操作係統的“盲區”,讓我能夠更自信、更深入地去進行軟件開發。期待它能為我帶來一些全新的視角和實用的技巧。
評分拿到這本書,首先映入眼簾的是它那簡潔而又不失專業的封麵設計。我一直認為,好的技術書籍,外觀往往能傳遞齣一種嚴謹和可靠的信號。我之前在學習編程的過程中,經常會遇到一些“黑盒”問題,比如程序為什麼會突然變得很慢,或者為什麼會發生內存泄漏,這些問題往往都指嚮瞭操作係統的深層機製,而我之前對這方麵的瞭解可以說是一片空白。這本書吸引我的地方在於它強調“編程觀察”,這個詞讓我覺得它不是一本純理論的書籍,而是鼓勵讀者去動手實踐,去驗證理論。我個人非常喜歡這種將理論與實踐相結閤的學習方式。我期待書中能夠有詳細的步驟和清晰的圖示,帶領我一步一步地去理解操作係統的運作原理。同時,我也希望書中能包含一些關於調試和性能優化的技巧,這對於我這個階段的學習者來說,會非常有幫助。能夠通過這本書,建立起對操作係統更清晰、更係統的認知,從而在未來的編程道路上少走彎路,這是我最大的期望。
評分這本書的裝幀質量相當不錯,紙張的觸感也很好,拿到手裏就覺得是本值得細細品讀的書。我一直以來都對計算機的底層原理充滿好奇,尤其是操作係統這個核心組件,感覺它就像是整個計算機世界的“管傢”,處理著各種各樣復雜的任務。我之前讀過一些操作係統的教科書,但總覺得它們過於偏重理論,對於一個像我這樣的開發者來說,有些難以與實際的編程聯係起來。這本書的“編程觀察”這個名字,正是我所需要的。我期待它能夠提供一些更加貼近實際開發場景的視角,讓我能夠理解代碼是如何在操作係統的調度下運行的,如何與硬件進行交互的。我希望能學到一些能夠幫助我寫齣更高效、更穩定代碼的知識。比如,在並發編程中,如何更好地利用操作係統的特性來避免死鎖和競態條件,或者在內存管理方麵,如何寫齣更節省內存的代碼。總之,我希望這本書能成為我從一個“代碼使用者”嚮一個“理解原理的開發者”轉變的重要橋梁。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有