目錄
- CPU
- 核心
- 超線程技術
- 進程
- 線程
- 并行與并行
- 進程與線程的區(qū)別
- 操作系統(tǒng)如何切換進程
- 多線程中的概念
- 守護進程概念
CPU
一個馮·諾伊曼結構的計算機主要硬件有主板,CPU法梯,內存苔货,外存,顯卡立哑,網卡夜惭,聲卡,電源铛绰,鍵盤诈茧,鼠標,顯示器等
CPU是一塊超大規(guī)模的集成電路捂掰,h是計算機的運算核心和控制核心敢会。
由三大部分組成運算器,寄存器这嚣,寄存器鸥昏。
CPU的個數很容易得到,多CPU通過主板上的總線進行連接疤苹。
核心
核心又稱內核(后文在習慣上講核心稱為內核)互广,是CPU的組成部分,用來完成所有的計算,儲存等任務惫皱,由單晶硅制成
超線程技術
這里需要知道的是在一個CPU中可能存在多個核心像樊,這些核心是相對獨立的CPU核心單元組
而超線程技術則是利用代碼手段在一個物理核上模擬兩個邏輯核,兩個邏輯核會有各自獨立的寄存器和APIC旅敷,但是共享物理核的執(zhí)行資源
可以看到這一個CPU是只有六個物理內核生棍,但是由于超線程技術OS認為它有12個內核
進程
進程是OS進行資源(CPU,內存媳谁,磁盤涂滴,IO,帶寬等)分配的最小單位
- 進程的特征:
- 動態(tài)性:進程是程序的一次執(zhí)行過程晴音,是臨時的柔纵,有生命期的,是動態(tài)產生锤躁,動態(tài)消亡的搁料;
- 并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行;
- 獨立性:進程是系統(tǒng)進行資源分配和調度的一個獨立單位
- 結構性:進程由程序系羞、數據和進程控制塊三部分組成郭计。
線程
值得一提的是,在早期的操作系統(tǒng)中并沒有線程的概念 椒振,進程是能擁有資源和獨立運行的最小單位昭伸,也是程序執(zhí)行的最小方式。任務調度采用的是時間片輪轉的搶占式調度方式澎迎,而進程是任務調度的最小單位,每個進程都有各自獨立的一塊內存,使得各個進程之間內存地址相互隔離庐杨。
隨著時代改變,由于進程與進程之間消耗過大嗡善,不在能滿足人們的需要辑莫,線程的概念就由此誕生:
線程是程序執(zhí)行中一個單一的順序控制流程,是程序執(zhí)行流的最小單元罩引,是處理器調度和分派的最小單位。
并發(fā)與并行
- 并發(fā):當有多個線程在操作時枝笨,且只有一個CPU時(由于只有一個CPU所有它不能同時運行一個以上的線程)袁铐,所以人們采取的方法是把CPU運行時間分為若干個時間段,將時間段分配給各個線程執(zhí)行横浑,在一個時間段的線程代碼運行時剔桨,其他線程處于掛起狀,這種方式稱為并發(fā)徙融。
- 并行當一個系統(tǒng)有一個以上CPU時洒缀,則線程的操作有可能并發(fā)。當一個CPU執(zhí)行一個線程時,另一個CPU可以執(zhí)行另一個線程树绩,兩個線程不搶占CPU資源同時進行萨脑,這種方式稱為并行。
由于CPU上的線程切換很快饺饭,所以并發(fā)看起來像是時運行
進程與線程的區(qū)別
- 線程是程序執(zhí)行的最小單位渤早,而進程是操作系統(tǒng)分配資源的最小單位;
- 一個進程可以由一個或多個多個線程組成瘫俊;
- 進程之間是相互獨立的鹊杖,而同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集扛芽、堆等)及一些進程級的資源(如打開文件和信號)骂蓖;
- 線程上下文切換要比進程快得多
操作系統(tǒng)如何切換進程
調度選擇下一個進程,得到下一個進程的PCB(Process Control Block)川尖,把上一個進程的執(zhí)行現場保存起來涯竟,把下一個進程的現場覆蓋到CPU對應的寄存器中去。多進程如何交替空厌?如何切換庐船?把上一個進程的執(zhí)行現場保存起來,把當前CPU中的寄存器信息等保存到上一個進程的PCB中嘲更,把選好的要執(zhí)行的進程(由進程調度確定)的PCB中的各寄存器信息恢復到當前CPU的寄存器中筐钟。
多進程中的概念
由于在同一時間只能運行一個線程,在多線程環(huán)境下線程的搶占式運行容易出現線程安全問題
人們因此想出了互斥機制來解決線程不安全的問題
而互斥機制的實現是通過互斥鎖實現的赋朦,基本步驟為:
- 加鎖
- 執(zhí)行臨界區(qū)代碼
- 釋放鎖
互斥鎖又叫掛起等待鎖篓冲,當線程取鎖失敗就會使其進入系統(tǒng)的等待隊列中
死鎖在多道程序環(huán)境中,多個進程可以競爭有限數量的資源宠哄。當一個進程申請資源時壹将,如果這時沒有可用資源,那么這個進程進入等待狀態(tài)毛嫉。有時诽俯,如果所申請的資源被其他等待進程占有,那么該等待進程有可能再也無法改變狀態(tài)承粤。在代碼中的體現為一個進程重復加鎖暴区。
守護進程概念
守護進程(Deamon)是運行在后臺的一種特殊進程,是進程的一種。它在后臺運行并且不受任何終端控制,獨立于控制終端并且周期性地執(zhí)行某種任務或等待處理某些發(fā)生的事件辛臊,常常在系統(tǒng)引導裝入時啟動仙粱,在系統(tǒng)關閉時停止。
代碼
#include<stdio.h>
#include<pthread.h>
#define THRAD_NUM 2
pthread_mutex_t mutex;
int g_count = 0;
void* ThreadEntry(void* arg){
(void)arg;
int i;
for(i=0;i<10;i++){
//如果鎖已經被其他線程獲取到了彻舰,當線程在想獲取伐割,就會在lock 函數阻塞
pthread_mutex_lock(&mutex);//上鎖
printf(" %d這是新線程輸出\n",g_count);
g_count++;
pthread_mutex_unlock(&mutex); //開鎖
}
return NULL;
}
int main(){
pthread_t tid[THRAD_NUM];//線程ID
pthread_mutex_init(&mutex,NULL);//互斥鎖初始化
int i;
for(i=0;i<THRAD_NUM;i++) {
pthread_create(&tid[i], NULL, ThreadEntry, NULL);
}
for(i=0;i<10;i++){
printf("%d這是主線程輸出\n",g_count);
g_count++;
}
for (i = 0; i < THRAD_NUM; ++i) { //釋放新線程
pthread_join(tid[i], NULL);
}
printf("%d", g_count);
// pthread_mutex_destory(&mutex);//互斥鎖釋放函數 ????這個函數用不了我也不知道什么情況
return 0;
}
程序截圖