99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

要弄懂多線程,這就要牽涉到多進(jìn)程?

GReq_mcu168 ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 2020-08-04 17:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

(1)單CPU下的多線程

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

1)按照優(yōu)先級(jí)調(diào)度

2)按照FIFO調(diào)度

3)按照時(shí)間片調(diào)度等等

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

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

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.};

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

這時(shí)候,可能有朋友會(huì)問(wèn)了,既然task_struct是資源分配的主體,那為什么又出來(lái)thread?為什么系統(tǒng)調(diào)度的時(shí)候是按照thread調(diào)度,而不是按照進(jìn)程調(diào)度呢?原因其實(shí)很簡(jiǎn)單,進(jìn)程之間的數(shù)據(jù)溝通非常麻煩,因?yàn)槲覀冎园堰@些進(jìn)程分開(kāi),不正是希望它們之間不要相互影響嘛。

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

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

2)訪問(wèn)共享內(nèi)存->系統(tǒng)調(diào)用->讀取數(shù)據(jù)

3)寫(xiě)入共享內(nèi)存->系統(tǒng)調(diào)用->寫(xiě)入數(shù)據(jù)

要是寫(xiě)個(gè)代碼,大家可能就更明白了,

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.}

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

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

(2)多核CPU下的多線程

沒(méi)有出現(xiàn)多核之前,我們的CPU實(shí)際上是按照某種規(guī)則對(duì)線程依次進(jìn)行調(diào)度的。在某一個(gè)特定的時(shí)刻,CPU執(zhí)行的還是某一個(gè)特定的線程。然而,現(xiàn)在有了多核CPU,一切變得不一樣了,因?yàn)樵谀骋粫r(shí)刻很有可能確實(shí)是n個(gè)任務(wù)在n個(gè)核上運(yùn)行。我們可以編寫(xiě)一個(gè)簡(jiǎn)單的open mp測(cè)試一下,如果還是一個(gè)核,運(yùn)行的時(shí)間就應(yīng)該是一樣的。

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)有的是為了提高運(yùn)行的速度,比如多核cpu下的多線程

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

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

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

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

    關(guān)注

    68

    文章

    11083

    瀏覽量

    217188
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7154

    瀏覽量

    125647
  • 多線程編程
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    6821

原文標(biāo)題:多核CPU下的多線程編程原來(lái)是這么回事...

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HI1105定頻測(cè)試指令

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

    多線程的安全注意事項(xiàng)

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

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

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

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

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

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

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

    請(qǐng)問(wèn)如何在Python中實(shí)現(xiàn)多線程多進(jìn)程的協(xié)作?

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

    請(qǐng)問(wèn)rt-thread studio如何進(jìn)行多線程編譯?

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

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

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

    迅為3A6000_7A2000開(kāi)發(fā)板龍芯全國(guó)產(chǎn)處理器與龍芯 3A5000完全兼容

    /140 分;SPEC CPU 2017 base 單線程(rate1)定/浮點(diǎn)分值分別達(dá)到 5.05/7.78 分,單進(jìn)程多線程(speed)定/浮點(diǎn)分值分別達(dá)到 6.66/18.1 分,
    發(fā)表于 11-19 11:15

    socket 多線程編程實(shí)現(xiàn)方法

    是指在同一個(gè)進(jìn)程中運(yùn)行多個(gè)線程,每個(gè)線程可以獨(dú)立執(zhí)行任務(wù)。線程共享進(jìn)程的資源,如內(nèi)存空間和文件句柄,但每個(gè)
    的頭像 發(fā)表于 11-12 14:16 ?1027次閱讀

    一文搞懂Linux進(jìn)程的睡眠和喚醒

    機(jī)制 1)信號(hào)(Signal): 進(jìn)程可以通過(guò)接受特定信號(hào)被喚醒。 2)條件變量(Condition Variable): 多線程編程中用于同步多個(gè)線程的工具,可以讓一個(gè)線程在某些
    發(fā)表于 11-04 15:15

    Python中多線程多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python中多線程多進(jìn)程的概念、區(qū)別以及如何使用
    的頭像 發(fā)表于 10-23 11:48 ?1028次閱讀
    Python中<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>的區(qū)別

    迅為3A6000_7A2000核心主板龍芯全國(guó)產(chǎn)處理器LoongArch架構(gòu)

    /140 分;SPEC CPU 2017 base 單線程(rate1)定/浮點(diǎn)分值分別達(dá)到 5.05/7.78 分,單進(jìn)程多線程(speed)定/浮點(diǎn)分值分別達(dá)到 6.66/18.1 分,
    發(fā)表于 10-12 11:25

    一文掌握Python多線程

    使用線程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1284次閱讀

    LWIP多線程強(qiáng)烈建議開(kāi)啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面怎么實(shí)現(xiàn)?

    LWIP多線程強(qiáng)烈建議開(kāi)啟LWIP_ASSERT_CORE_LOCKED宏,這個(gè)在RTT里面怎么實(shí)現(xiàn),之前參考網(wǎng)上代碼,這樣寫(xiě),壓力測(cè)試下有概率斷言失敗 extern sys_mutex_t
    發(fā)表于 07-25 06:27