進程
進程有獨立的地址空間
Linux爲每個進程創建task_struct
每個進程都參與內核調度,互不影響
線程
進程在切換時系統的開銷大
很多操作系統引進了輕量級進程LWP
同一進程中的線程共享相同地址空間
Linux不區分進程、線程(都是任務)
線程特點
通常線程指共享相同地址空間的多個任務
使用線程的好處
大大提高任務切換的效率
避免額外的TLB&cache的刷新
##線程共享資源
一個線程中的多個線程共享一下資源
可執行的指令
靜態數據
進程中打開的文件描述符
當前工作目錄
用戶ID
用戶組ID
線程私有資源
每個線程私有的資源包括
線程ID(TID)
PC(程序計數器)和相關寄存器
堆棧
錯誤號(errno)
優先級
執行狀態和屬性
Linux線程庫
Pthread線程庫中提供瞭如下基本操作
創建線程
回收線程
結束線程
同步和互斥機制
信號量
互斥鎖
線程創建——pthread_create
#include<pthread.h>
Int pthread_create(pthread_t *thread,const pthread_attr_t arr,void(*routine)(void *),void *arg);
成功返回0,失敗時返回錯誤碼
Thread線程對象
Attr線程屬性,NULL代表默認屬性
Routine線程執行的函數
Arg傳遞給routine的參數 無參傳遞NULL
線程回收——pthread_join
#include<pthread.h>
Int pthread_join(pthread_t thread,void**retval);
成功返回0,失敗時返回錯誤碼
Thread要回收的線程對象
調用線程阻塞直到thread結束
*retval接收線程thread的返回值
線程結束——pthread_exit //使用return也可以
#include<pthread.h>
Void pthread_exit(void*retval)
結束當前線程
Retval可被其他線程通過pthread_join獲取
線程私有資源被釋放
線程間通信
線程共享同一進程的地址空間
優點:線程間通信很容易
通過全局變量交換數據
缺點:多個線程訪問共享數據時需要同步或互斥機制
線程通信——同步
同步(synchronization)指的是多個任務按照約定的先後次序相互配合完成一件事情
1968年,Edsgar Dijikstra基於信號量的概念提出一種同步機制
由信號量來決定線程是繼續運行還是阻塞等待
信號量(燈)
信號量代表某一類資源,其值表示系統中該資源的數量
信號量是一個受保護的變量,只能通過三種操作來訪問
初始化
P操作(申請資源)
V操作(釋放資源)
信號量——P/V操作
P(S)含義如下:
If(信號量的值大於0){
申請資源的任務繼續運行;
信號量的值減一;
}
Else{
申請資源的任務阻塞;
}
V(S)含義如下:
信號量的值加一;
If(有任務的等待資源){
喚醒等待的任務,讓其繼續運行;
}
Posix 信號量
Posix中定義了兩類信號量
無名信號量(基於內存的信號量):常用於線程
有名信號量:進程和線程均可
Pthread庫常用的信號量操作函數如下:
Int sem_init(sem_t *sem,int pthread,unsigned int value);
Int sem_wait(sem_t *sem);//P操作
Int sem_post(sem_t *sem);//V操作
信號量初始化——sem_init
#include<semaphore.h>
Int sem_init(sem_t *sem,int pshared,unsigned int value);
成功時返回0,失敗時EOF
Sem指向要初始化的信號量對象
Pshared 0-線程間 1-進程間
Val 信號量初值(非負)
信號量——P/V操作
#include<semaphore.h>
Int sem_wait(sem_t *sem);//P操作
Int sem_post(sem_t *sem);//V操作
成功時返回0,失敗時EOF
Sem指向要操作的信號量對象