初探Linux kernel之程序相關二

2021-08-25 19:00:56 字數 2108 閱讀 5175

初探linux kernel之程序管理二

上次說了程序的相關組成資訊,這次接著說吧。之所以長期沒有更新,是因為春天到了,是個容易讓人心跑毛的季節,老想著跑著玩了……哈哈

繼續。。。。。。。。。

知道了程序不僅僅是由一段執行**組成的,咱們就說說

linux下的程序的大概過程。其實乙個程序就相當於乙個軟體的動態執行(嚴格的說是某個軟體子系統的動態執行,當然我們可以把該子系統想象成乙個子軟體,這樣會便於理解)。linux中建立乙個程序要用到fork()系統呼叫,乙個子程序的生成是通過拷貝父程序來實現的。fork以後,會返回兩次:一次回到父程序,一次回到子程序。為何要返回兩次,兩次又是如何區別的呢??剛開始我也在像這個問題,因為子程序拷貝了父程序的**,返回時處於fork()返回點的上下文是一樣的,但是返回的值不一樣,藉此來區分是父程序還是子程序……

這不,新的子程序建立好了,然後幹什麼?肯定是做不是當前程序的工作,要不建立他幹什麼?所以,這時候就接著呼叫exec*()這一族函式,該族函式可以建立新的位址空間,並載入到當前程序執行。

最後,程式通過exit()syscall(系統呼叫,以後都用這個代指了)退出執行。這個函式會終結程序並將其占用的資源釋放掉。父程序通過wait4()syscall來查詢子程序是否終結,這使得程序擁有了等待特定程序執行完的能力(這不就是傳說中的同步麼?有木有?有木有?哈哈)。程序退出後被設定為僵死狀態,知道父程序呼叫wait()或waitpid()為止(其實他們貌似都是基於wait4()實現的)。

上面就是程序建立到**的簡單過程。子程序由父程序建立,父程序**,有點恢復現場的感覺,不過在比較安全的系統裡面,**都可以看的「恢復現場」等類似概念的身影,就像借錢一樣,「好借好還再借不難」,做程式也是這個道理,哈哈,慢慢體會,程式設計裡面蘊含很多的哲學道理的。

1、程序描述符及任務結構

在軟體設計中,第一就是抽象名詞,一切名詞都會在計算機中找到它的資料抽象,就是偉大的資料結構童鞋。他可能被抽象成乙個變數,乙個陣列,乙個struct,乙個物件……可能是任何一種型別,只要滿足你的需求,他就是最perfect的抽象。

程序在kernel中是被放在任務佇列(tasklist)中的,tasklist是個雙向迴圈鍊錶。鍊錶中的每一項都是task_struct型別,即程序描述符。定義在中,包含著乙個具體程序的所有資訊。

1.1分配程序描述符

程序有的表達了,但是不能胡亂表達啊,就像追女朋友一樣,不能見人就表白,那不成耍流氓了,名額有限,見好就收啊。os能多道並跑的程序也就那幾個,若肆意建立程序,不跑癱了機子,那就變成病毒程式了,狂吃cpu。linux使用slab分配器分配task_struct結構。由slab動態生成task_struct,只需在棧底建立乙個新的thread_info,再用這個結構的資料可以容易的計算出偏移量。

其中包含了task_struct的指標和程序的相關資訊。

1.2程序描述符的存放

kernel通過pid唯一標識乙個程序,pid是pid_t型別,其實也是int型的,pid最大值是32768(shortint的max值)。可以改其值,在/proc/sys/kernel/pid_max中,因為大公司的web伺服器集群工作時32768個程序多開貌似不夠啊。

核心在處理程序時一般是直接通過task_struct程序的,都是通過current巨集直接找到或計算當前task_struct的。有的平台暫存器豐富,不用專門計算其值,一直把當前執行程序的值儲存在專用的暫存器中就ok。如powerpc用r2暫存器,而x86暫存器少要專門計算。

1.3程序狀態

程序一直處於下面五種狀態之一:

ltask_running

//執行狀態 l

task_interruptible

//可中斷狀態 l

task_unintrruptible

//不可中斷狀態 l

task_zombie

//僵死 l

task_stopped

//停止

下圖是大概的轉換過程。不很詳細,自己search一下……

s額,有空繼續,今天就到這裡吧……

本週海賊更新了!!!

哈哈!!!

詳細請諮詢blog專題:

Linux kernel 分析之十 核心執行緒

眾所周知,核心中建立乙個核心執行緒是通過kernel thread實現的。宣告如下 int kernel thread int fn void void arg,unsigned long flags 我們知道,使用者態建立執行緒呼叫clone 如果要在核心態建立執行緒,首先想到的是在核心態呼叫cl...

Tkinter 之ProgressBar進度條標籤

一 引數說明 引數作用 cursor 滑鼠位於進度條內時的形狀 length 進度條長度 maximum 進度條最大刻度值 mode 進度條的模式。有兩種 determinate 和 indeterminate orient 進度條的方向,有horizontal 和vertical兩種 style ...

APUE之執行緒初探

執行緒 什麼是執行緒?很多介紹都是 輕量級的程序 不過感覺執行緒的定義一直都比較模糊,沒有找到什麼具體的定義。倒是覺得 程序是資源分配的最小單位,執行緒是排程的基本單位 這個說法算是比較認可的。現在主要探索的就是apue中提供的關於執行緒的相關函式。執行緒標示 和程序一樣,執行緒也有自己的id,li...