chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

要弄懂多線程,這就要牽涉到多進程?

GReq_mcu168 ? 來源:玩轉單片機 ? 2020-08-04 17:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

多線程編程是現(xiàn)代軟件技術中很重要的一個環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進程?當然,要了解到多進程,就要涉及到操作系統(tǒng)。不過大家也不要緊張,聽我慢慢道來。這其中的環(huán)節(jié)其實并不復雜。

(1)單CPU下的多線程

在沒有出現(xiàn)多核CPU之前,我們的計算資源是唯一的。如果系統(tǒng)中有多個任務要處理的話,那么就需要按照某種規(guī)則依次調度這些任務進行處理。什么規(guī)則呢?可以是一些簡單的調度方法,比如說

1)按照優(yōu)先級調度

2)按照FIFO調度

3)按照時間片調度等等

當然,除了CPU資源之外,系統(tǒng)中還有一些其他的資源需要共享,比如說內存、文件、端口、socket等。既然前面說到系統(tǒng)中的資源是有限的,那么獲取這些資源的最小單元體是什么呢,其實就是進程。

舉個例子來說,在Linux上面每一個享有資源的個體稱為task_struct,實際上和我們說的進程是一樣的。我們可以看看task_struct(linux 0.11代碼)都包括哪些內容,

1.structtask_struct{

2./*thesearehardcoded-don'ttouch*/

3.longstate;/*-1unrunnable,0runnable,>0stopped*/

4.longcounter;

5.longpriority;

6.longsignal;

7.structsigactionsigaction[32];

8.longblocked;/*bitmapofmaskedsignals*/

9./*variousfields*/

10.intexit_code;

11.unsignedlongstart_code,end_code,end_data,brk,start_stack;

12.longpid,father,pgrp,session,leader;

13.unsignedshortuid,euid,suid;

14.unsignedshortgid,egid,sgid;

15.longalarm;

16.longutime,stime,cutime,cstime,start_time;

17.unsignedshortused_math;

18./*filesysteminfo*/

19.inttty;/*-1ifnotty,soitmustbesigned*/

20.unsignedshortumask;

21.structm_inode*pwd;

22.structm_inode*root;

23.structm_inode*executable;

24.unsignedlongclose_on_exec;

25.structfile*filp[NR_OPEN];

26./*ldtforthistask0-zero1-cs2-ds&ss*/

27.structdesc_structldt[3];

28./*tssforthistask*/

29.structtss_structtss;

30.};

每一個task都有自己的pid,在系統(tǒng)中資源的分配都是按照pid進行處理的。這也就說明,進程確實是資源分配的主體。

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

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

1)創(chuàng)建共享內存

2)訪問共享內存->系統(tǒng)調用->讀取數(shù)據(jù)

3)寫入共享內存->系統(tǒng)調用->寫入數(shù)據(jù)

要是寫個代碼,大家可能就更明白了,

1.#include

2.#include

3.

4.intvalue=10;

5.

6.intmain(intargc,char*argv[])

7.{

8.intpid=fork();

9.if(!pid){

10.Value=12;

11.return0;

12.}

13.printf("value=%d ",value);

14.return1;

15.}

上面的代碼是一個創(chuàng)建子進程的代碼,我們發(fā)現(xiàn)打印的value數(shù)值還是10。盡管中間創(chuàng)建了子進程,修改了value的數(shù)值,但是我們發(fā)現(xiàn)打印下來的數(shù)值并沒有發(fā)生改變,這就說明了不同的進程之間內存上是不共享的。

那么,如果修改成thread有什么好處呢?其實最大的好處就是每個thread除了享受單獨cpu調度的機會,還能共享每個進程下的所有資源。要是調度的單位是進程,那么每個進程只能干一件事情,但是進程之間是需要相互交互數(shù)據(jù)的,而進程之間的數(shù)據(jù)都需要系統(tǒng)調用才能應用,這在無形之中就降低了數(shù)據(jù)的處理效率。

(2)多核CPU下的多線程

沒有出現(xiàn)多核之前,我們的CPU實際上是按照某種規(guī)則對線程依次進行調度的。在某一個特定的時刻,CPU執(zhí)行的還是某一個特定的線程。然而,現(xiàn)在有了多核CPU,一切變得不一樣了,因為在某一時刻很有可能確實是n個任務在n個核上運行。我們可以編寫一個簡單的open mp測試一下,如果還是一個核,運行的時間就應該是一樣的。

1.#include

2.#defineMAX_VALUE10000000

3.

4.double_test(intvalue)

