成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java編程思想之多線程(一)

taohonghui / 1688人閱讀

摘要:多線程技術(shù)是個(gè)很龐大的課題,編程思想這本書英文版,以下簡(jiǎn)稱中也用了頁(yè)介紹的多線程體系。一個(gè)線程歸屬于唯一的進(jìn)程,線程無(wú)法脫離進(jìn)程而存在。五線程內(nèi)數(shù)據(jù)線程的私有數(shù)據(jù)僅歸屬于一個(gè)線程,不在線程之間共享,例如,,。

多線程技術(shù)是個(gè)很龐大的課題,《Java編程思想》這本書(英文版,以下簡(jiǎn)稱TIJ)中也用了136頁(yè)介紹Java的多線程體系。的確,Java語(yǔ)言發(fā)展到今天,多線程機(jī)制相比其他的語(yǔ)言從穩(wěn)定性,API的豐富度上絕對(duì)是數(shù)一數(shù)二的了。TIJ從Java語(yǔ)言的視角向我們展示了如何高效、正確地使用java api,但同時(shí)又不失普遍性,其中介紹的變量的原子性(atomicity)、可見(jiàn)性(visibility),多線程的資源競(jìng)爭(zhēng)(resource contention),線程中斷(interruption),線程之間的協(xié)作(cooperation),多線程編程的一些實(shí)踐法則等對(duì)其他語(yǔ)言的程序員也具有很高的參考意義。
但限于篇幅,TIJ并未從操作系統(tǒng)的角度對(duì)線程作更多更深入的介紹,本系列文章試著由底向上,1)從操作系統(tǒng)的角度來(lái)理解線程,2)從JVM的層面來(lái)學(xué)習(xí)線程,3)借助其他語(yǔ)言的多線程機(jī)制來(lái)對(duì)比深入、熟練底掌握J(rèn)ava多線程編程。

本篇先從底層操作系統(tǒng)的視角重溫下線程相關(guān)的理論知識(shí)。
一、引入線程(thread)的目的
“同步”執(zhí)行多個(gè)任務(wù),提高資源使用效率,提升任務(wù)執(zhí)行速率?!巴健痹趩蜟PU環(huán)境下是個(gè)模擬并行的過(guò)程;在多CPU和多核CPU場(chǎng)景下,能夠真正并行執(zhí)行。單CPU場(chǎng)景下通過(guò)線程模擬多任務(wù)并行執(zhí)行;充分利用硬件資源,例如:讀取/寫入文件或網(wǎng)絡(luò),可由不同的CPU、不同的CPU核并行執(zhí)行。見(jiàn)圖一。

當(dāng)然,引入多線程后,相應(yīng)就要增加線程的調(diào)度(thread scheduling),上下文切換(context switching),額外的儲(chǔ)存空間(例如:線程棧,線程控制區(qū)等)。

二、進(jìn)程(process)的定義
進(jìn)程是程序(Program)在操作系統(tǒng)(Operation system)上的一次執(zhí)行,它有自己的虛擬地址空間。例如:運(yùn)行一個(gè)java程序,打開(kāi)IDE,操作系統(tǒng)都會(huì)為我們生成一個(gè)或多個(gè)進(jìn)程。

三、線程的定義
線程是進(jìn)程的一個(gè)子集,是進(jìn)程中的一段代碼。一個(gè)線程包括代碼段(code segment)、數(shù)據(jù)段(data segment)、寄存器(registers)、程序計(jì)算器(PC,program counter)、棧指針(SP,stack pointer)和線程控制區(qū)(TCB,Thread Control Block,存儲(chǔ)thread context,包括線程的PC,Register,SP等的數(shù)據(jù)結(jié)構(gòu)),上述數(shù)據(jù)結(jié)構(gòu)和進(jìn)程類似,因此線程也被稱為輕量級(jí)進(jìn)程(LWP,lightweight process)。

四、進(jìn)程與線程之間的關(guān)系
進(jìn)程必需要有一個(gè)線程,而且該線程是一個(gè)內(nèi)核線程(kernel thread)(因?yàn)閗ernel調(diào)度的往往是線程)。該線程也是進(jìn)程啟動(dòng)時(shí)創(chuàng)建的第一個(gè)線程。而進(jìn)程的運(yùn)行,實(shí)際上是進(jìn)程中的線程在運(yùn)行,進(jìn)程只不過(guò)為線程提供了進(jìn)程地址空間(process address space),各種資源(file handler,socket等)。從這個(gè)角度來(lái)講進(jìn)程也是一個(gè)線程,一個(gè)為其他線程服務(wù)的線程。

TGID: thread group id也是進(jìn)程中第一個(gè)線程的id,即TID。利用fork或vfork或clone可以創(chuàng)建一個(gè)新的線程,如果不帶參數(shù)CLONE_THEAD,系統(tǒng)會(huì)創(chuàng)建一個(gè)新的線程,分配新的TID,這個(gè)TID也是新的TGID,而這個(gè)線程也是一個(gè)新的進(jìn)程。如果帶有參數(shù)CLONE_THEAD,則會(huì)在當(dāng)前進(jìn)程中創(chuàng)建一個(gè)新的線程,分配新的TID,而該線程的TGID和創(chuàng)建改線程的TGID保持一致。

