專利名稱:Java操作系統(tǒng)中線程的實(shí)現(xiàn)和線程狀態(tài)切換的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及Java操作系統(tǒng),尤其涉及一種Java操作系統(tǒng)中線程的實(shí)現(xiàn)和線程狀態(tài)切換的方法。
背景技術(shù):
在傳統(tǒng)的操作系統(tǒng)中,往往采用多進(jìn)程并發(fā)程序設(shè)計(jì)來解決并行技術(shù)、網(wǎng)絡(luò)技術(shù)和軟件技術(shù)發(fā)展帶來的要求,即創(chuàng)建并執(zhí)行多個進(jìn)程,按一定策略來調(diào)度和執(zhí)行各個進(jìn)程,以最大限度地利用計(jì)算機(jī)系統(tǒng)中的各種各樣的資源。這一方式當(dāng)然是可行的,但關(guān)鍵在于并行和并發(fā)的效率問題,采用這一方式來實(shí)現(xiàn)復(fù)雜的并發(fā)系統(tǒng)時(shí),會出現(xiàn)以下的缺點(diǎn)●進(jìn)程切換的開銷大,頻繁的進(jìn)程調(diào)度將耗費(fèi)大量時(shí)間。
●進(jìn)程之間通信的代價(jià)大,每次通信均要涉及通信進(jìn)程之間以及通信進(jìn)程與操作系統(tǒng)之間的切換。
●進(jìn)程之間的并發(fā)性粒度較粗,并發(fā)度不高,過多的進(jìn)程切換和通信使得細(xì)粒度的并發(fā)得不償失。
●不適合并行計(jì)算和分布并行計(jì)算的要求。對于多處理器和分布式的計(jì)算環(huán)境來說,進(jìn)程之間大量頻繁的通信和切換過程,會大大降低并行度。
●不適合客戶/服務(wù)器計(jì)算的要求。對于C/S結(jié)構(gòu)來說,那些需要頻繁輸入輸出并同時(shí)大量計(jì)算的服務(wù)器進(jìn)程很難體現(xiàn)效率。
這要求新一代的操作系統(tǒng)改進(jìn)進(jìn)程結(jié)構(gòu),提供新的機(jī)制,使得很多應(yīng)用能夠按照需求,在同一進(jìn)程中設(shè)計(jì)出多條的控制流,多控制流之間可以并行執(zhí)行,切換不需通過進(jìn)程調(diào)度;多控制流之間還可以通過內(nèi)存區(qū)直接通信,降低通信開銷。這就是多線程(結(jié)構(gòu))進(jìn)程(Multiple Threaded Process)。
目前,很多著名的操作系統(tǒng)都支持多線程(結(jié)構(gòu))進(jìn)程,如Solaris 2.x、Mach 2.6、OS/2、Window NT、Windows 2000、Chorus等。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種Java操作系統(tǒng)中線程的實(shí)現(xiàn)和線程狀態(tài)切換的方法。
本發(fā)明解決其技術(shù)問題采用的技術(shù)方案如下每個進(jìn)程內(nèi)允許包含多個并行執(zhí)行的路徑就是多線程,Java操作系統(tǒng)中的線程是系統(tǒng)進(jìn)行處理器調(diào)度的基本單位,同一個進(jìn)程中的所有線程共享進(jìn)程獲得的地址空間和資源;一個線程具有●一個線程執(zhí)行狀態(tài),運(yùn)行、就緒等狀態(tài)●有一個受保護(hù)的線程上下文,當(dāng)線程不運(yùn)行時(shí),用于存儲現(xiàn)場信息●一個獨(dú)立的程序指令計(jì)數(shù)器●一個執(zhí)行堆?!褚粋€容納局部變量的靜態(tài)存儲器多線程進(jìn)程的組成包括線程和空間??臻g是完成一個程序的運(yùn)行所需占有和管理的內(nèi)存空間,它封裝了對進(jìn)程的管理,包括對指令代碼、全局?jǐn)?shù)據(jù)和I/O狀態(tài)數(shù)據(jù)等共享部分的管理。Java操作系統(tǒng)中的線程封裝了并發(fā),包括對CPU寄存器、執(zhí)行棧和局部變量、過程調(diào)用參數(shù)、返回值等線程私有部分的管理。線程主動地訪問空間。
Java操作系統(tǒng)中的線程狀態(tài)和狀態(tài)切換,Java操作系統(tǒng)中的線程從產(chǎn)生到消失,可分5個狀態(tài)1)新建態(tài)線程在已被創(chuàng)建但尚未執(zhí)行這段時(shí)間內(nèi),處于一個特殊的新建狀態(tài)。這時(shí),線程對象已被分配內(nèi)存空間,其私有數(shù)據(jù)已被初始化,但該線程還未被調(diào)度。此時(shí)線程對象可通過start()方法調(diào)度,或者利用stop()方法殺死。新創(chuàng)建的線程一旦被調(diào)度,就將切換到就緒狀態(tài);2)就緒態(tài)線程的就緒狀態(tài),表示線程正等待處理器資源,隨時(shí)可被調(diào)用執(zhí)行,處于就緒狀態(tài)的線程事實(shí)上已被調(diào)度,已經(jīng)被放到某一隊(duì)列等待執(zhí)行。處于就緒狀態(tài)的線程何時(shí)可真正執(zhí)行,取決于線程優(yōu)先級以及隊(duì)列的當(dāng)前狀況,線程的優(yōu)先級如果相同,將遵循“先來先服務(wù)”的調(diào)度原則;線程依據(jù)自身優(yōu)先級進(jìn)入等待對列的相應(yīng)位置,某些系統(tǒng)線程具有最高優(yōu)先級、這些最高優(yōu)先級線程一旦進(jìn)入就緒狀態(tài),將搶占當(dāng)前正在執(zhí)行的線程的處理器資源,當(dāng)前線程只能重新在等待隊(duì)列尋找自己的位置。某些具有最高優(yōu)先級的線程執(zhí)行完自己的任務(wù)之后,將調(diào)用sleep()、wait()、suspend()方法,睡眠一段時(shí)間,等待被某一事件喚醒。一旦被喚醒,這些線程就又開始搶占處理器資源。這些最高優(yōu)先級線程通常被用來執(zhí)行一些關(guān)鍵性任務(wù),如屏幕顯示;低優(yōu)先級線程需等待更長的時(shí)間才能有機(jī)會運(yùn)行,由于系統(tǒng)本身無法中止高優(yōu)先級線程的執(zhí)行,因此用到了優(yōu)先級校高的線程對象,那么最好不時(shí)讓這些線程放棄對處理器資源的控制權(quán),以使其他線程能夠有機(jī)會運(yùn)行。
3)運(yùn)行態(tài)線程的運(yùn)行狀態(tài)。該線程已經(jīng)擁有了對處理器的控制權(quán),其代碼目前正在運(yùn)行.這個線程將一直運(yùn)行直到運(yùn)行完畢,除非運(yùn)行過程的控制權(quán)被一優(yōu)先級更高的線程強(qiáng)占,線程在如下3種情形之下將釋放對處理囂的控制權(quán)●主動或被動地釋放對處理器資源的控制權(quán),該線程必須再次進(jìn)入等待隊(duì)列,等待其他優(yōu)先級高或相等線程執(zhí)行完畢●睡眠一段確定的時(shí)間,不進(jìn)入等待隊(duì)列,這段確定的時(shí)間到期后,重新開始運(yùn)行●等持某一事件喚醒自己;4)阻塞態(tài)暫時(shí)這個線程將無法進(jìn)入就緒隊(duì)列,處于堵塞狀態(tài)的線程通常必須由某些事件才能喚醒.至于是何種事件,則取決于堵塞發(fā)生的原因,處于睡眠中的線程必須被堵塞一段固定的時(shí)間;被掛起、或處于消息等待狀態(tài)的線程則必須由一外來事件喚醒;5)消亡態(tài)表示線程已退出運(yùn)行狀態(tài),并且不再進(jìn)入就緒隊(duì)列,其中原因可能是線程已執(zhí)行完畢且正常結(jié)束,也可能是該線程被另一線程所強(qiáng)行中斷。
本發(fā)明具有的有益效果是(1)快速線程切換。進(jìn)程具有獨(dú)立的虛地址空間,以進(jìn)程為單位進(jìn)行任務(wù)調(diào)度,系統(tǒng)必須交換地址空間,切換時(shí)間長,而在同一進(jìn)程中的多線程共享同一地址空間,因而,能使線程快速切換。
(2)減少系統(tǒng)管理開銷。對多個進(jìn)程的管理(創(chuàng)建、調(diào)度、終止等)系統(tǒng)開銷大,如響應(yīng)客戶請求建立一個新的服務(wù)進(jìn)程的服務(wù)器應(yīng)用中,創(chuàng)建的開銷比較顯著。面對創(chuàng)建、終止線程,雖也有系統(tǒng)開銷,但要比進(jìn)程小得多。
(3)線程通信易于實(shí)現(xiàn)。為了實(shí)現(xiàn)協(xié)作,進(jìn)程或線程間需要交換數(shù)據(jù)。對于自動共享同一地址空間的各線程來說,所有全局?jǐn)?shù)據(jù)均可自由訪問,不需什么特殊設(shè)施就能實(shí)現(xiàn)數(shù)據(jù)共享。而進(jìn)程通信則相當(dāng)復(fù)雜,必須借助諸如通信機(jī)制、消息緩沖、管道機(jī)制等設(shè)施,而且必須調(diào)用內(nèi)核功能,才能實(shí)現(xiàn)。
(4)并行程度提高。許多多任務(wù)操作系統(tǒng)限制用戶能擁有的最多進(jìn)程數(shù)目,這對許多并發(fā)應(yīng)用來說是不方便的。而對多線程技術(shù)來說,不存在線程數(shù)目的限制。
(5)節(jié)省內(nèi)存空間。多線程合用進(jìn)程地址空間,而不同進(jìn)程獨(dú)占地址空間,使用不經(jīng)濟(jì)。由于隊(duì)列管理和處理器調(diào)度是以線程為單位的,在一個進(jìn)程中的所有線程共享同一地址空間,多線程可以合用進(jìn)程地址空間,因此可以節(jié)省內(nèi)存空間。
圖1是線程的狀態(tài)切換圖;圖2是線程的構(gòu)成示意圖。
具體實(shí)施方法每個進(jìn)程內(nèi)允許包含多個并行執(zhí)行的路徑就是多線程,如圖2所示,Java操作系統(tǒng)中的線程是系統(tǒng)進(jìn)行處理器調(diào)度的基本單位,同一個進(jìn)程中的所有線程共享進(jìn)程獲得的地址空間和資源;一個線程具有●一個線程執(zhí)行狀態(tài),運(yùn)行、就緒等狀態(tài)●有一個受保護(hù)的線程上下文,當(dāng)線程不運(yùn)行時(shí),用于存儲現(xiàn)場信息●一個獨(dú)立的程序指令計(jì)數(shù)器●一個執(zhí)行堆?!褚粋€容納局部變量的靜態(tài)存儲器多線程進(jìn)程的組成包括線程和空間。空間是完成一個程序的運(yùn)行所需占有和管理的內(nèi)存空間,它封裝了對進(jìn)程的管理,包括對指令代碼、全局?jǐn)?shù)據(jù)和I/O狀態(tài)數(shù)據(jù)等共享部分的管理。Java操作系統(tǒng)中的線程封裝了并發(fā),包括對CPU寄存器、執(zhí)行棧和局部變量、過程調(diào)用參數(shù)、返回值等線程私有部分的管理。線程主動地訪問空間。
Java操作系統(tǒng)中的線程狀態(tài)和狀態(tài)切換,Java操作系統(tǒng)中的線程從產(chǎn)生到消失,可分5個狀態(tài),如圖1所示1)新建態(tài)線程在已被創(chuàng)建但尚未執(zhí)行這段時(shí)間內(nèi),處于一個特殊的新建狀態(tài)。這時(shí),線程對象已被分配內(nèi)存空間,其私有數(shù)據(jù)已被初始化,但該線程還未被調(diào)度。此時(shí)線程對象可通過start()方法調(diào)度,或者利用stop()方法殺死。新創(chuàng)建的線程一旦被調(diào)度,就將切換到就緒狀態(tài);2)就緒態(tài)線程的就緒狀態(tài),表示線程正等待處理器資源,隨時(shí)可被調(diào)用執(zhí)行,處于就緒狀態(tài)的線程事實(shí)上已被調(diào)度,已經(jīng)被放到某一隊(duì)列等待執(zhí)行。處于就緒狀態(tài)的線程何時(shí)可真正執(zhí)行,取決于線程優(yōu)先級以及隊(duì)列的當(dāng)前狀況,線程的優(yōu)先級如果相同,將遵循“先來先服務(wù)”的調(diào)度原則;線程依據(jù)自身優(yōu)先級進(jìn)入等待對列的相應(yīng)位置,某些系統(tǒng)線程具有最高優(yōu)先級、這些最高優(yōu)先級線程一旦進(jìn)入就緒狀態(tài),將搶占當(dāng)前正在執(zhí)行的線程的處理器資源,當(dāng)前線程只能重新在等待隊(duì)列尋找自己的位置。某些具有最高優(yōu)先級的線程執(zhí)行完自己的任務(wù)之后,將調(diào)用sleep()、wait()、suspend()方法,睡眠一段時(shí)間,等待被某一事件喚醒。一旦被喚醒,這些線程就又開始搶占處理器資源。這些最高優(yōu)先級線程通常被用來執(zhí)行一些關(guān)鍵性任務(wù),如屏幕顯示;低優(yōu)先級線程需等待更長的時(shí)間才能有機(jī)會運(yùn)行,由于系統(tǒng)本身無法中止高優(yōu)先級線程的執(zhí)行,因此用到了優(yōu)先級校高的線程對象,那么最好不時(shí)讓這些線程放棄對處理器資源的控制權(quán),以使其他線程能夠有機(jī)會運(yùn)行。
3)運(yùn)行態(tài)線程的運(yùn)行狀態(tài)。該線程已經(jīng)擁有了對處理器的控制權(quán),其代碼目前正在運(yùn)行.這個線程將一直運(yùn)行直到運(yùn)行完畢,除非運(yùn)行過程的控制權(quán)被一優(yōu)先級更高的線程強(qiáng)占,線程在如下3種情形之下將釋放對處理囂的控制權(quán)●主動或被動地釋放對處理器資源的控制權(quán),該線程必須再次進(jìn)入等待隊(duì)列,等待其他優(yōu)先級高或相等線程執(zhí)行完畢●睡眠一段確定的時(shí)間,不進(jìn)入等待隊(duì)列,這段確定的時(shí)間到期后,重新開始運(yùn)行●等持某一事件喚醒自己;4)阻塞態(tài)暫時(shí)這個線程將無法進(jìn)入就緒隊(duì)列,處于堵塞狀態(tài)的線程通常必須由某些事件才能喚醒.至于是何種事件,則取決于堵塞發(fā)生的原因,處于睡眠中的線程必須被堵塞一段固定的時(shí)間;被掛起、或處于消息等待狀態(tài)的線程則必須由一外來事件喚醒;5)消亡態(tài)表示線程已退出運(yùn)行狀態(tài),并且不再進(jìn)入就緒隊(duì)列,其中原因可能是線程已執(zhí)行完畢且正常結(jié)束,也可能是該線程被另一線程所強(qiáng)行中斷。
JAVA操作系統(tǒng)提供一個多線程系統(tǒng),每個線程均被賦予一個優(yōu)先級,優(yōu)先級決定了線程獲得CPU被調(diào)度執(zhí)行的優(yōu)先程度。優(yōu)先級高的線程可在更短的時(shí)間段內(nèi)獲得更多的執(zhí)行時(shí)間,優(yōu)先級低的線程則正好相反。線程的優(yōu)先級如果完全相等,將被依據(jù)“先來先服務(wù)”的原則進(jìn)行調(diào)度.
線程運(yùn)行通過一個“調(diào)度程序”(schduler>來進(jìn)行調(diào)度。調(diào)度實(shí)際上就是分配處理器資源,處理器資源是按時(shí)間片分配的,獲得處理器資源的線程只能在規(guī)定的時(shí)間片內(nèi)執(zhí)行,一旦時(shí)間片使用完畢,就必須把處理器讓給另一處于等待狀態(tài)的線程。
JAVA操作系統(tǒng)使用“搶占式”(preemptive)調(diào)度方式。為使低優(yōu)先級線程能夠有機(jī)會運(yùn)行,較高優(yōu)先級線程不時(shí)進(jìn)入“睡眠”(sleep)狀態(tài)。進(jìn)入睡眠狀態(tài)的線程必須在被喚醒之后才能繼續(xù)運(yùn)行。
JAVA操作系統(tǒng)的線程是從相同內(nèi)存空間開始運(yùn)行,共享類變量和方法的訪問權(quán),產(chǎn)生了同步問題。為了避免多個線程訪問同一個資源,JAVA操作系統(tǒng)提供了一種類似信號量的東西,即monitor來控制對象的訪問同步。同步執(zhí)行的代碼段要訪問某個共享對象.必須擁有該對象的monitor。
本Java操作系統(tǒng)軟件已經(jīng)向中華人民共和國版權(quán)局申請計(jì)算機(jī)軟件著作權(quán)登記。
權(quán)利要求
1.一種Java操作系統(tǒng)中線程的實(shí)現(xiàn)和線程狀態(tài)切換的方法,其特征在于每個進(jìn)程內(nèi)允許包含多個并行執(zhí)行的路徑就是多線程,Java操作系統(tǒng)中的線程是系統(tǒng)進(jìn)行處理器調(diào)度的基本單位,同一個進(jìn)程中的所有線程共享進(jìn)程獲得的地址空間和資源;一個線程具有●一個線程執(zhí)行狀態(tài),運(yùn)行、就緒等狀態(tài)●有一個受保護(hù)的線程上下文,當(dāng)線程不運(yùn)行時(shí),用于存儲現(xiàn)場信息●一個獨(dú)立的程序指令計(jì)數(shù)器●一個執(zhí)行堆棧●一個容納局部變量的靜態(tài)存儲器多線程進(jìn)程的組成包括線程和空間,空間是完成一個程序的運(yùn)行所需占有和管理的內(nèi)存空間,它封裝了對進(jìn)程的管理,包括對指令代碼、全局?jǐn)?shù)據(jù)和I/O狀態(tài)數(shù)據(jù)等共享部分的管理,Java操作系統(tǒng)中的線程封裝了并發(fā),包括對CPU寄存器、執(zhí)行棧和局部變量、過程調(diào)用參數(shù)、返回值等線程私有部分的管理,線程主動地訪問空間;Java操作系統(tǒng)中的線程狀態(tài)和狀態(tài)切換,Java操作系統(tǒng)中的線程從產(chǎn)生到消失,可分5個狀態(tài)1)新建態(tài)線程在已被創(chuàng)建但尚未執(zhí)行這段時(shí)間內(nèi),處于一個特殊的新建狀態(tài)。這時(shí),線程對象已被分配內(nèi)存空間,其私有數(shù)據(jù)已被初始化,但該線程還未被調(diào)度。此時(shí)線程對象可通過start()方法調(diào)度,或者利用stop()方法殺死。新創(chuàng)建的線程一旦被調(diào)度,就將切換到就緒狀態(tài);2)就緒態(tài)線程的就緒狀態(tài),表示線程正等待處理器資源,隨時(shí)可被調(diào)用執(zhí)行,處于就緒狀態(tài)的線程事實(shí)上已被調(diào)度,已經(jīng)被放到某一隊(duì)列等待執(zhí)行。處于就緒狀態(tài)的線程何時(shí)可真正執(zhí)行,取決于線程優(yōu)先級以及隊(duì)列的當(dāng)前狀況,線程的優(yōu)先級如果相同,將遵循“先來先服務(wù)”的調(diào)度原則;線程依據(jù)自身優(yōu)先級進(jìn)入等待對列的相應(yīng)位置,某些系統(tǒng)線程具有最高優(yōu)先級、這些最高優(yōu)先級線程一旦進(jìn)入就緒狀態(tài),將搶占當(dāng)前正在執(zhí)行的線程的處理器資源,當(dāng)前線程只能重新在等待隊(duì)列尋找自己的位置。某些具有最高優(yōu)先級的線程執(zhí)行完自己的任務(wù)之后,將調(diào)用sleep()、wait()、suspend()方法,睡眠一段時(shí)間,等待被某一事件喚醒。一旦被喚醒,這些線程就又開始搶占處理器資源。這些最高優(yōu)先級線程通常被用來執(zhí)行一些關(guān)鍵性任務(wù),如屏幕顯示;低優(yōu)先級線程需等待更長的時(shí)間才能有機(jī)會運(yùn)行,由于系統(tǒng)本身無法中止高優(yōu)先級線程的執(zhí)行,因此用到了優(yōu)先級校高的線程對象,那么最好不時(shí)讓這些線程放棄對處理器資源的控制權(quán),以使其他線程能夠有機(jī)會運(yùn)行。3)運(yùn)行態(tài)線程已經(jīng)擁有了對處理器的控制權(quán),其代碼目前正在運(yùn)行。這個線程將一直運(yùn)行直到運(yùn)行完畢,除非運(yùn)行過程的控制權(quán)被一優(yōu)先級更高的線程強(qiáng)占,線程在如下3種情形之下將釋放對處理囂的控制權(quán)●主動或被動地釋放對處理器資源的控制權(quán),該線程必須再次進(jìn)入等待隊(duì)列,等待其他優(yōu)先級高或相等線程執(zhí)行完畢●睡眠一段確定的時(shí)間,不進(jìn)入等待隊(duì)列,這段確定的時(shí)間到期后,重新開始運(yùn)行●等持某一事件喚醒自己;4)阻塞態(tài)暫時(shí)這個線程將無法進(jìn)入就緒隊(duì)列,處于堵塞狀態(tài)的線程通常必須由某些事件才能喚醒。至于是何種事件,則取決于堵塞發(fā)生的原因,處于睡眠中的線程必須被堵塞一段固定的時(shí)間;被掛起、或處于消息等待狀態(tài)的線程則必須由一外來事件喚醒;5)消亡態(tài)表示線程已退出運(yùn)行狀態(tài),并且不再進(jìn)入就緒隊(duì)列,其中原因可能是線程已執(zhí)行完畢且正常結(jié)束,也可能是該線程被另一線程所強(qiáng)行中斷。
全文摘要
本發(fā)明公開了一種Java操作系統(tǒng)中線程的實(shí)現(xiàn)和線程狀態(tài)切換的方法。在Java操作系統(tǒng)中的線程是進(jìn)程中的一條執(zhí)行路徑,是系統(tǒng)進(jìn)行處理器調(diào)度的基本單位,同一個進(jìn)程中的所有線程共享進(jìn)程獲得的地址空間和資源,線程具有5個不同的狀態(tài)并且可以在狀態(tài)間進(jìn)行高效切換,這可以使系統(tǒng)性能獲得很大提高。本發(fā)明對嵌入式系統(tǒng)環(huán)境,尤其是面向嵌入式系統(tǒng)的Java操作系統(tǒng),有重大意義。
文檔編號G06F9/48GK1801101SQ20061004913
公開日2006年7月12日 申請日期2006年1月17日 優(yōu)先權(quán)日2006年1月17日
發(fā)明者陳天洲, 戴鴻君, 黃彧 申請人:浙江大學(xué)