運維工程師技能樹-基礎知識之操作系統篇(進程管理)

運維工程師所需基礎技能大體包含但不限於以下

  1. 操作系統
  2. 網絡
  3. 常用開源組件
  4. 數據庫
  5. 多語言編程技能
  6. 基礎安全

越是複雜的場景,對於問題的分析能力以及基本功的要求越高,因此需要深入理解和熟練掌握。

操作系統:

  1. 進程管理
  • 核心數據結構-進程表

       首先進程是什麼,進程是已經“跑起來”的程序,基本所有操作系統的教科書都會對進程和程序的區別大講特講。執行的腳本,運行的服務等都是進程。操作系統會爲每個進程創建一個對象,每個進程對象分配一個進程id,叫做pid,相當於每個進程的身份證號,是進程的唯一標識。這個對象在實現上是一個結構體,這個結構體囊括了所有該進程所需要的所有屬性和資源,包括程序運行的各個寄存器值,狀態,內存指針,打開的文件描述符等等。當你執行一個程序時,操作系統會初始化一個這樣的進程對象,然後爲其分配所需的資源,並將這個進程對象作爲一個表項掛到進程表上。

        進程表是一個鏈表,每個進程是這個鏈表上的一個結點,但是我們知道鏈表是不支持索引操作的,因此如果我們需要通過pid來查進程的信息就需要遍歷整個進程表,效率比較低。爲了解決這個問題,內核實現上爲pid到進程對象又增加了一張hash表,這樣就可以在常數時間內通過pid找到具體的進程了。這個設計很多人會迷惑,既然通過pid查找進程對象是一個常規操作,爲什麼在數據結構的選擇上,進程表不採用數組而是採用鏈表+hash表呢?如果採用數組,則數組的長度應該設置爲系統的最大進程數,這個值是非常難以確定的,如果設定太小,則會面臨有時分配不出進程的情況。如果設定的太大,則內存資源又比較浪費,採用鏈表+hash表可以說是解決這個問題比較優雅的方式了。

        在進程對象的查找上除了通過pid索引的方式外,還支持通過親屬關係進行查找的方法,每個進程對象保存了孩子鏈表的指針和兄弟鏈表的指針,每個進程可以通過遍歷孩子鏈表找到自己所有子進程。

       至此,我們已經看到了操作系統對於進程管理的核心數據結構-進程表,進程管理的工作抽象來看就是增刪改查這個核心進程表,當然這只是一種便於理解但卻不夠嚴謹的解釋,事實上的工作和細節非常之多。這裏的介紹略過了很多操作系統設計上的細節,比如對於pid,當前的操作系統已經不是簡單的在進程對象中以一個數字來標記,而是通過一個較爲複雜的映射機制,映射出來的。對於pid的分配,內核的做法也與我們平時編程的慣用做法不相同,考慮到內存資源的利用,操作系統的pid分配器是基於位圖來實現的。不過這些知識對於主幹知識來講,都算是支線,在搭建起基本的概念框架後再進行局部填充,這裏不去進一步討論,避免過早陷入細節。

  • 進程調度

        什麼是進程調度,爲什麼要進程調度?進程調度就是內核決定把CPU拿給哪個進程使用的決策過程,由於CPU總是稀缺資源,爲了有序高效的使用CPU,內核需要對它們進行調度。這裏主要從2個方向進行說明,一個是調度的機制,另一個是調度的算法。調度機制說明內核是如何實現調度的,調度算法是說明內核如何計算出下一個可以佔用CPU的進程是誰。

(待續)

 

 

 

 

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