Linux 程序概念與程式設計

2021-07-13 17:11:43 字數 2698 閱讀 5054

1、作業系統(os)角度:程式的乙個執行例項;正在執行的程式;能分配處理器並由處理器執行的實體。

2、核心觀點:擔當分配系統資源(cpu時間,記憶體)的實體。

3、程序的兩個基本元素:

1)程式**(可能被執行相同程式的其他程序共享)。

2)**相關的資料集

程序是一種動態描述,但是並不代表所有的程序都在執行。

每個程序在核心中都有乙個程序控制塊(pcb)來維護程序的資訊,linux核心的程序控制塊是task_struct結構體。它會被裝載到ram(隨機訪問儲存器,即random-access memory)裡並且包含著程序的資訊。每個程序都把它的資訊放在tast_struct這個資料結構裡。

程序的識別符號:程序id(pid),父程序id(ppid)

tast_struct的內容如下:

識別符號:描述本程序的唯一識別符號,用來區別其他程序。

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

優先順序:

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

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

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

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

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

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

所有執行在系統的程序都以tast_struct鍊錶的形式存在核心裡。

1、程序將程式讀入記憶體,為程式分配記憶體空間。

2、核心為該程序儲存pid及相應的狀態資訊,把程序放到執行佇列中等待執行。

3、程序的記憶體映像 ----- > 指的是核心在記憶體中如何存放可執行程式檔案。

在程式轉化為程序的過程中,作業系統將可執行程式從硬碟複製到記憶體中。

記憶體映像與可執行程式檔案的區別:

1)可執行程式檔案是位於硬碟上的,而記憶體映像位於記憶體上。

2)可執行程式檔案沒有堆疊,而記憶體映像存在堆疊。因為可執行程式檔案只有當程式被載入到記憶體中的時候才會分配相應的堆疊。

3)可執行程式檔案是靜態的,因為它沒有執行;而記憶體映像是動態的,資料是隨著執行過程改變的。

linux下的c程式生成程序的記憶體映像主要由4個步驟組成:預編譯、編譯、彙編和鏈結。編譯器gcc經過預編譯、編譯、彙編3個步驟將源程式檔案轉換成目標檔案。如果程式有多個目標檔案或程式中使用了庫函式,則編譯器還需要將所有目標檔案及所需的庫檔案鏈結起來,最後生成可執行程式。當程式執行時,作業系統將可執行程式複製到記憶體中。其布局如下圖所示:

注:其中正文所在的區域為唯讀**和唯讀資料區域,也就是通常所說**段,用來存放程式的執行**,包括了唯讀的常數變數。例如:字串常量等。而

未初始化的資料區域為

bbs段

(block started by symbol),用來存放未初始化的全域性變數,屬於靜態記憶體分配的一部分。初始化的資料區域稱為資料段,用來存放已初始化的全域性變數,也屬於靜態記憶體分配的一部分,所以一般習慣地將bbs段和資料段統稱為資料段。

如下程式對此進行分析:

執行結果如下:

在堆疊中修改函式呼叫位址,使得程式執行跳轉到自己指定的函式,而原程式的創作者完全不知道這段程式的執行中已經執行了別人的**【可能是惡意的】

修改棧幀中的變數的值,不通過變數名。如果修改變數b的值,不引用變數b的名稱,這就需要利用棧幀實現。

通過執行結果可以看出:壓棧是a先壓棧,b後壓棧;壓棧時,棧頂向低位址方向前進。 

變數a在變數b的上面:

變數a的位址 0xbfb673f4;

變數b的位址 0xbfb673f8

僵死狀態是乙個比較特殊的狀態。當程序退出並且父程序(使用wait()系統呼叫)沒有讀取到的子程序退出的返回**時就會產生僵死程序。僵死程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態**。也就是

程序結束(退出)後資源沒有立刻被釋放,等另乙個程序來讀取**資源,沒有釋放會記憶體釋放。

建立乙個維持30秒的僵死程序例子:

父程序睡眠了30秒,子程序處於30秒的僵死狀態,在30秒後退出程式

fock()函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,

也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。



Linux系統程式設計(2) 程序概念

程序 乙個可執行程式跑起來,作業系統就建立乙個程序。ps 顯示當前程序 ps aux 顯示當前所有程序 ps aux less 分頁顯示所有程序 方便檢視 注 前幾個資訊是 user 程序建立使用者 pid 身份識別符號 cpu占用 mem 記憶體占用空間.ps aux grep test 程序名 ...

Linux 程序概念

任何計算機系統都包含乙個基本的程式集合,成為作業系統 os 它包括 作業系統是管管理的軟體 使用者操作 使用者操作介面 shell,lib,指令等 作業系統 驅動程式 硬體 作業系統管理硬體 系統呼叫 在開發者角度,作業系統會對外表現為乙個整體,但是會暴露自己的一部分介面供上層開發者使用,這部分由作...

Linux 程序概念

程序排程演算法 在早期作業系統的排程方式大多數是非剝奪的,這是由於早期的應用一般是科學計算或事務處理,不太把人機互動的響應時間指標放在首要位置。在這種情況下,正在執行的程序可一直占用cpu直到程序阻塞或終止。這種方式的排程演算法可以很簡單,且比較適用對於響應時間不關心或者關心甚少的批處理科學計算或事...