作業系統學習筆記(三) 程序

2021-09-30 18:53:04 字數 2256 閱讀 7913

一、程序環境

c程式儲存空間布局:

正文段:唯讀、存放cpu執行的機器指令,可共享

資料段:也叫初始化資料段。包含程式中需要明確賦值的變數,如 int max =99;

bss段:也叫未初始化的資料段,在程式開始執行前,核心將此段中資料初始化為0或空指標,如long sum[100];

棧:存放自動變數(即區域性變數),以及每次函式呼叫時所需要儲存的資訊

堆:通常在堆中實現動態儲存分配,位於bss和棧之間

其中,如暫存器變數或全域性變數存放在資料段或bss段。圖示如下:

二、動態庫與靜態庫

1.靜態庫:鏈結階段直接被鏈結到二進位制檔案中,生成檔案體積大,但不再依賴於庫。

2.動態庫:執行階段載入

1)c檔案生成動態庫  gcc -shared a.c -o libdb.so

2)呼叫方法:

要求動態庫載入路徑預設在/lib和/usr/lib,或通過/etc/ld.so.conf配置或環境變數ld_librart_path指定

手動載入動態庫:利用c庫中的dlopen等介面

開啟庫:  *p = dlopen("lib***.so",rtld_now);   //第二個引數可以更改

void (*func)(void) = dissym(p,"func");

func();

三、程序控制

1.程序id為0是交換程序,為1是init程序,獲取pid呼叫函式pid_t getpid(void);  獲取父程序pid用pid_t getppid(void);標頭檔案都是和 ,pstree命令可以檢視程序家族樹。

2.程序組:一次會話中的多個程序可以屬於乙個程序組(如管道的兩個程序),程序組id為pgid,會話id為sid

pid_t  getpgrp(void);   int setpgid(pid_t pid,pid_t pgid);

對於乙個已經執行exec的子程序,父程序不能呼叫setpgid來設定子程序的程序組id

呼叫setsid(void)可以建立會話,但呼叫它的程序不能是某個程序組的組長。防止該程序組其他成員無法會話遷移。

3.程序的建立——fork()

呼叫folk建立程序,呼叫程序為父程序,返回程序為子程序。返回兩次,一次是父程序的返回值返回子程序的程序號,另一次是子程序的返回值,返回0。子程序是父程序的副本,拷貝了乙份父程序的堆疊空間,父子程序只共享正文段。

ret=fork();

if(ret==0)   

else  if (ret>0)   

else 

注意:一般在fork程序中,父子程序並不同步,因此不一定是父程序還是子程序先進行。子程序不繼承父程序的檔案鎖,子程序未處理訊號集設定為空集。

4.寫時拷貝:子程序的頁表項指向與父程序指向的物理記憶體頁相同,當父子都唯讀時則公用乙個物理記憶體頁,但由一方嘗試修改則會引發缺頁異常,此時核心將為該頁面建立乙個新的物理頁面並複製其內容,使得父子程序各自真正擁有自己的物理記憶體,然後將頁表項標記位可寫。

5.fd_clo***ec(fd)與o_clo***ec(open)標誌位在子程序呼叫exec時會響應關閉檔案,防止父子程序由於共享檔案偏移量時讀寫檔案發生混亂。

6.守護程序daemon

特點:在後台執行不受任何終端控制,一直到系統退出(如sigint、sigquit、sitstp等終端訊號並不能干擾它,關閉終端也不能將其殺死。守護程序退出的情況只有stop命令、傳送訊號殺死守護程序或守護程序**bug)。

建立方法:double_fork magic

1)fork()函式,父程序退出子程序繼續

2)子程序擺脫環境控制:修改程序當前目錄為根目錄(chdir("/"))呼叫setsid切斷與控制終端的關係並建立乙個新的會話,設定檔案模式建立掩碼為0(umask(0))

3)再次fork(),父程序退出子程序繼續,使得daemon不是會話首程序

4)關閉標準輸入、標準輸出、標準錯誤

也可以呼叫glibc庫中的daemon函式一次建立:

#include

int daemon(int nochdir,int noclose);   //一般引數為0,0

7.程序的終止:正常——從main函式return、呼叫exit、呼叫_exit。異常——呼叫abort、接收到訊號由訊號終止

exit與_exit區別是,exit退出且呼叫清理函式,關閉開啟的方法、寫入緩衝資料、刪除臨時檔案然後再呼叫_exit

8.等待子程序

作業系統學習筆記 程序通訊

程序通訊是指程序之間的資訊交換。交換的資訊量包括乙個狀態或數值 訊號量,低階通訊 或上千個位元組 高階通訊 低階通訊 程序的互斥和同步 交換的資訊量 即訊號量 較少 高階通訊 指使用者可直接利用os提供的一組通訊命令 不需要自己編寫命令 高效地傳送大量資料的一種通訊方式。對使用者透明。使用者不需要考...

作業系統學習筆記 程序控制

三 程序控制 1.兩種執行模式 l 系統模式 系統態,控制模式,核心模式 n 具有較高的特權。n 執行系統特定的指令,包括讀 寫控制暫存器的指令,基本i o指令以及與儲存器管理有關的指令,及一些特定的記憶體區。n 核心模式下的處理機及其指令 暫存器和記憶體收受到完全控制和保護 l 使用者模式 或使用...

作業系統學習筆記

這裡專門摘錄作業系統相關筆試題和面試題!也當作自己的乙個複習!乙個很全的作業系統常考知識集合 1.分段式儲存和分頁式儲存,以及段頁式儲存的區別 分頁是一維儲存,分段是二維的 因為分頁給出虛擬位址後,作業系統會自動劃分頁號和偏移量 而分段給出位址後,需要知道段號和偏移量,段的長度是可變的!故是二維的 ...