瞭解到linux下的進程後,就會想知道linux下的線程究竟是如何實現的,進程是針對資源調度的,linux下是資源調度的基本單位,既然已經有了進程,多進程的概念,那麼爲何會有線程要被使用與誕生呢?
1.線程概念;
線程就是進程中的一條執行流,是CPU調度的基本單位,在liunx下是一個輕量級進程
Linux下的線程是經過pcb實現的,pcb是程序運行的動態描述,經過這個描述,系統實現程序運行的調度,
一個進程能夠有多個線程,用於執行不一樣的任務事件,這些線程會共享進程的大部分資源,相較於傳統的pcb更加的輕量化(ps:若是對輕量話有疑問的話,後續會詳細描述),所以也被稱爲輕量級進程
對於linux來講,咱們有必要知道,在linux的本質上,是沒有專門設置線程這樣的概念的,咱們所認爲的線程,在必定程度上仍是屬於進程的範圍,可是它更小,實現雖然都是pcb,可是建立pcb得時候兩者有很明顯差異;主要體如今內存與虛擬內存的區別
要注意咱們使用linux下的進程的時候,咱們用的不是系統調用,而是前輩大佬們封裝的庫函數!linux
2.線程的獨有與共享;
線程獨有;線程棧 ,寄存器, 優先級, 信號屏蔽字, 標識符,erron;
共享:虛擬地址空間, 信號處理方式,文件描述表,工做路徑安全
3.多線程與多進程進行多任務處理的優缺點分析;
優勢:
(1).線程間通訊更加靈活,處理進程能夠有的通訊方式,由於共享虛擬內存的緣由,也能夠直接通訊。
(2)線程的建立於銷燬的成本更低;(較之進程來講,輕量話的概念,建立時只需建立一個struct(文件描述符pcb),指向虛擬內存空間)
(3)同一進程中的線程間切換更加方便(資源共享)
缺點
(1)健壯性低,線程崩掉會致使進程崩掉,而進程崩掉不會卻是程序崩掉,並且維護線程的意義並不大
(2) 線程調用時,有些系統調用會對進程產生效果;
總的來講,多執行流進行多任務處理會有效提升處理效率,對於cpu密集型程序來講,對cpu利用更加充分;對於io密集型程序來講,能夠同時發起io操做減小io阻塞時間,提升效率
4.線程控制;
線程控制能夠細分爲: 建立 終止 等待 分離
線程控制的接口,操做系統沒有直接提供,線程的接口是大佬封裝的庫函數。
建立:
`int pthread_create(pthread_t tid,pthread_attr_t attr)`;
void(thread_routine)(void arg),void* arg;
;
每個線程,在內核中都對應了一個pcb輕量級進程;
pcb->pid --輕量級進程ID-LWP;
pcb->tgid - 線程組ID,默認等於主線程ID;
咱們需特別注意,tid 是一個地址,指向線程用戶態描述棧等資源;多線程
線程終止:退出線程的方式-如何退出線程
1.線程入口函數執行return,(對於主控線程來講,return 會退出整個進程),線程入口函數執行完畢,線程就會退出
2.使用庫函數:
void pthread_exit(void retval)
retval:做爲線程的退出返回值
此庫函數能夠在任何地方,只有有線程調用了,就會退出
3.使用庫函數int pthread_cancel(pthread_t tid);
tid:一個指定的線程ID;返回值是PTHREAD_CANCELED
取消一個線程,傳入tid退出此線程;只有當全部的線程退出完畢後,進程纔會退出
主線程退出也並不會致使進程退出(進程退出就意味着資源的釋放)
線程的等待:
線程在默認狀況下,退出後資源也不會被回收,須要等待其餘線程被釋放,獲取退出線程的返回值,釋放資源int pthread_jion(pthread_t tid,void **retval)
阻塞接口
固然,也不是說,線程是非要被等待的
在線程的屬性中,有一個分離屬性,默認值是-joinable,處於這個狀態的線程,退出後不會自動釋放資源,須要被等待,
這也就給咱們啓示,在實際使用中,咱們須要自行設置所建立的線程屬性ide
線程的分離:
設置線程的分離屬性爲detach屬性,處於detach屬性的線程退出後自動釋放資源,不須要等待
注意:只有當程序猿不關心線程的返回值,而且也不想等待線程退出,纔會分離線程
線程的安全:多個線程對臨界資源的訪問操做是安全的函數
線程安全的實現:同步與互斥
同步:使多個線程按照某種規則時序,實現對臨界資源訪問的合理性
互斥:同一時間是有一個線程可以訪問臨界資源,實現訪問安全操作系統
互斥的實現:互斥鎖
同步的是實現: 信號量 條件變量線程