前言:
在計算機中cpu就像一座工廠,這個工廠里面有許多的車間,但是假如工廠的電力有限,一次只能供給一個車間使用,也就是說當一個車間在進行工作的時候,其他車間是不能工作的(單個cpu只能運行一個任務),進程就想是車間,它代表一個cpu所能處理的單個任務。任一時刻,cpu總是運行一個進程,其他進程處于非運行狀態。同時在一個車間里面,還有很多工人,他們協同去完成一個任務。線程就好比一個車間里面的工人。一個進程中可以有多個線程。車間的空間是共享的,比如許多房間允許工人進出,這象征了一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。
但是因為不同的房間大小不一樣,有些地方只能容納一個人,比如廁所,里面有人其他人就不能進出,只能等前面人出來了,后面的人才能進去,解決辦法就是,在門口上加一把鎖,前面的人在使用廁所的時候,把門鎖上,不允許其他的人來使用,后面的人看到了上鎖就自動排隊,當使用完了之后,把鎖打開,后門的人才能進去這叫“互斥鎖”(后面會詳細說明),防止多個線程同時讀取同一塊內存區域。
但是又有些地方能容納n個人(n>1),比如廚房,這時候的解決辦法就是在門口掛n把鎖,每進去一個人,就拿鑰匙關閉一把鎖,出來時,就把鑰匙放回原處,當鑰匙空了,后面的人就排隊等。這種做法叫“信號量”,用來保證多個線程之間不會互相沖突。
進程:
1.進程的含義:
操作系統中的重要概念:一個運行起來的程序。
定義:進程是一個具有一定獨立功能的程序在一個數據集合依次動態執行的過程。進程是一個正在執行的程序實例,其中涉及到程序計數器,寄存器和程序變量的參與(在cpu上)。
2.進程的特征:
1.進程是依賴于程序運行而存在的,進程是動態的,而程序是靜態的。
2.進程是操作系統進行資源分配和調度的一個獨立單位。
3.每個進程都有獨立的地址空間,包括代碼區,數據區,堆棧區。進程之間的地址空間隔離的,互不影響
3.在操作系統的視角里,如何管理這么多的進程呢?
1.對進程進行描述:
我們可以用結構體,描述出進程的核心屬性(進程的狀態,進程的優先級,進程的上下文,進程的記賬信息)
進程控制塊(PCB):非常大的結構體,有很多的屬性。
2.將多個進程組織起來:
比如:可以使用鏈表一樣的形式(不一定是鏈表),把多個PCB串到一起。
1)創建一個新的進程
1.創建一個PCB,初始化PCB中的各個屬性。
2.再把PCB加到鏈表上
2)銷毀一個進程:
把這個進程的PCB在鏈表中找到,并從鏈表中刪除。
3)查看進程列表:
遍歷鏈表,取出鏈表中的每一個元素,把里面的關鍵元素顯示到屏
單任務和多任務:
在早期的計算機中,是“單任務”操作系統:
同一時刻,只允許一個進程,要想運行下一個進程,就要結束上一個進程。
多任務系統:(在多核處理器前,多任務系統就有了)
即使cpu只有一個核心,也能“同時”運行多個進程。這里有一個新的概念:分時復用。
*分時復用:
分時復用:把一個單位時間,分成很多份
第一份時間運行進程1的指令
第二份時間運行進程2的指令
這里的指令是前面提到的PCB中的內存指針(需要知道進程執行到哪了)
因為cpu運行速度足夠快,上述的切換過程,也會很快,會超出我們人類的反應時間,所以我們看起來這些進程是“同時執行”的(但是如果進程也很多,就會增大cpu的消耗資源,就會出現卡頓的情況)
并發執行:
我們把單個cpu核心,按照分時復用,執行多個進程,這樣的方式,稱為“并發執行”。
人看起來是同時執行的,微觀上,其實是一個cpu在串行執行,切換很快。
但是如今cpu中,并不只有一個核心,而是有多個核心,所以不同的核心,在不用分時復用的情況下,也能同時執行多個不同的進程
我們把多個cpu核心,同時執行多個不同進程的這樣方式,稱為“并行執行”也是“同時執行”。
但在cpu中,執行進程的時候,并發和并行是同時進行的。既有并發執行也有并行執行,統稱為“并發”
1.PCB中的一些關鍵要點:
1.Pid(進程id):進程的身份標識符。
2.內存指針:進程就需要知道執行的指令在哪,指令依賴的數據在哪。
3.文件描述符表:進程運行過程中,很多時候,需要和一個硬盤這個硬件設備進行交互,硬盤上的數據就是以文件形式來組織的。(進程每一次打開一個文件,就會把這個文件的信息保存到文件描述符表中)
2.PCB進一步屬性:
4.進程的狀態
5.進程的優先級
6.進程的上下文
7.進程的記賬信息
4.進程的狀態:
進程狀態有兩種:1.就緒狀態,2.阻塞狀態
1.就緒狀態:隨叫隨到,此時進程隨時都能到cpu上進行執行(不區分就緒和執行,都是就緒)
2.阻塞狀態:進程當前不適合當cpu去執行
5.進程的優先級:
在很多進程中,它們能夠到cpu上面執行的機會并不是均等的。有的進程優先級會更高一些,吃的資源就會更多。
6.進程的上下文:
因為進程在cpu執行的時候是“并發執行”。所以進程在調度的時候,一個進程執行一會,會失去cpu資源,過一段時間該進程還會回到cpu上去執行。
但是有了進程的上下文,就會沿著上次執行到的狀態,繼續往下執行(非重頭開始執行)
進程在cpu中運行的過程中:
cpu上的各種寄存器,就表示了當前進程運行的“中間狀態”
保存上下文:將cpu中的這些寄存器中的值保存在內存中(PCB對應的屬性中)
恢復上下文:把PCB剛才保存的屬性,填回到對應的cpu寄存器中。
7.進程的記賬信息:
進程的記賬信息(統計功能):統計每個進程都在cpu中運行了多久。
當發現一個進程很長時間沒有吃到cpu資源了,就會給這個進程傾斜一些資源。
進程調度:
1.進程調度主要是決定將CPU資源分配給哪個進程使用。當系統中有多個進程處于就緒狀態情況下(已經準備好運行,只是等待CPU資源),進程調度器會按照一定算法,來選擇一個進程在CPU上運行。
2.每個進程在創建時都會生成對應一個PCB,PCB是進程調度器的基礎,通過管理和控制進程的PCB,操作系統能夠對進程進程調度,合理利用CPU資源,提高系統性能。
3.后面即將提到的線程調度也是如此。