1.什么是管理?
那在還沒有學習進程之前,就問大家,操作系統是怎么管理進行進程管理的呢?
很簡單,先把進程描述起來,再把進程組織起來!
我們拿大學為例子
- 最典型的管理者——校長
- 最典型的被管理者——學生
1.我們平時見得到校長嗎?見不到——管理者和被管理者是不需要見面的
2. 這個就引出一個新的問題,管理者在不見被管理者的情況下,如何做好的管理?
- 我們在學校就清楚,我們考試考了多少分,曠了多少節課,個人信息,校長想看都能看到
- 就算校長來見我們,也是為了獲取我們更多的信息
- 所以只要校長有足夠多的我們的信息,不見面都可以對我們進行有效的管理
- 管理的本質就是:通過對數據的管理,達到對人的管理
3.管理者和被管理者面都不見,管理者怎么拿到被管理者的數據呢?
- ?我們還是拿校長和學生為例
- 校長是通過老師,輔導員來獲取學生的數據
4.拿老師和輔導員是不是管理者?
- 不是,因為老師和輔導員只是在執行他們該做的東西,所以他們不是真正的管理者
- 他們更多的是執行者
- 校長相當于操作系統,老師,輔導員相當于驅動程序,學生相當于被管理的軟硬件資源
- 這樣子就理解了操作系統怎么管理底層的軟硬件資源了
5.操作系統怎么管理軟硬件資源?——先描述,后組織
- 操作系統只需要獲取對應的軟硬件資源的狀態數據即可,獲取狀態數據的這個過程是通過驅動程序來執行的
- 雖然每個學生的信息都不同,但是他們都有下面這些屬性——電話,姓名,身高,體重,成績,籍貫......
- 校長可以通過一個結構體來記錄這些屬性,這樣子學生的屬性不就被描述起來了嗎!!!——這個有點像面向對象編程里的抽象啊
struct student { char name[20]; int number[20]; ... struct student*next; };
- 這樣子我們就可以使用一個結構體對象來記錄一個學生的信息,每個學生都帶有一個指向下一個學生的結構體指針,這樣子就很好管理了
- 這樣子校長對學生的管理工作就變成了對鏈表的增刪查改
- 校長找成績最高的同學,只需要不斷遍歷鏈表即可
- 上面這個把學生描述成結構體的過程叫做描述的過程
- 將每個學生結構體通過結構體指針鏈接成一條鏈表的過程叫做組織的過程
我們的軟硬件資源被操作系統管理,操作系統通過軟硬件的數據對它進行管理,可是軟硬件資源的數據太大,那么操作系統很難做管理
但是每一種設備都有共同的屬性,我們描述清楚設備的屬性,然后通過一定方法組織起來
這樣子,操作系統對軟硬件的管理就變成了對數據結構的管理?
管理的核心理念
- 操作系統管理軟硬件資源時,必須先描述起來,再組織?
- 在操作系統中,我們管理對象,最終都可以轉變為對某種數據結構的增刪查改——這個一般叫建模
描述事物的方法:c語言的struct,c++的類等
組織方式:依賴于某種數據結構
這個咋這么像面向對象編程的抽象!!!c++的類,STL容器!!!這個直接給了我們提供了這樣一種描述事物的方式,這樣子就能完成對事物的統一管理
理解了管理的概念,我們就會知道
- 操作系統中注定存在大量的數據結構
linux操作系統是c語言寫的,c語言只能用結構體來描述對象,所以linux只能用struct來描述對象?
2.c/c++庫函數調用和系統調用的關系
?我們用c語言編寫了一個程序,在屏幕打印一個hello world,但是在但是屏幕是硬件,硬件是受操作系統管理,操作系統不信息任何人,所以操作系統肯定封裝了一個c語言函數調用接口
所以他們是上下層的調用和被調用的關系,庫函數在上,系統調用在下
3.進程
- 進程:一個已經加載到內存的程序
- 進程:正在運行的程序
- 進程:任務
?我們可以查看linux的進程
widows里面也有進程
事實上
進程就是內核PCB數據結構對象+你自己的代碼和數據?
3.1.PCB?
我們知道一個操作系統可以同時進行多個進程
?
程序要運行的話,就得先把相關數據加載到內存中,等待cpu運行產生進程,那么加載進內存該如何管理呢?操作系統需要直接面向加載到內存中的代碼嘛?
答案是不需要。
我們可以先把進程類比上面的學生,先描述進程,再把它們組織起來
任何一個進程,在加載到內存的時候,形成真正的進程的時候,操作系統,要先創建描述進程的結構體對象——PCB(process control block),也就是進程控制塊
3.1.1.理解PCB的本質
?人是怎么樣辨別認識一個事物或者對象?
- 都是通過屬性認識的
舉個例子,叫你自我介紹,你基本都是在講你的屬性——名字,興趣,才能,成就,籍貫等等
當屬性的集合夠多的時候,你就能知道這個對應的是什么了
比如,它是一個人,他是中國最頂級的動作明星,他是男生,他演過《十二生肖》
我們就很容易得知這個人就是成龍
同樣的我們描述進程,就是把進程足夠多的屬性描述起來,多到只有一個進程與之匹配,那么我們就能將這堆足夠多的屬性集合來描述進程,這個集合就是PCB,linux操作系統是c語言寫的,c語言只能用結構體來描述對象,所以linux只能用struct來描述對象,所以PCB就是一個結構體
這個也是面向對象編程的核心理念
3.1.2.PCB的歷程/作用
- 進程創建時,操作系統先為它新建一個PCB,該結構之后常駐內存,任意時刻都可以存取,并在進程結束時刪除。PCB是進程實體的一部分,是進程存在的唯一標志。
- 進程執行時,系統通過其 PCB 了解進程的現行狀態信息,以便操作系統對其進行控制和管理;進程結束時,系統收回其PCB,該進程隨之消亡。
3.在進程的整個生命期中,系統總是通過PCB對進程進行控制的,亦即系統唯有通過進程的PCB才能感知到該進程的存在。
- 當操作系統欲調度某進程運行時,要從該進程的 PCB 中查出其現行狀態及優先級;
- 在調度到某進程后,要根據其PCB 中所保存的處理機狀態信息,設置該進程恢復運行的現場,并根據其PCB中的程序和數據的內存始址,找到其程序和數據;
- 進程在運行過程中,當需要和與之合作的進程實現同步、通信或訪問文件時,也需要訪問 PCB;
- 當進程由于某種原因而暫停運行時,又需將其斷點的處理機環境保存在PCB中。
?
3.2.PCB的組織方式
在一個系統中,通常存在著許多進程的PCB,有的處于就緒態,有的處于阻塞態,而且阻塞的原因各不相同。操作系統怎么管理這么多進程呢?
為了方便進程的調度和管理,需要將各進程的PCB用適當的方法組織起來。
這樣子對進程的管理就變成了對數據結構的增刪查改
目前有下面幾種組織方式
- 1.線性表方式:不論進程的狀態如何,將所有的PCB連續地存放在內存的系統區。這種方式適用于系統中進程數目不多的情況,不適合頻繁的進程調度
- 2.索引表方式:該方式是線性表方式的改進,系統按照進程的狀態分別建立就緒索引表、阻塞索引表等。其中進程阻塞可能由于I/O請求、申請緩沖區失敗、等待解鎖、獲取數據失敗等原因造成,將其組成一張表忽略了進程的優先級,不利于進程的喚醒。
- 3.鏈接表方式:系統按照進程的狀態將進程的PCB組成隊列,從而形成就緒隊列、阻塞隊列、運行隊列等。
3.3程序段
程序段就是能被進程調度程序調度到CPU執行的程序代碼段。
3.4數據段
一個進程的數據段,可以是進程對應程序加工處理的原始數據,也可以是程序執行時候產生的中間或最終結果。
?4.Linux是怎么取管理進程的?
- 課本上稱之為PCB(process control block),Linux操作系統下的PCB是:?task_struct?。
- task_struct是Linux內核的一種數據結構,它會被裝載到RAM(內存)?里并且包含著進程的信息。
4.1.task_ struct內容分類
實際上這個結構體的成員非常多,我們只列舉最主要的
- 標示符: 描述本進程的唯一標示符,用來區別其他進程。
- 狀態: 任務狀態,退出代碼,退出信號等。
- 優先級: 相對于其他進程的優先級。
- 程序計數器: 程序中即將被執行的下一條指令的地址。
- 內存指針: 包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針
- 上下文數據: 進程執行時處理器的寄存器中的數據[休學例子,要加圖CPU,寄存器]。
- I/O狀態信息: 包括顯示的I/O請求,分配給進程的I/O設備和被進程使用的文件列表。
- 記賬信息: 可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。
- 其他信息
4.3.組織進程
可以在內核源代碼里找到它。
所有運行在系統里的進程都以task_struct雙向鏈表的形式存在內核里。
4.4.查看進程
(1)進程信息可以通過 /porc系統文件夾查看,具體查看那個進程,需要得知其標識符(PID)。
看到以下有很多的數字還是藍標的,數字就是PID,藍標說明這是個目錄,
?比如接下來我想看看PID為1的進程信息。
這個信息查看的不夠詳細,所以可以帶上 -l選項查看詳細信息?
(2)用ps工具來查看
關于ps工具,咱們只需要記住,只查看自己的bash進程選項為?-l
,查看系統所有運行的進程選項為aux
,這個不加-
。
這里可以看到,標識符PID展示出來了,還有一個PPID,這是父進程的PID,我們驚奇的發現,下面的ps指令的PPID是上面bash的PID。
命令行上的命令的父進程基本上都是bash。?