一個(gè)線程歸屬于唯一的進(jìn)程,線程無(wú)法脫離進(jìn)程而存在。一個(gè)進(jìn)程中的多個(gè)線程共享相同的進(jìn)程空間,代碼段,數(shù)據(jù)段。見(jiàn)圖二。

五、線程內(nèi)數(shù)據(jù)
線程的私有數(shù)據(jù):僅歸屬于一個(gè)線程,不在線程之間共享,例如:PC,Stack,CP。
線程的共有數(shù)據(jù):程序代碼;全局變量;heap。

六、線程種類
內(nèi)核線程(kernel thread):顧名思義,內(nèi)核線程運(yùn)行在kernel的進(jìn)程空間,由kernel負(fù)責(zé)創(chuàng)建,分配進(jìn)程空間,創(chuàng)建TCB;線程之間的調(diào)度,線程的銷毀等也都運(yùn)行在內(nèi)核中。見(jiàn)圖三。

圖三:內(nèi)核線程(摘自:https://www.inf.ed.ac.uk/teac...)

用戶線程(user-level thread):用戶線程對(duì)kernel來(lái)說(shuō)是透明的,也就是kernel并不知道用戶線程的存在。見(jiàn)圖四。

圖四:用戶線程(摘自:https://www.inf.ed.ac.uk/teac...)
由圖四可以看出用戶線程通過(guò)內(nèi)核線程來(lái)執(zhí)行任務(wù)。而內(nèi)核線程和用戶線程都有哪些關(guān)系?用戶線程如何映射到內(nèi)核線程?程序(program)和進(jìn)程關(guān)系又是怎樣的?在下一篇詳細(xì)介紹。
關(guān)注公眾號(hào)“碼農(nóng)走向藝術(shù)”獲取更多原創(chuàng)文章。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77063.html

相關(guān)文章

  • 查找排序之多語(yǔ)言編程(JS/PHP/JAVA)

    摘要:三種方式寫了下常見(jiàn)的查找和排序,思想的本質(zhì)是一致的,語(yǔ)言的運(yùn)用有所不同罷了尷尬。 三種方式寫了下常見(jiàn)的查找和排序,思想的本質(zhì)是一致的,語(yǔ)言的運(yùn)用有所不同罷了PS:尷尬。真的有必要隨時(shí)切換語(yǔ)言來(lái)編程,否則還想個(gè)半天.就跟前后臺(tái)的模板引擎一樣,花樣太多. JS 二分查找 /** * @param v Number 要查找的值 * @param a Array 數(shù)組(有序的:升序,譬如[2...

    econi 評(píng)論0 收藏0
  • 查找排序之多語(yǔ)言編程(JS/PHP/JAVA)

    摘要:三種方式寫了下常見(jiàn)的查找和排序,思想的本質(zhì)是一致的,語(yǔ)言的運(yùn)用有所不同罷了尷尬。 三種方式寫了下常見(jiàn)的查找和排序,思想的本質(zhì)是一致的,語(yǔ)言的運(yùn)用有所不同罷了PS:尷尬。真的有必要隨時(shí)切換語(yǔ)言來(lái)編程,否則還想個(gè)半天.就跟前后臺(tái)的模板引擎一樣,花樣太多. JS 二分查找 /** * @param v Number 要查找的值 * @param a Array 數(shù)組(有序的:升序,譬如[2...

    canger 評(píng)論0 收藏0
  • 查找排序之多語(yǔ)言編程(JS/PHP/JAVA)

    摘要:三種方式寫了下常見(jiàn)的查找和排序,思想的本質(zhì)是一致的,語(yǔ)言的運(yùn)用有所不同罷了尷尬。 三種方式寫了下常見(jiàn)的查找和排序,思想的本質(zhì)是一致的,語(yǔ)言的運(yùn)用有所不同罷了PS:尷尬。真的有必要隨時(shí)切換語(yǔ)言來(lái)編程,否則還想個(gè)半天.就跟前后臺(tái)的模板引擎一樣,花樣太多. JS 二分查找 /** * @param v Number 要查找的值 * @param a Array 數(shù)組(有序的:升序,譬如[2...

    Alex 評(píng)論0 收藏0
  • Java并發(fā)編程之多線程線程

    摘要:目標(biāo)線程由運(yùn)行狀態(tài)轉(zhuǎn)換為就緒狀態(tài),也就是讓出執(zhí)行權(quán)限,讓其他線程得以優(yōu)先執(zhí)行,但其他線程能否優(yōu)先執(zhí)行時(shí)未知的。函數(shù)的官方解釋是意思是使調(diào)用該函數(shù)的線程讓出執(zhí)行時(shí)間給其他已就緒狀態(tài)的線程。 線程允許在同一個(gè)進(jìn)程中同時(shí)存在多個(gè)程序控制流,即通過(guò)線程可以實(shí)現(xiàn)同時(shí)處理多個(gè)任務(wù)的功能。線程會(huì)共享進(jìn)程范圍內(nèi)的資源,例如內(nèi)存句柄和文件句柄,但每個(gè)線程都有各自的程序計(jì)數(shù)器、棧以及局部變量。 多線程的實(shí)...

    wums 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<