国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

多核CPU下的多線程編程原來是這么回事...

發(fā)布時間:2017-4-25 11:40    發(fā)布者:技術(shù)小白
關(guān)鍵詞: cpu , 多線程
多線程編程是現(xiàn)代軟件技術(shù)中很重要的一個環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進(jìn)程?當(dāng)然,要了解到多進(jìn)程,就要涉及到操作系統(tǒng)。不過大家也不要緊張,聽我慢慢道來。這其中的環(huán)節(jié)其實并不復(fù)雜。
(1)單CPU下的多線程
在沒有出現(xiàn)多核CPU之前,我們的計算資源是唯一的。如果系統(tǒng)中有多個任務(wù)要處理的話,那么就需要按照某種規(guī)則依次調(diào)度這些任務(wù)進(jìn)行處理。什么規(guī)則呢?可以是一些簡單的調(diào)度方法,比如說

    1)按照優(yōu)先級調(diào)度
    2)按照FIFO調(diào)度
    3)按照時間片調(diào)度等等
當(dāng)然,除了CPU資源之外,系統(tǒng)中還有一些其他的資源需要共享,比如說內(nèi)存、文件、端口、socket等。既然前面說到系統(tǒng)中的資源是有限的,那么獲取這些資源的最小單元體是什么呢,其實就是進(jìn)程。

舉個例子來說,在Linux上面每一個享有資源的個體稱為task_struct,實際上和我們說的進(jìn)程是一樣的。我們可以看看task_struct(linux 0.11代碼)都包括哪些內(nèi)容,
1. struct task_struct {  
2. /* these are hardcoded - don't touch */  
3.     long state; /* -1 unrunnable, 0 runnable, >0 stopped */  
4.     long counter;  
5.     long priority;  
6.     long signal;  
7.     struct sigaction sigaction[32];  
8.     long blocked;   /* bitmap of masked signals */  
9. /* various fields */  
10.     int exit_code;  
11.     unsigned long start_code,end_code,end_data,brk,start_stack;  
12.     long pid,father,pgrp,session,leader;  
13.     unsigned short uid,euid,suid;  
14.     unsigned short gid,egid,sgid;  
15.     long alarm;  
16.     long utime,stime,cutime,cstime,start_time;  
17.     unsigned short used_math;  
18. /* file system info */  
19.     int tty;        /* -1 if no tty, so it must be signed */  
20.     unsigned short umask;  
21.     struct m_inode * pwd;  
22.     struct m_inode * root;  
23.     struct m_inode * executable;  
24.     unsigned long close_on_exec;  
25.     struct file * filp[NR_OPEN];  
26. /* ldt for this task 0 - zero 1 - cs 2 - ds&ss */  
27.     struct desc_struct ldt[3];  
28. /* tss for this task */  
29.     struct tss_struct tss;  
30. };  
每一個task都有自己的pid,在系統(tǒng)中資源的分配都是按照pid進(jìn)行處理的。這也就說明,進(jìn)程確實是資源分配的主體。

這時候,可能有朋友會問了,既然task_struct是資源分配的主體,那為什么又出來thread?為什么系統(tǒng)調(diào)度的時候是按照thread調(diào)度,而不是按照進(jìn)程調(diào)度呢?原因其實很簡單,進(jìn)程之間的數(shù)據(jù)溝通非常麻煩,因為我們之所以把這些進(jìn)程分開,不正是希望它們之間不要相互影響嘛。

假設(shè)是兩個進(jìn)程之間數(shù)據(jù)傳輸,那么需要如果需要對共享數(shù)據(jù)進(jìn)行訪問需要哪些步驟呢

