2018-2019-1 20165202 《資訊安全系統設計基礎》第八週學習總結
本週學習內容
一、執行緒概念
執行緒就是是程式的一個控制流程,從程式碼的角度來看,它控制著一個函式的執行;
說複雜點,在linux下,它就是一個程序(僅限linux),因為在linux下對於執行緒並沒有特別的資料結構去描述它。
簡而言之,執行緒是程式碼的一個執行流。
二、執行緒與程序的區別
執行緒與程序的區別,總結一下有以下區別:
1.執行緒強調的是資源共享,因為與主執行緒共享PCB;程序強調的是獨立性,因為每個獨立的程序有各自獨立的PCB。
2.也正因為如此,建立一個執行緒的開銷要比建立程序的開銷要小。
3.多執行緒程式,只要有一個執行緒出現異常,其他執行緒都會被"誅連",導致程式異常出錯。多程序程式,各程序之間獨立,不會彼此影響。
三、執行緒控制
因為執行緒不屬於系統呼叫,因此需要用到pthread.h庫。
1.建立執行緒
#include <pthread.h>
int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);
//thread:執行緒id,返回型引數
//attr:執行緒屬性
//start_routine:所要執行的的函式(返回值void*,引數為void*)
//arg:函式的引數
2.終止執行緒
有三種方法可以終止一個執行緒:
a.通過return返回,對主執行緒不適用。
b.一個執行緒可以呼叫pthread_cancel終止其它執行緒。
c.呼叫pthread_exit終止自己。
void pthread_exit (void*retval);
//retval:返回值,可以返回給pthread_join函式
3.執行緒等待
根據執行緒的終止情況不同,pthread_join有以下三種情況:
a.如果執行緒通過return返回,則retval中存放執行緒的返回值。
b.如果執行緒被異常終止,則retval中存放的是PTHREAD_CANCELED。
c.如果執行緒通過pthread_exit終止,則retval中存放的是pthread_exit的引數。
int pthread_join(pthread_t pthread,void **retval);
//pthread:需要等待的執行緒id
//retval:帶回的引數
//成功返回0,失敗返回錯誤號
4.執行緒的分離與結合
對於任意時間點,執行緒都是可分離的或者可結合的。
可結合的執行緒可以被其他執行緒收回資源或者殺死,在其他執行緒回收資源之前,它的資源是不會被釋放的。
可分離的執行緒不能被其他執行緒回收或殺死,其資源是自動釋放的。
預設情況下,執行緒都是可結合的。
如果一個可結合的執行緒執行完畢,沒有被其他執行緒回收資源,那麼它就會導致類似於殭屍程序的情況。
當有執行緒呼叫pthread_join回收其它執行緒時,如果其他執行緒沒有執行結束,則呼叫者會阻塞,為了避免這種情況,我們可以將該執行緒分離出去。
分離執行緒需要呼叫:
int pthread_detach(thread_id); //一般是分離自己pthread_detach(pthread_self);
這樣的話,就不必主執行緒去回收其資源,該執行緒執行完畢,會自動釋放所有的資源。
本週學習問題總結
問題1:
作業系統的問題:使用者級執行緒和核心級執行緒的區別聯絡?
解決方案1:
1.核心級執行緒:切換由核心控制,當執行緒進行切換的時候,由使用者態轉化為核心態。切換完畢要從核心態返回使用者態;可以很好的利用smp,即利用多核cpu。windows執行緒就是這樣的。
2.使用者級執行緒核心的切換由使用者態程式自己控制核心切換,不需要核心干涉,少了進出核心態的消耗,但不能很好的利用多核Cpu,目前Linux pthread大體是這麼做的。
課堂測試補交
2017-2018-1 20155313 《資訊安全系統設計基礎》第八週課堂測試
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 20篇 | 400小時 | |
第一週 | 100/100 | 1/1 | 5/5 | |
第二週 | 100/200 | 2/3 | 5/10 | |
第三週 | 100/300 | 2/5 | 5/15 | |
第四周 | 100/400 | 1/6 | 5/20 | |
第六週 | 100/500 | 1/7 | 5/25 | |
第七週 | 100/600 | 1/8 | 5/30 | |
第八週 | 800/1400 | 3/11 | 10/40 |