1. 程式人生 > >第一次作業:關於Linux進程模型的分析

第一次作業:關於Linux進程模型的分析

inux .html 符號 搶占 等待 資料 除了 idl aml

1、前言

本文主要基於Linux Kernel 2.6.32 的源碼,對Linux的進程模型進行分析,大致可以概括為如下內容:

1.前言

2.進程介紹

3.操作系統如何組織進程

4.進程狀態的轉化

5.進程的調度

6.參考資料


2、進程介紹

2.1 進程的概念

  進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

2.2 進程的查看

  2.2.1 Windows查看進程

    在Windows系統下可用CTRL+ALT+DEL組合鍵打開任務管理器對進程進行查看:

    技術分享圖片

  2.2.2 Linux下查看進程

    Linux下可以在終端用ps命令來查看進程:

    技術分享圖片


3、操作系統如何組織進程

3.1 進程控制塊(PCB)

  Linux系統中主要的活動實體就是進程。

  每個進程執行一段獨立的程序並且在進程初始化的時候擁有一個獨立的控制線程。換句話說,每一個進程都擁有一個獨立的程序計數器,用這個這個程序計數器可以追蹤下一條將要被執行的指令。

  所有的進程都被放在一個叫做進程控制塊(PCB),的數據結構中,可以理解為進程屬性的集合,該控制塊由操作系統創建和管理。每個進程在內核中都有一個進程控制塊來維護進程相關的信息,Linux內核的進程控制塊是(task_struct)結構體。Linux通過task_struct(PCB)結構體來描述一個進程的所有信息,結構體被定義在include/linux/sched.h中。

進程創建時,操作系統就新建一個PCB結構,它之後就常駐內存,任一時刻可以存取, 在進程結束時刪除。PCB是進程實體的一部分,操作系統通過PCB表來管理和控制進程,是進程存在的唯一標誌。

3.2 進程標識符(PID)

  進程標識符在task_struct結構體下定義:

pid_t pid;      //內核中用以標識進程的id
pid_t tgid;     //用來實現線程機制


struct pid
{
    atomic_t count;
    unsigned int level;

    /* lists of tasks that use this pid */
    struct
hlist_head tasks[PIDTYPE_MAX]; struct rcu_head rcu; struct upid numbers[1]; };

  每個進程都有一個唯一的標識符(PID),內核通過這個標識符來識別不同的進程,同時,進程標識符(PID)也是內核提供給用戶程序的接口,用戶程序通過PID對進程發號施令。PID是32位的無符號整數,它被順序編號:新創建進程的PID通常是前一個進程的PID加1。然而,為了與16位硬件平臺的傳統Linux系統保持兼容,在Linux上允許的最大PID號是32767,當內核在系統中創建第32768個進程時,就必須重新開始使用已閑置的PID號。在64位系統中,PID可擴展到4194303。


4、進程狀態的轉化

4.1 三態模型

一個進程從創建而產生至撤銷而消亡的整個生命周期,可以用一組狀態加以刻劃,根據三態模型,進程的生命周期可分為如下三種進程狀態:
1. 運行態(running):占有處理器正在運行
2. 就緒態(ready):具備運行條件,等待系統分配處理器以便運行
3. 等待態(blocked):不具備運行條件,正在等待某個事件的完成

技術分享圖片

4.2 五態模型

在一個實際的系統裏進程的狀態及其轉換比上節敘述的會復雜一些,例如引入專門的新建態(new)和終止態(exit )

狀態轉換圖如下所示:

技術分享圖片


5、進程的調度

  5.1 linux調度器的演變

  技術分享圖片

  當前的內核支持兩種調度器類(sched_setscheduler系統調用可修改進程的策略):CFS(公平)、RT(實時);5種調度策略:SCHED_NORAML(最常見的策略)、SCHED_BATCH(除了不能搶占外與常規任務一樣,允許任務運行更長時間,更好地使用高速緩存,適合於成批處理的工作)、SCHED_IDLE(它甚至比nice 19還有弱,為了避免優先級反轉使用)和SCHED_RR(循環調度,擁有時間片,結束後放在隊列末)、SCHED_FIFO(沒有時間片,可以運行任意長的時間);其中前面三種策略使用的是cfs調度器類,後面兩種使用rt調度器類。

  5.2 CFS調度器的結構

   第一個是調度實體sched_entity,它代表一個調度單位,在組調度關閉的時候可以把他等同為進程。每一個task_struct中都有一個sched_entity,進程的vruntime和權重都保存在這個結構中。那麽所有的sched_entity怎麽組織在一起呢?紅黑樹。所有的sched_entity以vruntime為key(實際上是以vruntime-min_vruntime為單位,難道是防止溢出?反正結果是一樣的)插入到紅黑樹中,同時緩存樹的最左側 節點,也就是vruntime最小的節點,這樣可以迅速選中vruntime最小的進程。註意只有等待CPU的就緒態進程在這棵樹上,睡眠進程和正在運行的進程都不在樹上。如下圖(來源見參考資料):

技術分享圖片


6、參考資料

1. https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503?fr=aladdin

2. https://baike.baidu.com/item/%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95/3017645?fr=aladdin

3. https://www.cnblogs.com/puputongtong/p/5451210.html

4. https://blog.csdn.net/gatieme/article/details/52067518

  

    

第一次作業:關於Linux進程模型的分析