1)創(chuàng)建共享內(nèi)存  
2)訪問共享內(nèi)存->系統(tǒng)調(diào)用->讀取數(shù)據(jù)
3)寫入共享內(nèi)存->系統(tǒng)調(diào)用->寫入數(shù)據(jù)
要是寫個代碼,大家可能就更明白了,
1. #include   
2. #include   
3.   
4. int value = 10;  
5.   
6. int main(int argc, char* argv[])  
7. {  
8.     int pid = fork();  
9.     if(!pid){  
10.         Value = 12;  
11.         return 0;  
12.     }  
13.     printf("value = %d\n", value);  
14.     return 1;  
15. }  
上面的代碼是一個創(chuàng)建子進(jìn)程的代碼,我們發(fā)現(xiàn)打印的value數(shù)值還是10。盡管中間創(chuàng)建了子進(jìn)程,修改了value的數(shù)值,但是我們發(fā)現(xiàn)打印下來的數(shù)值并沒有發(fā)生改變,這就說明了不同的進(jìn)程之間內(nèi)存上是不共享的。
那么,如果修改成thread有什么好處呢?其實最大的好處就是每個thread除了享受單獨(dú)cpu調(diào)度的機(jī)會,還能共享每個進(jìn)程下的所有資源。要是調(diào)度的單位是進(jìn)程,那么每個進(jìn)程只能干一件事情,但是進(jìn)程之間是需要相互交互數(shù)據(jù)的,而進(jìn)程之間的數(shù)據(jù)都需要系統(tǒng)調(diào)用才能應(yīng)用,這在無形之中就降低了數(shù)據(jù)的處理效率。
(2)多核CPU下的多線程
沒有出現(xiàn)多核之前,我們的CPU實際上是按照某種規(guī)則對線程依次進(jìn)行調(diào)度的。在某一個特定的時刻,CPU執(zhí)行的還是某一個特定的線程。然而,現(xiàn)在有了多核CPU,一切變得不一樣了,因為在某一時刻很有可能確實是n個任務(wù)在n個核上運(yùn)行。我們可以編寫一個簡單的open mp測試一下,如果還是一個核,運(yùn)行的時間就應(yīng)該是一樣的。
1. #include   
2. #define MAX_VALUE 10000000  
3.   
4. double _test(int value)  
5. {  
6.     int index;  
7.     double result;  
8.   
9.     result = 0.0;  
10.     for(index = value + 1; index < MAX_VALUE; index +=2 )  
11.         result += 1.0 / index;  
12.   
13.     return result;  
14. }  
15.   
16. void test()  
17. {  
18.     int index;  
19.     int time1;  
20.     int time2;  
21.     double value1,value2;  
22.     double result[2];  
23.   
24.     time1 = 0;  
25.     time2 = 0;  
26.   
27.     value1 = 0.0;  
28.     time1 = GetTickCount();  
29.     for(index = 1; index < MAX_VALUE; index ++)  
30.         value1 += 1.0 / index;  
31.   
32.     time1 = GetTickCount() - time1;  
33.   
34.     value2 = 0.0;  
35.     memset(result , 0, sizeof(double) * 2);  
36.     time2 = GetTickCount();  
37.   
38. #pragma omp parallel for  
39.     for(index = 0; index < 2; index++)  
40.         result[index] = _test(index);  
41.   
42.     value2 = result[0] + result[1];  
43.     time2 = GetTickCount() - time2;  
44.   
45.     printf("time1 = %d,time2 = %d\n",time1,time2);  
46.     return;  
47. }  
(3)多線程編程
為什么要多線程編程呢?這其中的原因很多,我們可以舉例解決

1)有的是為了提高運(yùn)行的速度,比如多核cpu下的多線程

2)有的是為了提高資源的利用率,比如在網(wǎng)絡(luò)環(huán)境下下載資源時,時延常常很高,我們可以通過不同的thread從不同的地方獲取資源,這樣可以提高效率

3)有的為了提供更好的服務(wù),比如說是服務(wù)器

4)其他需要多線程編程的地方等等


本文地址:http://www.qingdxww.cn/thread-362074-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 無線充電基礎(chǔ)知識及應(yīng)用培訓(xùn)教程3
  • 安靜高效的電機(jī)控制——這才是正確的方向!
  • 5分鐘詳解定時器/計數(shù)器E和波形擴(kuò)展!
  • PIC18-Q71系列MCU概述
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品亚洲永久免费精品 | 婷婷视频网| 女人18片毛片60分钟 | 99精品国产免费久久国语 | 日本www高清| 精品视频在线免费观看 | 年轻的馊子1中字hd 年轻的嫂子在线线观免费观看 | 亚洲黄色在线视频 | 亚洲另类视频 | 中文精品久久久久国产网站 | 成人午夜看片在线观看 | 国产欧美国产精品第一区 | 一级做a爰片久久毛片免费看 | 在线观看黄页网站 | 久久996国产精品免费 | 免费一级做a爰片久久毛片 免费一级在线观看 | 四虎影视免费在线 | 在线观看一区二区三区四区 | 手机看片午夜 | 欧美日韩国产在线 | 青青青在线观看国产精品 | 国产v精品欧美精品v日韩 | 日韩视频免费一区二区三区 | 亚洲欧美在线观看首页 | 青青青国产 | 国产第一页福利 | 扒丝袜basiwa影院首页 | 第四色播日韩第一页 | 丁香婷婷色 | 91精品国产色综合久久不卡蜜 | 亚洲一区二区三区四区在线 | 成人尤物 | 99在线观看免费视频 | 四虎最新网 | 四虎国产精品视频免费看 | 91精品福利麻豆专区 | 丝瓜榴莲绿巨人app大全 | 日韩一级高清 | 亚洲一区二区免费看 | 成人欧美视频免费看黄黄 | 毛片女人毛片一级毛片毛片 |