最近又看了下《計算機作業系統設計與實現 第三版》 寫一份總結給自己當做對作業系統的掃盲吧。
以下內容純粹是自己個人的理解與整理。
計算機的組成
- 首先最底層是硬體裝置(主機板 硬碟 電子元件 記憶體條 CPU 顯示卡 等等) 至於最底層的硬體是怎麼工作的就不知道了(因為牽扯到電氣工程學 想想老愛因斯坦也折騰過 這些玩意一輩子估計也學不完)
- 硬體裝置上是微結構體(比如CPU裡的暫存器)就是這些東西接受電氣訊號來操作硬體的
- 在上面就是機器語言 彙編一類的吧 用來傳送資訊操控硬體
- 在機器語言上面就是作業系統(Windows.Linux等)作業系統其實就是封裝了對底層硬體的操作
留出一些基本的介面給外面 好讓程式猿這群生物來做開發設計 不用老是考慮硬體的東東 不然累死他們了啊 - 作業系統上面是系統應用 (比如shell 編譯器等等)這些都是不可更改的
- 在上面就是我們用的使用者級應用了(比如QQ 網易雲音樂..)這些都是為了解決某些實際 或者滿足某些需求而設計的應用
作業系統的概念
- 作業系統提供了一系列服務和介面 讓使用者程式可以很方便的呼叫底層硬體(這些介面服務稱為系統呼叫 System Call)
- 作業系統還提供資源管理的功能 包括分配磁碟 跟蹤記錄磁碟塊等 不然怎麼保證每次操作的資料完整和可靠
程式的概念
程式簡單點講就是一個正在執行的程式 他會有一塊記憶體地址 他可以操作這塊記憶體讀寫等 這塊記憶體中存有他的程式、程式資料、堆疊
當程式被掛起後 在恢復的時候 要能接著他上次掛起時候的狀態繼續執行 才能保證整個程式的完成 是怎麼做的呢?作業系統中有一張表 稱為程式表(process table)這個表裡記錄了每個程式的資料外的所有資訊(程式資料是在他佔用的記憶體裡啊!!)
被掛起的程式主要有2個資訊
- 程式的地址空間 稱為 核心映像 core image
- 程式表項 包含暫存器值和其他資訊
一個程式可以建立一個或多個其他程式(稱為子程式) 這些子程式又可以建立他們自己的子程式 這樣就行程了一棵樹 如下圖
有時這些程式間需要互相通訊訪問資料等 這種通訊稱為 程式間通訊 interprocess communication
檔案
- 作業系統有一個主要功能就是遮蔽磁碟和其他IO操作的細節
給程式猿提供一個簡潔與裝置無關的檔案模型
很顯然系統需要幫我們處理很多
這時設計的系統呼叫有 建立檔案 刪除檔案 讀取檔案 寫入檔案等
在讀一個檔案前還需要開啟檔案 在操作完後還需要關閉他這些都需要相應的系統呼叫來完成操作 - 當我們需要使用系統呼叫來建立一個目錄以及把某一個檔案放到一個指定目錄 或者刪除一個指定目錄的檔案這樣就得到一個層次結構也就是檔案系統
程式和檔案樹的區別
- 程式樹的層次結構一般不會太深 3層已經很多了,而檔案樹的層次可以很深6層+都有
- 程式間的層次結構是短暫的一般幾分鐘 執行完就關閉了,而檔案樹的層次結構會很久 幾年都可以
- 在所有者和保護方面 程式只有父程式可以訪問控制子程式,而檔案和目錄除了所有者別的使用者也可以訪問
檔案系統
以Minix3系統為例 檔案和目錄的保護機制是有一個11位的二進位制碼來保護的。
保護碼包含三個3位的域 分別來描述其所有者、同組使用者、其他使用者的訪問許可權。
這一個3位域 分別由1位標識讀取許可權 1位標識寫的操作許可權 1位標識執行的許可權
也就是傳說中的rwx
其中x的可以執行許可權一般來講就是可以訪問 可以搜尋之類在對一個檔案程式讀寫的時候 系統需要先開啟他這個時候需要程式訪問許可權的判斷
如果訪問許可權是允許的 這個時候將會返回一個整數 稱為檔案描述符 如果沒有訪問許可權將會返回一個錯誤碼(-1)檔案系統的掛載 對於大多數個人計算機而已都配有一個CD-ROM去東區( 類似光碟機的玩意)
還是以Minix3系統為例 作業系統允許將光碟機上的檔案掛載到主檔案樹上。
在進行mount掛載系統呼叫之前 在硬碟上一個根檔案系統 在CD-Rom上也有一個檔案系統 這2個還沒掛載的時候是互相對立互不干擾的。
在沒有掛載的時候CD-ROM中的檔案也是不能訪問的 (因為沒有路徑啊)。
程式猿可以使用mount系統呼叫吧CD-ROM下的檔案掛載到根檔案系統的任意一個位置 如下圖
這個圖展示了把驅動中的x
和y
掛載到b
目錄下裝置檔案(special file) 裝置檔案的目標是使IO裝置操作起來更類似檔案。
這樣對裝置的讀寫就可以和檔案讀寫呼叫相同的系統呼叫。
裝置檔案分為2類- 一是塊裝置檔案(block special files)
- 一個是字元裝置檔案(character special files)。
裝置檔案描述的是以隨機訪問資料塊為單元的裝置 比如硬碟。
字元裝置檔案是以字元流方式進行操作的檔案 比如印表機等 一般裝置檔案都存在/dev目錄下 比如/dev/lp 就可能是一個印表機管道(pipe) 管道是一種用來連線2個程式的虛擬檔案
比如下圖如果程式A想要和程式B通訊
首先要建立一個管道 然後程式A把資料輸出到管道中 程式B在從管道中把資料讀取出來 這樣就完成了通訊。
一個程式想要判斷他輸出的是普通檔案還是管道需要一個特殊的系統呼叫命令直譯器 shell 他是終端使用者和作業系統之間的 主要介面 shell分為2種
第一種是圖形介面shell 如CDE GNOME KDE XFCE等
第二種是命令列shell 如果bash sh ksh csh等他們都來源最初的
sh
當使用者登入系統(伺服器)的時候 同時將啟動一個shell
他以終端作為標準的輸入輸出 然後顯示一個系統提示符 比如熟悉的美元 $ 符號 標識等待接受一條使用者的命令
這時 比如使用者輸入了date 那麼shell將會建立一個子程式來執行date程式 並等待子程式的執行結束。
當子程式執行結束後會再次顯示系統提示符 等待使用者輸入。透過使用管道可以把一個程式的輸出結果當作另外一個程式的輸入。
比如: cat file1 file2 file3 | sort > /dev/lp 這條命令先呼叫cat程式把3個檔案進行了合併
然後呼叫sort程式把合併結果傳進來進行排序 然後把排序結果重定向到了/dev/lp 這正是印表機的裝置檔案另外還可以在一條命令的最後加上一個 “&” 符號表示不等待程式的執行結束直接顯示系統提示符
可以直接執行別的程式 上一個帶&沒執行結束的程式將當作後臺程式執行
系統呼叫的基本分類
大致分為下面幾個分類的系統呼叫(每一個裡面有很多的呼叫 先了解下!)
- 程式相關係統呼叫
- 訊號相關係統呼叫
- 檔案相關係統呼叫
- 檔案系統相關係統呼叫
- 保護機制相關係統呼叫
- 時間相關係統呼叫
作業系統的結構[結構發展史]
- 整體結構 這個是最開始的設計
- 有一個主程式 用來呼叫被請求的服務例程
- 一組服務例程 用來實現相應的系統呼叫
- 一組工具函式 用來幫助服務例程的實現
- 分層結構 在上面整體結構上做了更加具體的分層 每一層都是在上一層的基礎上擴充套件出來 不用管他上一層的實現
- 虛擬機器
- 外核(ps:這個看的不是很懂 瞭解下好了)
- 客戶端-伺服器 這種就類似我們先的結構了
對於使用者而言他不會關心請求傳送到哪裡的伺服器 是在本地處理還是在某個地方伺服器處理 他只要得到回覆就可以了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結