linux程式管理子系統簡要分析

coding__madman發表於2016-05-05

Linux程式管理:


程式與程式:

程式:存放在磁碟上的一系列程式碼和資料的可執行映像,是一個靜止的實體。

程式:是一個執行中的程式,它是動態的實體

程式四要素:

1. 有一段程式供其執行,這段程式不一定是某個程式所專有,可以與其他程式共用

2. 有程式專用的核心空間堆疊

3. 在核心中有一個task_struct資料結構,即通常所說的“程式控制塊”。有了這個資料結構,程式才能成為核心排程的一個的一個基本單位接收核心的排程。

4. 有獨立的使用者空間


Linux程式狀態

1. TASK_RUNNING

程式正在被CPU執行,或者已經準備就緒,隨時可以執行,當一個程式剛被建立時,就處於TASK_RUNNING狀態。

2. TASK_INTERRUPTIBLE

處於等待中的程式,待等待條件為真時被喚醒,也可以被訊號或者中斷喚醒。

3. TASK_UNINTERRUPTIBLE

處於等待中的執行緒,待資源有效時喚醒,但不可以由其它程式通過訊號或中斷喚醒。

4. TASK_KILLABLE

Linux2.6新引入的程式睡眠狀態,原理類似於TASK_UNINTERRUPTIBLE,但是可以被致命訊號SIGKILL喚醒。

5. TASK_TRACED

正處於被除錯狀態的程式

6. TASK_DEAD

程式退出時(呼叫do_exit)所處的狀態


Linux程式描述

在Linux核心程式碼中,執行緒、程式都使用結構task_struct(sched.h)來表示,它包含了大量描述程式/執行緒的資訊,其中比較重要的有:

pid_t pid;//程式號

long state;//程式狀態

int prio;//程式優先順序


Linux程式排程:

排程的概念:從就緒的程式中選出最合適的一個來執行。

1. 排程策略

SCHED_NORMAL(SCHED_OTHER):普通的分時程式

SCHED_FIFO:先入先出的實時程式

SCHED_RR:時間片輪轉的實時程式

SCHED_BATCH:批處理程式

SCHED_IDLE:只在系統空閒時才能夠被排程執行的程式

2. 排程時機

什麼時候發生排程?即shedule()函式什麼時候被呼叫。

排程時機----主動式

在核心中直接呼叫schedule().當程式需要等待資源等而暫時停止執行時,會把自己的狀態置於掛起(睡眠),並主動請求排程,讓出CPU。

範例:

1. current->state = TASK_INTERRUPTIBLE;

2. schedule();

排程時機---被動式

被動式排程又名:搶佔式排程。分為:使用者態搶佔和核心態搶佔。

使用者態搶佔:


核心態搶佔:




排程時機---搶佔計數


3. 排程步驟

Schedule函式工作流程如下:

1>. 清理當前執行中的程式

2>.選擇下一個要執行的程式

3>.設定新程式的執行環境

4>.程式上下文切換


相關文章