第一次作業:基於Linux進程模型分析
本篇文章主要內容:
- 什麽是進程
- 操作系統是怎麽組織進程的
- 進程狀態如何轉換(給出進程狀態轉換圖)
- 進程是如何調度的
- 談談自己對該操作系統進程模型的看法
一:什麽是進程
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)。 廣義定義:進程是一個具有一定獨立功能的程序關於某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。 比如下圖,是我自己電腦上的一些基本的進程信息:二:操作系統是怎麽組織進程的
Linux通過task_struct
結構體來描述一個進程的所有信息,結構體被定義在 include/linux/sched.h
中。
關於task_struct結構體:
(1)進程的狀態(state) volatile long state,state的可能取值為:
(2)進程的唯一標識(pid)
在Linux系統中,一個線程組中的所有線程使用和該線程組的領頭線程(該組中的第一個輕量級進程)相同的PID,並被存放在tgid成員中。只有線程組的領頭線程的pid成員才會被設置為與tgid相同的值。
(3)進程的標記:
(4)進程之間的親屬關系:
在Linux系統中,所有進程之間都有著直接或間接地聯系,每個進程都有其父進程,也可能有零個或多個子進程。擁有同一父進程的所有進程具有兄弟關系。
real_parent指向其父進程,如果創建它的父進程不再存在,則指向PID為1的init進程。
parent指向其父進程,當它終止時,必須向它的父進程發送信號。它的值通常與 real_parent相同。
children表示鏈表的頭部,鏈表中的所有元素都是它的子進程(進程的子進程鏈表)。
sibling用於把當前進程插入到兄弟鏈表中(進程的兄弟鏈表)。
group_leader指向其所在進程組的領頭進程。
(5)進程調度信息:
三:進程狀態如何轉換(給出進程狀態轉換圖)
各種狀態之間是如何進行互相轉換的關系圖:
四:進程是如何調度的
Linust通過schedule函數實現調度,目的是為了在運行隊列中找到一個進程,把CPU分配給它。
關於schedule()函數的源代碼:
五:對操作系統模型的看法
在眾多的操作系統都有他們相同之處,也有不同之處。在Linux裏,只有進程的概念,變量並不共享,由程序員來顯式地指定要共享的數據,使程序變得更清晰與安全。
六:參考文獻:
https://blog.csdn.net/titer1/article/details/45134625
https://blog.csdn.net/qq_29503203/article/details/54618275
第一次作業:基於Linux進程模型分析