進程、進程調度、進程狀態、進程與程序、多任務

進程、進程調度、進程狀態、進程與程序、多任務

多任務機制

  • 多任務處理是指用戶可以在同一時間內運行多個應用程序,每個正在執行的應用程序被稱爲一個任務。Linux是一個支持多任務的操作系統,比起單任務系統它的功能增強了許多
  • 多任務操作系統使用某種調度策略支持多個任務併發執行。事實上(單核)處理器在某一時刻只能執行一個任務。每個任務創建時被分配時間片(幾十到上百毫秒),任務執行(佔用CPU)時,時間片遞減。操作系統會在當前任務的時間片用完時調度執行其他任務。由於任務會頻繁地切換執行,因此給用戶多個任務同時運行的感覺。多任務操作系統通常有3個基本概念:任務、進程和線程
  • 任務指的是一個邏輯概念,指由一個軟件完成的活動,或者是爲實現某個目的而進行的一系列操作。通常一個任務是一個程序的一次運行,一個任務包含一個或多個完成獨立功能的子任務,子任務是進程或線程。例如一個殺毒軟件的一次運行是一個任務,目的是保護計算機系統不受各種病毒的侵害。這個任務包含多個獨立功能的子任務,包括實時監控功能、定時查殺功能、防火牆功能等

進程與程序

  • 進程是指一個具有獨立功能的程序在某個數據集合上的一次動態執行過程,它是操作系統進行資源分配和調度的基本單元。一次任務的運行可以激活多個進程,這些進程相互合作來完成該任務的一個最終目標
程序包含了一系列信息的文件,這些信息描述了程序在運行時如何創建一個進程,包括如下
  1. 二進制格式標識:每個程序文件都包含用於描述可執行文件格式的元信息
  2. 機器語言指令:對程序進行編碼
  3. 程序入口地址:標識程序開始執行時的起始指令位置
  4. 數據:程序文件包含的變量初始值和程序使用的字面變量
  5. 符號表及重定位表:描述程序中函數和變量的位置及名稱。這些表有多種用途,其中包含調試和運行時的符號解析
  6. 共享庫和動態鏈接信息:程序文件所包含的一些字段,列出了程序運行時需要使用的共享庫,以及加載共享庫的動態鏈接器的路徑名 7
進程是程序動態執行的過程,具有併發性、動態性、交互性和獨立性
  • 併發性:指系統中多個進程可以同時併發執行,相互之間不受干擾
  • 動態性:指進程都有完整的生命週期,而且在進程中聲明週期內,進程的狀態是不斷變化,而且進程具有動態的地址(包含代碼、數據和進程控制塊等)
  • 交互性:指進程是在執行過程中可能會與其他進程發生直接和間接的通信,如進程同步和進程互斥等,需要爲此添加一定的進程處理機制
  • 獨立性:指進程是一個相對完整的資源分配和調度的基本單位,各個進程的地址空間是相對獨立的,因此需要引入一些通信機制起來實現進程之間的通信
進程和程序有本質區別
  1. 程序是一段靜態的代碼,是保存在非易失性存儲器上的指令和數據的有序集合,沒有任何執行的概念
  2. 進程是一個動態的概念,它是程序的一次執行過程,包括了動態創建、調度、執行和消亡的整個過程,它是程序執行和資源管理的最小單位。可以用一個程序來創建許多進程。或者反過來說,許多進程運行的可以是同一個程序
進程類型
  1. 交互式進程:交互式進程經常與用戶進行交互,需要等待用戶的輸入(鍵盤和鼠標操作等)。當接收用戶的輸入之後,這類進程能夠立刻響應。典型的交互式進程有Shell命令進程、文本編程器和圖形應用程序運行等
  2. 批處理程序:批處理程序不必與用戶進行交互,因此通常在後臺運行。由於這類進程通常不必很快地響應,因此往往不會優先調度。典型的批處理進程是編譯器的編譯操作、數據庫搜索引擎等
  3. 守護進程:守護進程一直在後臺運行,和任何終端都不關聯。通常系統啓動時開始執行,系統關閉時才結束。很多系統進程(各種服務)都是以守護進程的形式存在的

進程的狀態

內核將所有進程存放在雙向循環鏈表(進程鏈表)中,鏈表的節點都是task_struct結構體,稱爲進程控制塊的結構。該結構包含了與一個進程相關的所有信息,如進程的狀態、進程的基本信息、進程標識符、內核相關信息、父進程相關信息、與進程相關的終端信息、當前工作目錄、打開的文件信息、所接收的信號信息等

