linux進程與線程

進程

 進程有獨立的地址空間
 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指向要操作的信號量對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章