天天看點

Linux多任務機制

Linux 下多任務機制的介紹

多任務處理是指使用者可以在同一時間内運作多個應用程式,每個正在執行的應用程式被稱為一個任務。Linux就是一個支援多任務的作業系統,比起單任務系統它的功能增強了許多。多任務作業系統使用某種排程政策支援多個任務并發執行。事實上,處理器(單核)在某一時刻隻能執行一個任務。每個任務建立時被配置設定時間片(ms級),任務執行(占用CPU)時,時間片遞減。作業系統會在目前任務的時間片用完時排程執行其他任務。由于任務會頻繁地切換執行,是以給使用者多個任務同時運作的感覺。

多任務作業系統中通常有三個基本概念:任務、程序和線程。

一、任務

任務是一個邏輯概念,指由一個軟體完成的活動,或者是為實作某個目的的一系列操作。通常一個任務是一個程式的一次運作,一個任務包含一個或多個完成獨立功能的子任務,這個子任務是程序或線程。任務、程序和線程之間的關系如下圖所示

Linux多任務機制

二、程序

2.1 程序的基本概念

程序是指一個具有獨立功能的程式在某個資料集合上的一次動态執行過程,它是作業系統進行資源配置設定和排程的基本單元。一次任務的運作可以激活多個程序,這些程序互相合作來完成該任務的一個最終目标。程序具有并發性、動态性、互動性和獨立性。

Linux系統中主要包括以下三種類型的程序:

  • 互動式程序:這類程序經常與使用者進行互動,需要等待使用者的輸入
  • 批處理程序:這類進行不必與使用者進行互動,通常在背景運作
  • 守護程序:這類程序一直在背景運作,和任何終端都不關聯

2.2 程序結構

程序不但包括程式的指令和資料,而且包括程式計數器和處理器的所有寄存器以及存儲臨時資料的程序堆棧。核心将所有程序存放在雙向循環連結清單(程序連結清單)中,連結清單的每一項都是 task_struct,稱為程序控制塊(PCB)的結構。

task_struct 結構中最為重要的兩個域為:state(程序狀态)和 pid(程序辨別符)

1.程序狀态

  • 運作狀态(TASK_RUNNING):程序正在運作,或者正在運作隊列中等待排程
  • 可中斷的阻塞狀态(TASK_INTERRUPTIBLE):程序處于阻塞(睡眠)狀态,正在等待某些事件發生或能夠占用某些資源
  • 不可中斷的阻塞狀态(TASK_UNINTERRUPTIBLE):類似于可中斷阻塞狀态,隻是它不會處理信号,把信号傳遞到這種狀态下的程序不能改變它的狀态
  • 暫停狀态(TASK_STOPPED):程序的執行被暫停,當程序收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号時,就會進入暫停狀态
  • 僵死狀态(EXIT_ZOMBIE):子程序運作結束,父程序未退出,并且未使用wait函數族來回收子程序的退出狀态
  • 消亡狀态(EXIT_DEAD):這是最終狀态,父程序調用wait函數族回收之後,子程序徹底有系統删除,不可見
    Linux多任務機制

2.程序辨別符

Linux核心通過唯一的程序辨別符PID來辨別每個程序。PID存放在 task_struct 的 pid 字段中。系統可以建立的程序數目有限制,可以檢視 /proc/sys/kernel/pid_max 來确定上限。

2.3 程序的建立、執行和終止

  • 通過fork()函數複制目前程序建立一個子程序
  • 通過exec函數族讀取可執行檔案并将其載入位址空開始運作
  • 把終止的程序設定為僵死狀态,其父程序在某個時間調用wait函數族,回收子程序的退出狀态,随後子程序占用的所有資源被釋放

2.4 程序的記憶體結構

  • 隻讀段:具有隻讀屬性,包含程式代碼(.init 和 .text)和隻讀資料(.rodata)
  • 資料段:存放的是全局變量和靜态變量。其中初始化資料段(.data)存放顯示初始化的全局變量和靜态變量;未初始化資料段(.bss)存放未進行顯示初始化的全局變量和靜态變量
  • 棧:由系統自動配置設定釋放,存放函數的參數值、局部變量的值、傳回位址等
  • 堆:存放動态配置設定的資料,一般由程式員動态配置設定和釋放,若程式員不釋放,程式結束時可能由作業系統回收
  • 共享庫的記憶體映射區:Linux動态連結器和其他共享庫代碼的映射區域

三、線程

繼續閱讀