進程狀態
  1. 運行態(TASK_RUNNING):進程當前正在運行,或者正在運行隊列中等待調度
  2. 可中斷的睡眠態(TASK_INTERRUPTIBLE):進程處於阻塞(睡眠)狀態。正在等待某些事情發生或能夠佔用某些資源。處在這種狀態下的進程被信號中斷。接收信號或被顯示喚醒呼叫之後,進程將轉變爲運行(TASK_RUNNING)狀態
  3. 不可中斷的睡眠態(TASK_UNINTERRUPTIBLE):此進程狀態類似可中斷的睡眠,只是它不會處理信號,把信號傳遞到這種狀態下的進程不能改變其狀態。只有在它所等待的時間發生時,進程才顯示地被喚醒呼叫
  4. 停止態(TASK_STOPPED):進程的執行被暫停。當進程接收SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信號,就會進入暫停狀態
  5. 殭屍態(TASK_ZOMBIE):子進程運行結束,父進程未退出,並且未使用wait()函數族(如使用waitpid()函數)等系統調用來回收子進程的資源。處在該進程下的子進程已經放棄了幾乎所有的內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等供其父進程收集
  6. 消亡態:進程退出,不佔用任何資源,更不會被調度,該狀態不可見
進程標識符

Linux內核通過唯一的進程標識符(進程身份證號)PID(Process ID)來標識每個進程。 Linux中獲得當前進程的進程號(PID)和父進程號(PPID)的系統調用函數分別爲getpid()和getppid()

進程組與會話組

Linux系統中,進程是以組的形式(進程之間的層次關係)進程管理的,如進程組和會話組,進程組是一組相關進程的集合,會話組是一組相關進程組或進程的集合

進程的優先級

Linux和大多數其他UNIX實現一樣,調度進程使用CPU默認模型是循環時間共享算法。在這種模型下,每個進程輪流使用CPU一段時間,這段時間被稱爲時間片。循環時間共享算法滿足了交互式多任務系統滿足兩個重要需求

  1. 公平性:每個進程都有機會用到CPU
  2. 響應性:一個進程在使用CPU之前無須等待太長時間

在循環時間共享算法中,進程無法直接控制何時使用CPU以及使用CPU的時間。在默認情況下,每個進程輪流使用CPU直至時間片被用光或自己自動放棄CPU(如進程睡眠)。如果所有進程都試圖儘可能地使用CPU,那麼它們使用CPU的時間差不多是相等的

進程的特性nice值允許進程間接地影響內核的調度算法。每個進程都有一個nice值,其取值的範圍爲-20(高優先級)~19(低優先級),默認值爲0。在傳統的UNIX實現中,只有特權進程才能賦給自己(或其他進程)一個負(高)優先級。非特權進程只能降低自己優先級,即賦一個大於默認值0的nice值。

nice值是一個權重因素,它導致內核調度器傾向於調度擁有更高優先級的進程。給一個進程賦一個低優先級,並不會導致它完全無法用到CPU,但會導致它使用CPU的時間變少。nice值對進程調度的影響程序則根據Linux內核版本的不同而不同

進程的調度策略

在系統中有多個進程同時執行,單個CPU下,實際上任意時刻只能有一個進程處於執行狀態,而其他進程則處於非執行狀態。下面兩種調度策略

  1. SCHED_RR策略

在SCHED_RR策略中,優先級相同的進程以循環時間分享的方式進行。進程每次使用CPU的時間爲一個固定長度的時間片。一旦被調度執行之後,使用SCHED_RR策略的進程滿足下列條件中的一個會放棄CPU的控制,否則會保持對CPU的控制

a. 時間片結束
b. 資源放棄CPU,如執行阻塞式的系統調用
c. 進程終止
d. 被一個優先級更高的系統調用

前兩種情況中,進程放棄CPU之後,將會放置在與其優先級級別對應的隊列的隊尾。在最後一種情況中,當優先級更高的進程執行結束之後,被搶佔的進程會繼續執行知道其時間片的剩餘部分被消耗完(被搶佔的進程仍然位於其優先級級別對應的隊列的隊頭)

  1. SCHED_FIFO策略

SCHED_FIFO策略(先入先出)與SCHED_RR策略類似。它們之間最主要的差別在於SCHED_FIFO策略中不存在時間片,如果一個SCHED_FIFO進程獲得了CPU的控制權之後,它就會一直執行直到下面某個條件滿足

a. 自願放棄CPU
b. 進程終止
c. 被一個優先級更高的進程搶佔

第一種情況中,進程會被放置在與其優先級級別對應的隊列的隊尾。在最後一種情況中,當高優先級進程執行結束後,被搶佔的進程會繼續執行

上述兩種被搶佔的原因可能有以下幾種

  1. 之前被阻塞的高優先級進程解除阻塞了
  2. 另一個進程的優先級被提到了一個比當前進程的優先級高的級別
  3. 當前運行的進程優先級被降低到低於其他可運行的進程的優先級
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章