1. 並行與併發:區分的關鍵點是「同時」。
並行(parallel):指在同一時刻,有多條指令在多個處理器上同時執行。
併發(concurrency):指在同一時刻只能有一條指令執行,但多個程序指令被快速的輪換執行,使得在巨集觀上具有多個程序同時執行的效果。即巨集觀上同時,微觀上交替執行。
2. 程序控制塊pcb
程序執行時,核心為每個程序分配乙個pcb(程序控制塊),維護程序相關的資訊,linux核心的程序控制塊是task_struct結構體。 檢視struct task_struct 結構體定義: vim /usr/src/linux-headers-4.10.0-28/include/linux/sched.h
3.檔案描述符表:包含很多指向file結構體的指標,就在程序控制塊的task_struct結構體中。
ps -aux:程序狀態。
top:動態顯示程序狀態。
kill:指定程序號殺死程序。
killall:指定程序名殺死程序。
./a.out &:檢視當前程序號。
pid:n(程序號):檢視指定程序的父程序號。
#include #include pid_t getpid(void); //獲取本程序號
pid_t getppid(void); //獲取呼叫此函式的父程序號
pid_t getpgid(pid_t pid); //獲取程序組號
pid_t fork(void); //建立子程序
程序建立函式還是值得一提的,根據返回值判斷父子程序:返回0表示子程序,返回-1表示失敗,返回其他值就是父程序,這個值表示子程序id,因為父程序是沒有函式可以獲取到子程序id的。
fork函式失敗的兩種情況:
1. 程序數到達系統上線,error設定為eagain。
2. 系統記憶體不足,error設定為enomem
每個程序在退出的時候,核心釋放該程序的所有資源,包括開啟的檔案、占用的記憶體等。但是依然為其保留一定的資訊。,這些資訊主要值程序控制塊pcb的資訊(包括程序號、退出狀態、執行時間等)。
#include #include pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
功能:
等待任意乙個子程序結束,如果任意乙個子程序結束了,此函式會**該子程序的資源。
引數:status : 程序退出時的狀態資訊。
巨集函式可分為如下三組:
1) 正常退出
wifexited(status) 為非0 → 程序正常結束。
wexitstatus(status) 如上巨集為真,使用此巨集 → 獲取程序退出狀態 (exit的引數)。
2) 異常終止
wifsignaled(status) 為非0 → 程序異常終止。
wtermsig(status) 如上巨集為真,使用此巨集 → 取得使程序終止的那個訊號的編號。
3) 暫停狀態
wifstopped(status) 為非0 → 程序處於暫停狀態。
wstopsig(status) 如上巨集為真,使用此巨集 → 取得使程序暫停的那個訊號的編號。
wifcontinued(status) 為真 → 程序暫停後已經繼續執行。
waitid函式:
#include#include
pid_t waitpid(pid_t pid, int *status, int options);
功能:等待子程序終止,如果子程序終止了,此函式會**子程序的資源。
引數:pid : 引數 pid 的值有以下幾種型別:
pid > 0 等待程序 id 等於 pid 的子程序。
pid = 0 等待同乙個程序組中的任何子程序,如果子程序已經加入了別的程序組,waitpid 不會等待它。
pid = -1 等待任一子程序,此時 waitpid 和 wait 作用一樣。
pid < -1 等待指定程序組中的任何子程序,這個程序組的 id 等於 pid 的絕對值。
status : 程序退出時的狀態資訊。和 wait() 用法一樣。
options : options 提供了一些額外的選項來控制 waitpid()。
0:同 wait(),阻塞父程序,等待子程序退出。
wnohang:沒有任何已經結束的子程序,則立即返回。
wuntraced:如果子程序暫停了則此函式馬上返回,並且不予以理會子程序的結束狀態。(由於涉及到一些跟蹤除錯方面的知識,加之極少用到)
返回值:
waitpid() 的返回值比 wait() 稍微複雜一些,一共有 3 種情況:
1) 當正常返回的時候,waitpid() 返**集到的已經**子程序的程序號;
2) 如果設定了選項 wnohang,而呼叫中 waitpid() 發現沒有已退出的子程序可等待,則返回 0;
3) 如果呼叫**錯,則返回-1,這時 errno 會被設定成相應的值以指示錯誤所在,如:當 pid 所對應的子程序不存在,或此程序存在,但不是呼叫程序的子程序,waitpid() 就會出錯返回,這時 errno 被設定為 echild;
01 Linux系統程式設計 Linux系統呼叫
系統呼叫,顧名思義,說的是作業系統提供給使用者程式呼叫的一組 特殊 介面。使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的服務,比如使用者可以通過檔案系統相關的呼叫請求系統開啟檔案 關閉檔案或讀寫檔案,可以通過時鐘相關的系統呼叫獲得系統時間或設定定時器等。從邏輯上來說,系統呼叫可被看成是乙...
系統程式設計 01 程序基礎
一,概念 1.程序是程式在計算機上的一次執行過程。2.程序的狀態 就緒 ready 執行 running 阻塞 blocked 二,程序的操作 1.檢視程序 linux系統 指令 1 ps 檢視程序 ps p 檢視程序的pid ps aux bsd風格顯示程序 2 top 實時顯示系統中各個程序的資...
01 linux命令基礎
我們先了解一下命令的標準格式吧!乙個完整的指令的標準格式 linux 通用的格式 指令主題 選項 操作物件 乙個指令可以包含多個選項 操作物件也可以是多個 用法1 ls含義 列出當前工作目錄下的所有檔案和資料夾名稱 用法2 ls 路徑 含義 列出指定路徑下的所有檔案 資料夾名稱 關於路徑 路徑可以分...