Linux下程序及其描述task struct

2021-07-30 11:58:19 字數 2316 閱讀 7969

在談程序之前,我們先說一說程式:在linux下,我們想生成乙個c程式,必定要通過預處理,編譯,彙編,鏈結這四步,才能得到乙個可執行檔案也就是我們的c程式,而對於我們作業系統而言,要執行乙個磁碟上儲存的二進位制可執行檔案,要進行哪些操作呢?

根據馮諾依曼體系結構,我們知道我們的cpu其實只跟我們的記憶體打交道,而在這裡我們要讓cpu執行我們的二進位制可執行檔案,就必然要將磁碟上的二進位制檔案載入到我們的記憶體當中,而當這份二進位制檔案被載入到記憶體當中後,就不僅僅是單純的二進位制可執行檔案這麼簡單,程式在這裡就會演變成為我們所說的程序。

而對於程序,除了包含之前的二進位制檔案中的資料與**以外,還有一項非常重要的內容,也就是我們的程序控制塊pcb(在linux下pcb就是task_struct的結構體),而在程序控制塊當中,則是包含所有描述該程序的資訊,所以我們作業系統對於程序的管理主要通過兩個方面:

1.核心將磁碟上的二進位制可執行檔案讀入到記憶體當中,並且為其分配對應的記憶體空間;

2.核心為這個程序儲存所有相關資訊,構建pcb(task_struct結構體),並將其與其他程序的pcb以特定的資料結構管理組織管理起來;

這樣一來,我們作業系統的排程程式就可以根據對應的pcb找到對應的程序,就可以對其所管轄的程序進行排程執行了。

對於上述的兩個方面,首先我們來討論一下第乙個,也就是核心將磁碟上的二進位制檔案讀入到記憶體當中,這裡就會形成對應的記憶體映像,而對於二進位制可執行程式與程序的記憶體映像的不同之處在於:

1.二進位制可執行程式在於硬碟之中,而程序的記憶體映像在於記憶體當中;

2.二進位制可執行程式並不存在堆疊,只有當其被載入到記憶體當中後才會被分配堆疊;

3.二進位制可執行程式雖然也有未初始化的資料段,但它並不被儲存在硬碟中的可執行檔案當中;

4.二進位制可執行程式是靜態的,而我們的程序的記憶體映像是動態的,隨時變化的;

由此我們可以總結出:硬碟上的二進位制可執行程式在被載入到記憶體當中,其中的資料以及**就儲存在這個程序所對應的位址空間當中,而這個位址空間上的所有位址均為虛擬位址,至於它與我們物理記憶體的關係,則是位址空間上的虛擬位址通過頁表以及cpu上的記憶體管理單元mmu這一硬體將虛擬位址通過對映,將其轉化成我們的實體地址。

我們作業系統核心在管理程序主要是通過對每個程序的pcb進行管理,而乙個pcb中包含了這個程序的所有資訊,而這些資訊大致有哪些呢?(我們以linux的task_struct為例)

在進行剖析task_struct的定義之前,我們先按照我們的理論推一下它的結構:

1、程序狀態 ,將紀錄程序在等待,執行,或死鎖

2、排程資訊, 由哪個排程函式排程,怎樣排程等

3、程序的通訊狀況

4、因為要插入程序樹,必須有聯絡父子兄弟的指標, 當然是task_struct型

5、時間資訊, 比如計算好執行的時間, 以便cpu 分配

6、標號 ,決定改程序歸屬

7、可以讀寫開啟的一些檔案資訊

8、 程序上下文和核心上下文

9、處理器上下文

10、記憶體資訊

檢視task_struct這個結構體定義的原始碼可以通過/usr/src/kernels/2.6.32-431.el6.i686/include/linux這個路徑,去查詢其中的sched.h檔案,其中大致定義如下:

struct task_struct ;
以上內容我是參考了這篇部落格。

而其中幾個重要的成員如下:

標示符 pid: 描述本程序的唯一標示符,用來區別其他程序。(通過系統呼叫getpid()與getppid()可以分別獲取當前程序pid與其父程序pid,這裡要注意一點:所有通過命令列進行的程序,其父程序均為shell)

狀態 :任務狀態,退出**,退出訊號等。

優先順序 :相對於其他程序的優先順序。

程式計數器:程式中即將被執行的下一條指令的位址。

記憶體指標:包括程式**和程序相關資料的指標,還有和其他程序共享的記憶體塊的指標

上下文資料:程序執行時處理器的暫存器中的資料。

i/o狀態資訊:包括顯示的i/o請求,分配給程序的i/o裝置和被程序使用的檔案列表。

記賬資訊:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記賬號等。

struct mm_struct *mm; //程序記憶體管理資訊
其實,mmstruct這個結構體主要描述了linux視角下管理程序位址空間的資訊,它主要通過以對應的start和end兩個資料來對位址空間中的每乙個區域進行對應的劃分其範圍。

Linux下程序間傳遞描述符

linux下程序間傳遞描述符 每個程序都有自己的程序空間,這使得描述符在程序間傳遞變得不容易。就比如說linux下提供程序間傳遞描述符的機制,但是卻要求兩個程序是父子程序。linux程序間傳遞描述符的機制是通過sendmsg和recvmsg兩個函式實現的 該機制可以傳遞任意形式的描述符,如pipe ...

Linux 程序描述符

linux程序管理 1 程序描述符 程序描述符 linux使用程序描述符資料結構記錄現場資訊,然後給予程序描述符管理程序,包括程序的建立 排程 消亡等操作。程序除了包括執行著的程式,還包括系統資源 當前cpu現場 排程資訊 程序間關係等 記錄這些執行緒資訊的資料結構就是程序描述符task struc...

Linux環境下僵死程序的產生及其避免

在fork execve 過程中,假設子程序結束時父程序仍存在,而父程序fork 之前既沒安裝sigchld sigcld訊號處理函式呼叫waitpid 等待子程序結束,又沒有顯式忽略該訊號,則子程序成為僵死程序,無法正常結束,此時即使是root身份kill 9也不能殺死這類程序。補救辦法是殺死殭屍...