摘要:線程使用的是堆外內(nèi)存空間。也就是說(shuō),進(jìn)程內(nèi)部會(huì)嘗試?yán)玫膬?nèi)核線程去參與實(shí)際的調(diào)度,而自己使用調(diào)用作為中間橋梁與自己的程序進(jìn)行交互。基于用戶線程,的實(shí)現(xiàn)是否可以沒(méi)有中間這一層映射,自己的線程直接由來(lái)調(diào)度,或許理論上效率更高。
序
一個(gè)線程的啟動(dòng)是需要通過(guò)Thread.start()方法來(lái)完成的(也只有start才完成一個(gè)線程的真正創(chuàng)建,new Thread不算),這個(gè)方法會(huì)調(diào)用本地方法JNI來(lái)實(shí)現(xiàn)一個(gè)真正意義上的線程,或者說(shuō)只有start成功調(diào)用后由OS分配線程資源,才能叫做線程,而在JVM中分配的Thread對(duì)象只是與只對(duì)應(yīng)的外殼。
輕量級(jí)進(jìn)程線程為輕量級(jí)進(jìn)程,多個(gè)線程共享一個(gè)進(jìn)程資源,對(duì)于OS的許多資源的分配和管理(例如內(nèi)存)通常都是進(jìn)程級(jí)別的,線程只是OS調(diào)度的最小單位,線程相對(duì)進(jìn)程更加輕量一些,它的上下文信息會(huì)更少,它的創(chuàng)建與銷毀會(huì)更加簡(jiǎn)單,線程因?yàn)槟撤N原因掛起后不會(huì)導(dǎo)致整個(gè)進(jìn)程被掛起,一個(gè)進(jìn)程中又可以分配許多的線程。但是某個(gè)線程占用過(guò)多資源會(huì)導(dǎo)致整個(gè)進(jìn)程宕機(jī)。線程使用的是堆外內(nèi)存空間。
啟動(dòng)線程start方法怎么啟動(dòng)線程的:
(1)基于Kernel Thread(KLT)的映射來(lái)實(shí)現(xiàn)(Java采用此方案)KLT是內(nèi)核線程,內(nèi)核線程由OS直接完成調(diào)度切換,它相對(duì)應(yīng)用程序的線程來(lái)講只是一個(gè)接口,外部程序會(huì)使用一種輕量級(jí)進(jìn)程(Light Weight Process,LWP)來(lái)與KLT進(jìn)行一對(duì)一的接口調(diào)用。也就是說(shuō),進(jìn)程內(nèi)部會(huì)嘗試?yán)肙S的內(nèi)核線程去參與實(shí)際的調(diào)度,而自己使用API調(diào)用作為中間橋梁與自己的程序進(jìn)行交互。
(2)基于用戶線程(User Thread,UT)的實(shí)現(xiàn)是否可以沒(méi)有中間這一層映射,自己的線程直接由CPU來(lái)調(diào)度,或許理論上效率更高。不過(guò)這樣實(shí)現(xiàn)時(shí),用戶進(jìn)程需要關(guān)注的抽象層次會(huì)更低一些,跳過(guò)OS更加接近CPU,即自己要去做許多OS要做的事情,自然的OS的調(diào)度算法、創(chuàng)建、銷毀、上下文切換、掛起等等都要自己要搞定(CPU只做計(jì)算),這樣做顯然很麻煩,有人嘗試了,后來(lái)放棄了。
(3)混合實(shí)現(xiàn)方式設(shè)計(jì)理念是既希望保留Kernel線程原有的架構(gòu),又想使用用戶線程,輕量級(jí)進(jìn)程依然與Kernel線程一一對(duì)應(yīng),唯一的變化就是輕量級(jí)進(jìn)程不再與進(jìn)程直接掛鉤,而是與用戶線程掛鉤,用戶線程不一定必須與輕量級(jí)進(jìn)程一一對(duì)應(yīng),而是多對(duì)多,就像在使用一個(gè)輕量級(jí)進(jìn)程列表一樣,增加了一層來(lái)解除輕量級(jí)進(jìn)程與原進(jìn)程之間的耦合。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65737.html
摘要:內(nèi)存之間的交互關(guān)于主內(nèi)存和工作內(nèi)存之間的具體交互協(xié)議,內(nèi)存模型定義了中操作來(lái)完成,虛擬機(jī)實(shí)現(xiàn)的時(shí)候必須保證每個(gè)操作都是原子的,不可分割的對(duì)于和有例外鎖定作用于主內(nèi)存變量,代表一個(gè)變量是一條線程獨(dú)占。 并發(fā)不一定依賴多線程,但是在java里面談?wù)摬l(fā),大多與線程脫不開關(guān)系。 線程是大多是面試都會(huì)問(wèn)到的問(wèn)題。我們都知道,線程是比進(jìn)程更輕量級(jí)的調(diào)度單位,線程之間可以共享內(nèi)存。之前面試的時(shí)候,...
摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒(méi)有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...
摘要:多線程和并發(fā)問(wèn)題是技術(shù)面試中面試官比較喜歡問(wèn)的問(wèn)題之一。線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。 多線程和并發(fā)問(wèn)題是 Java 技術(shù)面試中面試官比較喜歡問(wèn)的問(wèn)題之一。在這里,從面試的角度列出了大部分重要的問(wèn)題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識(shí)來(lái)對(duì)應(yīng)日后碰到的問(wèn)題。(...
摘要:線程的可能實(shí)現(xiàn)方式基本上主流的操作系統(tǒng)都支持線程,也提供了線程的實(shí)現(xiàn)。使用用戶線程和內(nèi)核線程混合實(shí)現(xiàn)在這種混合實(shí)現(xiàn)下,既存在用戶線程,也存在內(nèi)核線程。 進(jìn)程與線程 在傳統(tǒng)的操作系統(tǒng)中,最核心的概念是進(jìn)程,進(jìn)程是對(duì)正在運(yùn)行的程序的一個(gè)抽象。進(jìn)程的存在讓并行成為了可能,在一個(gè)操作系統(tǒng)中,允許運(yùn)行著多個(gè)進(jìn)程,這些進(jìn)程看起來(lái)是同時(shí)在運(yùn)行的。如果我們的計(jì)算機(jī)同時(shí)運(yùn)行著 web 瀏覽器、電子郵件客...
摘要:多線程環(huán)境下的一些問(wèn)題安全性問(wèn)題在沒(méi)有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。一些相關(guān)概念競(jìng)爭(zhēng)條件多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。 入口 Java多線程的應(yīng)用復(fù)雜性之如jvm有限的幾個(gè)內(nèi)存方面的操作和規(guī)范,就像無(wú)數(shù)紛繁復(fù)雜的應(yīng)用邏輯建立在有限的指令集上。 如何寫出線程安全的程序,有...
摘要:下面是線程相關(guān)的熱門面試題,你可以用它來(lái)好好準(zhǔn)備面試。線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。持有自旋鎖的線程在之前應(yīng)該釋放自旋鎖以便其它線程可以獲得自旋鎖。 最近看到網(wǎng)上流傳著,各種面試經(jīng)驗(yàn)及面試題,往往都是一大堆技術(shù)題目貼上去,而沒(méi)有答案。 不管你是新程序員還是老手,你一定在面試中遇到過(guò)有關(guān)線程的問(wèn)題。Java語(yǔ)言一個(gè)重要的特點(diǎn)就是內(nèi)置了對(duì)并發(fā)的支持,讓Java大受企業(yè)和程序員...
閱讀 3275·2021-09-30 09:47
閱讀 2290·2021-09-10 10:51
閱讀 1889·2021-09-08 09:36
閱讀 2926·2019-08-30 12:56
閱讀 3027·2019-08-30 11:16
閱讀 2622·2019-08-29 16:40
閱讀 2994·2019-08-29 15:25
閱讀 1632·2019-08-29 11:02