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 安全特性 因此程序是不活潑的,它從...