操作系統筆記-2-進程(上)

進程是什麼

大部分資料都描述進程是資源分配的基本單位,但是這個描述並不能很好的描述進程的特性;另一個種描述是進程是對運行程序的一種抽象,我更贊同這種說法,第一它說明進程和程序有關係,第二它說明必須是運行中的程序。我們看一下Linux下的進程。

進程概念

進程內存佈局

進程的內存佈局被劃分爲多個分段,具體如圖
在這裏插入圖片描述

  • text分段:存放可執行代碼,也就是程序的代碼
  • data分段:存放全局變量
  • heap分段:程序運行期間動態分配的內存
  • stack分段:方法調用的臨時內存(比如方法參數、返回地址和臨時變量)

一個進程內存佈局例子
在這裏插入圖片描述

進程狀態

進程五狀態變化圖
在這裏插入圖片描述

  • new:進程new狀態,創建之後就會進入ready狀態
  • ready:當ready狀態的線程被調度器選擇時進入running狀態,而被中斷時又會重新進入ready狀態
  • running:處於ready狀態的進程被調度器調度時會進入running狀態執行,此時進程持有cpu執行權
  • waiting:當runing狀態的進程I/O或事件等待時,會進入waiting狀態,當I/O或事件完成時會進入ready狀態等待調度器調度
  • terminated:當處於running狀態的進程運行退出時會進入終止狀態
進程控制塊
  • 進程控制塊定義:在多道程序系統中,多個程序併發執行,也就是多個進程併發執行,依賴調度器調度進程獲得CPU執行權。這就需要操作系統維護各個進程的信息,比如說當前運行的線程被中斷,那下一次要調度時肯定需要知道中斷前的狀態(比如代碼執行到哪一行,寄存器的值等)。這些信息都被存在進程表中,每個進程對應一個表項,這些表項被稱爲進程控制塊
  • 進程控制塊結構(PCB)
    在這裏插入圖片描述
    主要分爲進程管理、內存管理以及進程打開的文件管理三塊,有幾個重點關注的屬性
    1. Process state:也就是上邊介紹的進程的五種狀態new, ready, running, waiting, halted等
    2. Program counter:指向進程下一條執行的指令地址
    3. CPU registers:cpu寄存器狀態,用於被重新調度時,恢復cpu寄存器使進程正確的從上一次被中斷處繼續運行
    4. 其他信息在後面的筆記中介紹
線程

在支持線程的系統中,每個進程至少擁有一個線程,此時系統調度的便是線程而不是進程,進程成爲線程的容器,PCB中也會額外的記錄線程信息。現代的進程一般都擁有多個線程,這樣可以提升程序的性能,因爲在多核處理器上,多個線程可以並行執行。對於線程的,下一篇筆記中會詳解介紹。注意線程是不能脫離進程獨立存在的,因爲操作系統不會爲線程分配系統資源,因此線程要依附進程存在。

進程調度

線程調度是爲了充分利用CPU和程序併發執行,因爲當一個進程等待I/O或某個事件時,CPU不能做任何事,這個時候就可以調度其他進程執行。那進程是如何調度呢?下面來分析

調度隊列

一個進程創建完成時,通常是進入就緒隊列,就緒隊列是等待調度獲得CPU執行權的一個鏈表隊列,如下圖所示,鏈表頭指向第一個PCB。
在這裏插入圖片描述

當然也有其他隊列,比如wait隊列,wait隊列中的進程通常都在等待一個確定的事件,等到事件發生時,它們將會加入就緒隊列中。一個進程cpu->wait隊列->ready隊列的轉變如下圖所示
在這裏插入圖片描述

CPU調度

這一部分在後邊的筆記中做詳細介紹

上下文切換
  • 上下文:上下文指的是進程運行時的狀態,這些狀態包括寄存器值、進程狀態和內存管理信息,都存儲在上邊介紹的PCB中
  • 上下文切換:指的是,CPU在通過調度由執行A進程換成B進程時,需要將A進程的狀態保存到A的PCB中,然後從B的PCB中加載上下文信息,這是一個純開銷的操作,因爲此時CPU不能做其他有用的工作,其速度取決於內存的速度、需要複製的寄存器數和指令。整個過程的示意圖如下
    在這裏插入圖片描述

進程間通信(IPC)

進程通信的必要性
  • 信息共享:如果多個應用都對某個信息有興趣,必須對信息的訪問作併發控制
  • 加速計算:把一個任務拆分成多個子任務,子任務可以並行計算
  • 模塊化:用不同的進程或線程劃分系統功能獨立運行,使得系統具有模塊化
IPC方式-共享內存
  • 共享內存結構
    在這裏插入圖片描述
  • 共享內存優點
    速度快:相比消息傳遞,共享內存只需要在創建共享內存時需要系統調用,消息傳遞每次都需要系統調用
  • 共享內存缺點
    實現比消息傳遞複雜,需要避免衝突,分佈式共享內存實現複雜
  • 共享內存的併發(在後續的併發筆記中介紹)
IPC方式-消息傳遞
  • 消息傳遞結構
    在這裏插入圖片描述
  • 消息傳遞的優點
    1. 可以用於分佈式環境
    2. 不需要相同的內存地址空間
  • 消息傳遞-命名
    1. 直接相連:當兩個進程需要通信時,如果建立直接link,則需要互相精確知道進程
    2. 間接相連:進程不直接相連而是通過額外的結構,比如mailboxes或ports
  • 消息傳遞-通信方式
    1. 阻塞:如果阻塞的方式,那麼send方法將阻塞直到被其他進程receive(直接相連)或者發送到mailboxes,receive方法將阻塞直到接收到消息
    2. 非阻塞:進程在調用send方法時不阻塞,receive方法也是直接返回消息或者null
  • 消息傳遞-queue緩存區
    1. Zero容量:queue沒有緩衝區,因此sender將阻塞直到recipient接收消息
    2. Bounded:有界隊列,當queue滿時,sender阻塞直到queue有空間容納消息
    3. Unbounded:無界隊列,可以容納任意數量的消息

總結

進程是操作系統中非常重要的一部分,一篇筆記是不可能記錄得了進程的所有內容,這裏忽略了很多細節,比如進程的調度算法,進程內存不足時內存置換算法,進程的同步方式,這些都會在後邊詳細介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章