5.{

6.intindex;

7.doubleresult;

8.

9.result=0.0;

10.for(index=value+1;index

11.result+=1.0/index;

12.

13.returnresult;

14.}

15.

16.voidtest()

17.{

18.intindex;

19.inttime1;

20.inttime2;

21.doublevalue1,value2;

22.doubleresult[2];

23.

24.time1=0;

25.time2=0;

26.

27.value1=0.0;

28.time1=GetTickCount();

29.for(index=1;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.#pragmaompparallelfor

39.for(index=0;index

40.result[index]=_test(index);

41.

42.value2=result[0]+result[1];

43.time2=GetTickCount()-time2;

44.

45.printf("time1=%d,time2=%d ",time1,time2);

46.return;

47.}

(3)多線程編程

為什么要多線程編程呢?這其中的原因很多,我們可以舉例解決

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

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11218

    瀏覽量

    222976
  • 操作系統(tǒng)

    關注

    37

    文章

    7329

    瀏覽量

    128651
  • 多線程編程
    +關注

    關注

    0

    文章

    17

    瀏覽量

    6922

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

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    多線程的系統(tǒng)

    ,開始多線程調度,不再返回 */ RTOSStart(); while(1);/* 程序不會執(zhí)行這里 */ } void ISR1(void) { /* 置位標志位 */ flag1
    發(fā)表于 12-08 07:55

    Linux多線程對比單線程的優(yōu)勢

    :「資源利用率」:通過多線程,可以更有效地利用CPU資源,特別是多核CPU?!覆⑿刑幚怼梗?b class='flag-5'>線程允許同時執(zhí)行多個任務,提高程序的執(zhí)行效率。「簡化設計」:使用線程可以簡化程序設計,因為線程
    發(fā)表于 12-01 06:11

    飛凌嵌入式ElfBoard-文件I/O的了解探究之競爭冒險

    競爭冒險(Race Condition)指的是在多線程多進程環(huán)境中,多個線程進程對共享資源進行訪問和修改時可能導致的不確定性結果或錯誤行為。競爭冒險通常發(fā)生在多個
    發(fā)表于 11-26 15:38

    rt-thread studio 如何進行多線程編譯?

    ,使用的是5800h+32g內存+sn550 ssd,開啟16線程編譯時cpu的占用率也只能到30%,編譯完整個工程需要3分鐘 感覺多線程編譯設置沒有生效,有辦法提高編譯速度嗎 rtthread studio版本是 2.2.9
    發(fā)表于 10-11 09:16

    多線程與多處理有何區(qū)別

    多處理也稱為進程進程是一個在自己的內存空間中運行的獨立程序。
    的頭像 發(fā)表于 09-16 14:21 ?392次閱讀

    【HZ-T536開發(fā)板免費體驗】—— linux創(chuàng)建線程

    任務,并行是多個處理器或多核處理器同時執(zhí)行不同的任務。 Linux系統(tǒng)中進行多線程編程時,會涉及線程和子線程的操作: 1)主線程是程序的
    發(fā)表于 09-01 21:31

    HI1105定頻測試指令

    HI1105模塊在無線圖傳,特別是遠距離無線圖傳領域有廣泛應用,產品認證過程需要牽涉到定頻測試,分享以下步驟參考! 主要牽涉到:11a測試、11n(H20)測試、11n(H40)測試、802.11ac 20測試、802.11ac 40測試、802.11ax 20測試、8
    的頭像 發(fā)表于 07-14 15:19 ?461次閱讀

    多線程的安全注意事項

    多線程安全是指多個線程同時訪問或修改共享資源時,能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進行多線程開發(fā)時,在TaskPool和Worker的工作線程中導
    發(fā)表于 06-20 07:49

    工控一體機多線程任務調度優(yōu)化:聚徽分享破解工業(yè)復雜流程高效協(xié)同密碼

    在當今工業(yè) 4.0 的浪潮下,工業(yè)生產正朝著高度自動化、智能化的方向大步邁進。生產流程日益復雜,眾多任務需要同時、高效地協(xié)同執(zhí)行,這對工業(yè)控制系統(tǒng)的核心 —— 工控一體機提出了前所未有的挑戰(zhàn)。多線程
    的頭像 發(fā)表于 05-28 14:06 ?487次閱讀

    一種實時多線程VSLAM框架vS-Graphs介紹

    針對現(xiàn)有VSLAM系統(tǒng)語義表達不足、地圖可解釋性差的問題,本文提出vS-Graphs,一種實時多線程VSLAM框架。該方案顯著提升了重建地圖的語義豐富度、可解釋性及定位精度。實驗表明
    的頭像 發(fā)表于 04-19 14:07 ?732次閱讀
    一種實時<b class='flag-5'>多線程</b>VSLAM框架vS-Graphs介紹

    Linux進程狀態(tài)詳解

    對應設備未就緒那么進程就要阻塞等待了。進程狀態(tài)變化的表現(xiàn)之一就是要在不同的隊列中進行流動,本質都是數(shù)據(jù)結構的增刪查改!
    的頭像 發(fā)表于 04-01 09:46 ?815次閱讀
    Linux<b class='flag-5'>進程</b>狀態(tài)詳解

    進程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    各位程序員朋友(和假裝懂技術的同事):如果你在面試時被問到:\"請用奶茶店類比進程線程和協(xié)程\",而你回答:\"進程是老板,線程是員工,協(xié)程是兼職...\"
    發(fā)表于 03-26 09:27

    請問如何在Python中實現(xiàn)多線程多進程的協(xié)作?

    大家好!我最近在開發(fā)一個Python項目時,需要同時處理多個任務,且每個任務需要不同的計算資源。我想通過多線程多進程的組合來實現(xiàn)并發(fā),但遇到了一些問題。 具體來說,我有兩個任務,一個是I/O密集型
    發(fā)表于 03-11 06:57

    請問rt-thread studio如何進行多線程編譯?

    ,使用的是5800h+32g內存+sn550 ssd,開啟16線程編譯時cpu的占用率也只能到30%,編譯完整個工程需要3分鐘 感覺多線程編譯設置沒有生效,有辦法提高編譯速度嗎
    發(fā)表于 02-19 08:30

    迅為3A6000開發(fā)板/龍芯3A6000與龍芯3A5000等龍架構處理器軟件兼容

    /140 分;SPEC CPU 2017 base 單線程(rate1)定/浮點分值分別達到 5.05/7.78 分,單進程多線程(speed)定/浮點分值分別達到 6.66/18.1 分,
    發(fā)表于 02-12 15:06