程序與執行緒

2021-09-26 11:37:02 字數 3585 閱讀 1224

process                 thread

建立      fork                   pthread_create

獲取id    getpid getppid         pthreadcreate_self

退出      exit _exit  return     pthread_exit

**      wait waitpid           pthread_join

取消      kill                   pthread_cancel

清理函式  atexit                 pthread_clean

分離                             pthread_deatch

程序建立  

退出/ 取消

清理函式

**執行緒

建立退出 / 取消

清理函式

** / 設定分離屬性 自動**

執行緒間通訊

互斥鎖建立

pthread_mutex  mutexname

初始化int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

mutx為鎖名  attr是鎖的屬性一般為null

加鎖int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);  非阻塞加鎖

解鎖int pthread_mutex_unlock(pthread_mutex_t *mutex);

銷毀鎖int pthread_mutex_destroy(pthread_mutex_t *mutex);

訊號量訊號量的定義                       

sem_t semname

訊號量的初始化                  

int sem_init(sem_t *sem, int pshared, unsigned int value);

pshared :0表示執行緒間使用

value: 0表示阻塞,非0不阻塞  可認為是資源的個數

訊號量的pv操作                    

申請資源   int sem_wait(sem_t *sem);  sem = sem - 1

若sem為0則會阻塞,當sem不為0時自動申請資源

釋放資源    

int sem_post(sem_t *sem);

sem = sem+1

該函式不會阻塞

訊號量的銷毀

int sem_destroy(sem_t *sem);

程序間通訊方式

原理:不同程序讀取共享記憶體

管道特性    

管道是檔案的一種 支援讀寫操作

半雙工的工作模式

特殊檔案不支援定位操作

讀阻塞    超過64k會阻塞

寫阻塞      寫端存在,管道為空

管道破裂  讀端關閉  寫管道   

無名管道

用於父子間程序通訊    父子程序共享檔案描述符 但是可以單獨關閉

建立  int fd[2]; pipe(fd);  fd[0]為讀端    fd[1]為寫端

使用  管道為半雙工 使用前父子程序各自需要關閉一端以

確定管道的使用方向

以檔案的方式讀寫,但是不能使用定位

關閉  close

有名管道

用於任意程序之間的通訊

建立int mkfifo(const char *pathname, mode_t mode);

開啟open()  需要確定讀端還是寫端

只有兩個程序同時開啟才能進行下一步,只有一端開啟會出現阻塞

讀寫read

write

關閉close

解除安裝unlink  / rename

訊號程序間唯一的非同步通訊機制

通過一種軟中斷的通知機制,實現非同步通訊。

相關常用函式

int kill(pid_t pid, int sig);

傳送訊號的函式,當另一程序接收到訊號時會做出對應訊號的預設行為。

unsigned alarm(unsigned seconds);

當經過對應的時間,該程序會收到sigalarm訊號

int pause(void);

暫停函式,程序會被掛起,當收到其他訊號時會繼續執行,常和sigusr1

sigusr2兩個訊號配合使用。

signal()

用於修改對應訊號的預設處理函式,需要傳入對應的函式指標。

sig_dfl 執行預設的處理方式。

常用訊號

共享記憶體

程序間通訊最快的一種方式

特性:    

不會阻塞需要先寫再讀,通常需要pause kill等函式配合使用

步驟申請key值

key_t ftok(const char *pathname, int proj_id);

pathname 任意可讀路徑, proj_id 任意數字 常用字元填寫(『!』)

兩個引數共同用於生成乙個key值,用於表示核心中的共享記憶體物件

申請物件(共享記憶體)

int shmget(key_t key, size_t size, int shm***);

key為上一步申請到的key值,

size為申請共享記憶體物件的大小一般為4096的整數倍。

shm***    : 申請的記憶體的訪問許可權

如果是第乙個申請,則用ipc_creat 表示

如果要檢測是否存在,則用ipc_excl

使用時要|乙個許可權 ipc_creat | 0666  

對映物件

void *shmat(int shmid, const void *shmaddr, int shm***);

shmid   為 shmget的返回值  

shmaddr 為與程序中哪一片空間關聯  null表示系統自己分配空間

shmflag 0 表示讀寫  非0為唯讀

讀/寫對映物件時返回系統分配到空間的首位址,用讀指標和寫指標的方式去讀寫內容

寫  strcpy memcpy

寫斷開對映

int shmdt(const void *shmaddr);

斷開核心和記憶體之間的對映關係

刪除對像

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

cmd    ipc_rmid 用於刪除共享記憶體

buf      null 表示只刪除物件

訊號量集

用於程序共享記憶體時的同步操作,同執行緒中的同步

程序與執行緒

程序 process 管理單元,管理分配應用程式的資料,的記憶體空間.執行緒 thread 執行單元,執行緒負責執行乙個預先編排好的 段,執行 棧是基於執行緒的.乙個應用程式啟動的時候,程序自動建立,並且會預設建立主線程,主線程負責執行main 方法.thread t new thread new ...

程序與執行緒

程序 是擁有資源的實體,包括 1。乙個程序有乙個虛擬位址空間,不同程序位於不同的 虛擬位址空間中。程序之間若要通訊,必須通過作業系統 的功能呼叫 ipc 2。程序擁有其他資源,例如開啟的檔案和i o裝置。程序結束時,作業系統會自動釋放該程序擁有的所有資源。例如,如果 open乙個檔案而不close它...

程序與執行緒

程序包括 1 私有的虛位址空間 2 可執行程式 與資料 3 開啟系統資源列表控制代碼 4 安全訪問標誌 5 程序id 6 至少有乙個執行執行緒 執行緒包括 1 一組cpu暫存器狀態 2 兩個堆疊 系統態與使用者態 3 tls 執行緒區域性儲存區 4 執行緒id 5 安全特性 因此程序是不活潑的,它從...