前言
為什么取這個標題呢?一是進程和線程是作為操作系統里最重要最核心的一部分。二是確實吃冰棍拉冰棍,沒話,強行湊標題和之前的標題差不多字數。
前一章寫了系統調用的過程,算是一個小插曲,這個部分不管在哪里應該都是可以的。
現在的這個系列已經和之前的標題漸行漸遠了,原本是想以之前寫的一個玩具型操作系統FragileOS為主線,但是在看書學習的過程中稍微改了一下方向,已經不是特別關注一個操作系統的實現的完整流程和內部的聯系,更多的是想系統的學習操作系統的各個模塊然后輔以一些代碼,但是不管怎么樣,都是屬於自己在學習操作系統的過程的一個記錄
進入正題
進程
進程的出現最最主要的原因就是想要提高CPU的利用率
進程的定義
- 正在執行的程序
- 正在計算機上執行的程序實例
- 能夠分配給處理器並由處理器執行的實體
- 一組指令的執行、一個當前狀態和相關的系統資源的集合
多進程的組織
單核CPU在同一時刻只能運行一條指令,所謂的多進程只是指令來回切換的假象,但是因為速度太快,就可以看成是同時進行的。所以在進程切換的時就需要去組織進程的切換
進程控制塊(process control block)
控制進程的切換一個重要的數據結構就是進程控制塊(process control block),是與每個進程相關的還有操作系統用於控制進程的許多屬性的集合
進程控制塊的作用,是使一個在多道程序環境下不能獨立進行的程序(含數據),成為一個能獨立運行的基本單位,一個能與其他進程並發執行的進程。或者說,操作系統是根據PCB來對並發執行的進程進行控制和管理。
一般情況下,PCB中包含以下內容:
- 進程標識符(內部,外部)
- 處理機的信息(通用寄存器,指令計數器,PSW,用戶的棧指針)。
- 進程調度信息(進程狀態,進程的優先級,進程調度所需的其它信息,事件)
- 進程控制信息(程序的數據的地址,資源清單,進程同步和通信機制,鏈接指針)
進程的五狀態模型
進程的調度
一般來說,可能讓進程發生切換有這幾種事件:
但是隨着PC的發展,這種從兩方面情況發生了變化。第一,大多數時間都只有一個活躍的進程。畢竟一般來說,你在使用Word編輯文件時,不太可能還同時讓系統在后台編譯程序。這樣的情況下,調度器其實不需要做很多工作來決定到底運行哪個進程——Word幾乎就是唯一的選擇。第二,計算機的速度越來越快,以至於CPU可能已經不再那么稀缺了。對於很多PC的程序來說,其限制主要在於用戶能進行輸入的比例,而不是CPU能夠處理的比例。甚至就算是兩個程序真的同時進行,其實先調度哪個運行也無傷大雅,例如,一個Word和一個Excel同時在運行,先調度哪個都行,因為用戶可能同時在等待這兩個程序的輸出。
但是對於網絡服務器來說,這種情況又不一樣了。非常多的程序競爭CPU資源,因此,調度又變得非常重要了。舉例來說,調度器需要決定到底是讓日常統計進程運行還是讓響應用戶請求的進程運行。
調度器除了需要考慮選擇哪個進程運行,還需要考慮到系統的性能。畢竟,進程之間的切換是開銷很大的,這涉及到從用戶態到內核狀態的切換,進程狀態的保存、恢復等等操作。
進程的同步和合作
內存管理
在進程進行來回切換如何保證當前進程的運行不會影響其它進程的運行,比如對於一個內存進程的讀寫,就要保證不能越界
所以就需要一個機制來把進程之間的地址空間隔離開
進程的同步
不同進程間存在着不同的相互制約關系。為了協調進程之間的相互制約關系,達到資源共享和進程協作,避免進程之間的沖突,就需要進程同步的概念。
多個進程可以共享系統中的各種資源,但其中許多資源一次只能為一個進程所使用,我們把一次只允許一個進程使用的資源成為臨界資源。
對臨界資源的訪問,必須互斥的進行。每個進程中,訪問臨界資源的那段代碼成為臨界區。
為了保證臨界資源的正確使用,可以把臨界資源的訪問過程分為四個部分。
- 進入區。為了進入臨界區使用臨界資源,在進入去要檢查可否進入臨界區。
- 臨界區。進程中訪問臨界資源的那段代碼。
- 退出區。將正在訪問臨界區的標志清除。
- 剩余區。代碼中的其余部分。
一般實現進程的同步有這幾種方法:
- 提過硬件提供的實現
- 信號量
- 管程
線程
進程是資源分配的最小單位,線程是CPU調度的最小單位
在進程的切換時還需要對內存資源的一個切換,但是線程則不需要對資源的切換,所以引入是為了減小程序在並發執行時所付出的時空開銷,提高操作系統的並發性能。
用戶級線程和內核級線程
用戶級線程是指不需要內核支持而在用戶程序中實現的線程,內核對線程包一無所知。從內核角度考慮,就是按正常的方式管理,即單線程進程,但是它不能像內核級線程一樣更好的運用多核CPU。
內核級線程建立和銷毀都是由操作系統負責、通過系統調用完成的。在內核的支持下運行,無論是用戶進程的線程,或者是系統進程的線程,他們的創建、撤銷、切換都是依靠內核實現的。
-
試想一下如果沒有內核級線程,當用戶級的一個線程進行到I/O阻塞時,將會導致所有的線程都堵塞,因為以操作系統的層面來看,它們都屬於用一個進程,所以會直接切換進程,其它的線程就得不到執行
-
在多處理器系統中,內核級線程能夠真正的實現並行,能夠執行同一進程內的多個線程
小結
這一篇主要是簡略的總結書上的一些概念,沒有干貨,在后面進行代碼實現的時候會再深入的去看。下一篇可能會去看Linux0.12在進程上面的實現。