linux執行緒基礎

2021-10-24 22:32:09 字數 2714 閱讀 6482

程式->編譯好的二進位制檔案,不占用系統資源

程序->在記憶體執行,占用系統資源

併發:多個程序在同一時間段內交替執行

並行:多個程序在同一時刻內被同時執行

算術邏輯單元,解析操作碼並完成對應操作(只有add和《操作)

記憶體管理模組

實現虛擬地質到實位址的對映

不同程序有不同的使用者空間,但是核心空間都是一樣的

程序控制快,儲存程序的所有資訊

本質:結構體

內部定義成員:

1.程序id

2.程序的狀態(就緒,執行,掛起)

3.程序切換時需要儲存和恢復的一些cpu暫存器

4.描述位址空間的資訊

5.描述控制終端的資訊

6.當前工作目錄

7.umask掩碼

8.檔案描述符表(包含很多指向file結構體的指標)

9.和訊號相關的資訊

10.使用者id和組id

11.會話和程序組

12.程序可以使用的資源上限

1.本質:字串

2.有統一的格式-----名:值

3.值用來描述程序環境資訊

相關函式

1.getenv

獲取環境變數值

char *getenv(const char *name);

char *secure_getenv(const char *name);

2.setenv

新增或者修改環境變數

3.unsetenv

刪除環境變數

程序控制原語

fork函式

pid_t fork(void);

返回值有倆個:

1.父程序返回子程序id(非負整數)

2.子程序返回0(表示程序建立成功)

根據返回值可以分辨當前程序是子程序還是父程序

注意:子程序建立後,和父程序享有同樣的地位,和父程序競爭cpu

父子程序共享:1.檔案描述符 2.mmap建立的對映區

所以,fork之後子程序可能優先執行,這就要注意執行緒安全問題

gdb除錯

使用gdb除錯的時候,gdb只能跟蹤乙個程序,可在fork函式之前,通過指令設定gdb在fork之後跟蹤哪個程序

set follow-fork-mode child 設定gdb在fork之後跟蹤子程序

set follow-fork-mode parent 設定…跟蹤父程序

int execl(const char *pathname, const char arg, …/ (char *) null */);

載入乙個程序,通過路徑+程式名 來載入

成功無返回

失敗返回-1

int execlp(const char *file, const char arg, … / (char *) null */);

引數1:要載入的程式的名字。該函式需要配合path環境變數來使用,當path中所有目錄搜尋後沒有引數1則出錯返回

該函式通常呼叫系統程式。如ls,date,cp等命令

int execle(const char *pathname, const char arg, … /, (char *) null, char *const envp */);

見man

int execv(const char *pathname, char *const ar**);

int execvp(const char *file, char *const ar**);

int execvpe(const char *file, char *const ar**,char *const envp);

孤兒程序

父程序先於子程序結束,則子程序成為孤兒程序,子程序的父程序成為init程序,稱為init程序領養孤兒程序

殭屍程序

程序終止,父程序尚未**,子程序殘留資源存放於核心中,變成殭屍程序。

**函式

wait函式

*pid_t wait(int wstatus);

1.阻塞等待子程序退出

2.**子程序殘留資源

3.獲取子程序結束狀態

可使用wait函式傳出引數status來儲存程序的推出狀態。借助巨集函式來進一步判斷程序終止的具體原因,巨集函式分為如下三組:

1.wifexited(status) 為非0 -> 程序正常退出

wexitstatus(status)如上述巨集為真,使用此巨集 -> 獲取程序的退出狀態

2.wifsignaled(status) 為非0 -> 程序異常終止

wtermsig(status) 如上述巨集為真,使用此巨集 -> 取得使程序終止的那個訊號的編號

3.wifstopped(status) 為非0 -> 程序處於暫停狀態

wstopsig(status)如上述巨集為真,使用此巨集 -> 取得使程序暫停的那個訊號的編號

wifcontnued(status) 為真 -> 程序暫停後已經繼續執行

waitpid函式

*pid_t waitpid(pid_t pid, int wstatus, int options);

pid > 0 指定程序id**

pid = -1 **任意子程序

pid = 0 **本組任意子程序

pid < -1 **該程序組的任意子程序

成功:返回清理掉的子程序id

失敗:返回 -1

linux 執行緒基礎

檢視程序中有多少個執行緒,檢視執行緒的lwp ps lf 程序id pid 執行結果 lwp列 y ps lf 1887 uid pid ppid lwp c nlwp stime tty stat time cmd ys 1887 1341 1887 0 3 14 57 tty2 sl 0 00 ...

Linux多執行緒基礎 基礎)

程序 乙個正在執行的程式,它是資源分配的最小單位 執行緒 是程式執行的最小單位,可以理解為程序的乙個實體。乙個程序可以有多個執行緒。執行緒不能離開程序單獨存在,離開程序談執行緒是沒有意義的。多執行緒的相比多程序的優勢 建立子程序是拷貝父程序所有的資源進行併發處理,這樣需要更多的資源消耗,對硬體要求更...

Linux多執行緒基礎之執行緒基礎用法

多人砌牆的故事 加快任務完成可以通過加人的方法來實現。同樣,程式中可以通過加程序來實現,但是,多程序存在資源浪費的問題。而執行緒沒有資源浪費的問題。總結 執行緒就是 輕量級 的程序 執行緒與建立它的程序共享 段 資料段 執行緒有自己的棧 建立執行緒 int pthread create pthrea...