日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统随笔(二)

發(fā)布時間:2023/12/9 windows 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统随笔(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果你還沒有讀過第一篇隨筆,請點(diǎn)擊這里→操作系統(tǒng)隨筆(一)


文章目錄

    • @[toc]
  • 2 進(jìn)程和線程
    • 2.1 進(jìn)程
      • 2.1.1 進(jìn)程模型
      • 2.1.2 進(jìn)程的創(chuàng)建
      • 2.1.3 進(jìn)程的終止
      • 2.1.4 進(jìn)程的層次結(jié)構(gòu)
      • 2.1.5 進(jìn)程的狀態(tài)
      • 2.1.6 進(jìn)程的實(shí)現(xiàn)
    • 2.2 線程
      • 2.2.1 進(jìn)程的使用
      • 2.2.2 經(jīng)典的線程模型
      • 2.2.3 POSIX線程
      • 2.2.4 在用戶空間中實(shí)現(xiàn)線程
      • 2.2.5 在內(nèi)核中實(shí)現(xiàn)線程
      • 2.2.6 混合實(shí)現(xiàn)
      • 2.2.7 調(diào)度程序激活機(jī)制

2 進(jìn)程和線程

在操作系統(tǒng)中,最核心的概念是進(jìn)程,這是對正在運(yùn)行程序的一個抽象。操作系統(tǒng)的其他內(nèi)容都是圍繞進(jìn)程的概念來展開的。

2.1 進(jìn)程

在只有一個用戶的PC機(jī)開機(jī)的時候,實(shí)際上會秘密啟動很多進(jìn)程。例如,啟動一個進(jìn)程用來等待進(jìn)入的電子郵件;或者啟動另一個防病毒進(jìn)程周期性地檢查是否有病毒庫更新。或者更好笑的是,一開機(jī)就是垃圾捆綁軟件,什么2345,什么網(wǎng)頁游戲,這些都是進(jìn)程。這么多進(jìn)程的活動都是需要管理的,于是有一個支持多進(jìn)程的多道程序系統(tǒng)在這里顯得就很有用了。

在任何多道程序設(shè)計(jì)系統(tǒng)中,CPU能夠很快地切換進(jìn)程,這個很快是幾百毫秒哦。這也就讓人產(chǎn)生一種并行的錯覺,在一秒鐘內(nèi)怎么開了這么多進(jìn)程?同時開的嗎?不是,實(shí)際上在一瞬間只能有一個進(jìn)程讓CPU服務(wù),只是進(jìn)程切換地太快了,這就是偽并行。這和真正意義上的并行是有區(qū)別的,這也導(dǎo)致了此情形可以用來作為判別是否為多處理器系統(tǒng)的指標(biāo)。

2.1.1 進(jìn)程模型

在進(jìn)程模型中,計(jì)算機(jī)上所有可運(yùn)行的軟件,通常也包括操作系統(tǒng),被組織成若干順序進(jìn)程,簡稱進(jìn)程(process),進(jìn)程是程序的一次執(zhí)行過程。

每個進(jìn)程都擁有自己的虛擬CPU,當(dāng)然,實(shí)際上真正的CPU在各進(jìn)程之間來回切換。我們在之前的1.1.2 中時間復(fù)用技術(shù)曾經(jīng)提到過,當(dāng)一個資源在時間上復(fù)用時,不同的程序或用戶輪流使用它。實(shí)際上對于CPU來說也是如此,在時間上進(jìn)行復(fù)用的時候,不同的進(jìn)程輪流使用它。這種快速地切換是需要特定的設(shè)計(jì)的,我們稱為多道程序設(shè)計(jì)。

如下圖,在一段時間內(nèi),CPU為多個進(jìn)程服務(wù),但是觀察c圖,實(shí)際上在某個瞬間CPU只服務(wù)一個進(jìn)程。

當(dāng)然在上述的思考中,我們僅僅討論的是單核CPU,而不是多核。如果是多核CPU,根據(jù)我們之前所說,多核CPU可以看成一個大CPU里面裝了多個小的CPU;甚至于有的電腦還不止一個CPU,對于一些并行計(jì)算機(jī),多處理器的情況也是很常見的。

對于大多數(shù)進(jìn)程來說并不受CPU多道程序設(shè)計(jì)或其他進(jìn)程相對速度的影響,因?yàn)槊總€進(jìn)程占用所需CPU的時間是不同的,所以我們無法確定在快速切換進(jìn)程的過程中,需要給每個進(jìn)程多久的處理時間處理完才切換。這時候就迫切的需要干一件事,既然我無法確定一個進(jìn)程需要多久的CPU,那我干脆每個進(jìn)程占有CPU的時間都相同,但是在對一個進(jìn)程處理未完的情況下,我需要有一種物件能夠保存其未處理完的狀態(tài),就像別人玩單機(jī)游戲玩到一半去喝水一樣。在后面的小節(jié)中,我們會給出這個物件。

2.1.2 進(jìn)程的創(chuàng)建

有4種主要事件會導(dǎo)致進(jìn)程的創(chuàng)建:

  • 系統(tǒng)初始化
  • 正在運(yùn)行的程序執(zhí)行了創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用
  • 用戶請求創(chuàng)建一個新進(jìn)程
  • 一個批處理作業(yè)的初始化

啟動操作系統(tǒng)時,通常會創(chuàng)建若干個進(jìn)程,有些事可以同用戶交互并且替他們工作的前臺進(jìn)程,其余的為后臺進(jìn)程。如果想要查看進(jìn)程,在windows操作系統(tǒng)中可以使用任務(wù)管理器,在linux系統(tǒng)中可以用ps指令。

在像windows和ubuntu這樣的交互式系統(tǒng)中,點(diǎn)擊某個圖標(biāo)都可以啟動一個程序,啟動的時候就相當(dāng)于開啟了一個新的進(jìn)程。

在一個進(jìn)程開始的時候,可以不打開窗口,也可以打開一個或多個窗口,用戶可以用鼠標(biāo)和鍵盤在窗口內(nèi)與進(jìn)程交互,比如打開QQ的時候和別人用鍵盤打字聊天。

還有一種情況是在大型的批處理系統(tǒng)中,在操作系統(tǒng)認(rèn)為有資源可以運(yùn)行另一個作業(yè)時,它創(chuàng)建一個新的進(jìn)程,并運(yùn)行其輸入隊(duì)列中的下一個作業(yè)。

我們知道系統(tǒng)調(diào)用的作用之一是控制進(jìn)程。在Unix系統(tǒng)中,只有一個系統(tǒng)調(diào)用可以用來創(chuàng)建進(jìn)程,即fork。而在Windows中則是用Win32函數(shù)調(diào)用CreateProcess來負(fù)責(zé)進(jìn)程的創(chuàng)建和程序裝入進(jìn)程的過程。除了CreateProcess,Win32還有大約100個其他的函數(shù)用于進(jìn)程的管理。

2.1.3 進(jìn)程的終止

有4種主要事件會導(dǎo)致進(jìn)程的終止:

  • 正常退出
  • 出錯退出
  • 嚴(yán)重錯誤
  • 被其他進(jìn)程殺死

正常退出就沒什么好說了,Unix用的是exit,Windows調(diào)用的是ExitProcess。

出錯退出一般還好說,如果用戶在Linux鍵入命令cc foo.c要編譯文件foo.c,但是該文件不存在,那么編譯器就會退出。

如果是嚴(yán)重錯誤,比如分母為0,數(shù)組越界,空指針異常這類錯誤,那么進(jìn)程會收到信號然后中斷。

最后一種在linux很常見的就是kill命令,利用kill 進(jìn)程號可以殺死一個進(jìn)程,而在Win32用的則是TerminateProcess函數(shù)。

2.1.4 進(jìn)程的層次結(jié)構(gòu)

在前面,我們曾經(jīng)提到父子進(jìn)程這個名詞,那么什么是父子進(jìn)程呢?

在Unix中,通過fork函數(shù)創(chuàng)建的新進(jìn)程是原進(jìn)程的子進(jìn)程,而調(diào)用fork函數(shù)的進(jìn)程是fork函數(shù)創(chuàng)建出來的新進(jìn)程的父進(jìn)程。也就是說,通過fork函數(shù)創(chuàng)建的新進(jìn)程與原進(jìn)程是父子關(guān)系,fork就相當(dāng)于一個憑證,有fork,就有父子關(guān)系。

但是這也有一個問題,我們學(xué)過java的都知道,繼承的父類和子類共享屬性,那么對應(yīng)到這里的父子進(jìn)程是否也有共享資源的說法呢?

事實(shí)是,父進(jìn)程和子進(jìn)程的共享方式采用的是寫時復(fù)制,即兩個進(jìn)程在讀資源的時候的確是共享,但是在寫資源的時候,寫資源的那個進(jìn)程先把資源拷貝一份然后進(jìn)行操作,操作完然后在覆蓋到原來的資源上,在這個過程中我們可以發(fā)現(xiàn),可寫的內(nèi)存時不可以被共享的。

經(jīng)過上面的說明,我們可以大概知道這么個事,子進(jìn)程是父進(jìn)程創(chuàng)建出來的。父進(jìn)程可以有多個子進(jìn)程,但是子進(jìn)程只可以有一個父進(jìn)程。在Unix中,父進(jìn)程和所有子進(jìn)程組成了一個進(jìn)程組,當(dāng)一個信號傳入進(jìn)程組,進(jìn)程組的每個進(jìn)程成員皆可以捕獲該信號,并且采取相應(yīng)的動作。

但是在Windows則沒有這些說法,所有的進(jìn)程地位都是相同的。

2.1.5 進(jìn)程的狀態(tài)

進(jìn)程之間時常要相互作用,如Linux命令:cat chapter1 | grep tree,這個命令啟動了兩個進(jìn)程,一個是cat,它將chapter文件進(jìn)行輸出;一個是grep,它在cat輸出的文件中去搜索含有tree的那些單詞。

從這個過程我們可以發(fā)現(xiàn)一件事,如果cat進(jìn)程還沒好,grep進(jìn)程就無法運(yùn)行。當(dāng)一個進(jìn)程在邏輯上不能繼續(xù)運(yùn)行時,他就會被阻塞。

經(jīng)過上面的敘述,我們引入最簡單的三種狀態(tài):

狀態(tài)說明
運(yùn)行態(tài)該時刻進(jìn)程實(shí)際占用CPU
就緒態(tài)可運(yùn)行,但是因?yàn)槠渌M(jìn)程正在運(yùn)行而暫時停止
阻塞態(tài)除非某種外部事件發(fā)生,否則進(jìn)程不能運(yùn)行

對于就緒態(tài)來說,很多人可能會和阻塞態(tài)搞混;實(shí)際上,就緒態(tài)是萬事俱備只欠CPU,即資源都準(zhǔn)備好了但是沒有CPU給它用,而阻塞態(tài)則像我們上面引入的例子,因?yàn)槟硞€事情還沒做好而導(dǎo)致其處于一個等待(阻塞)狀態(tài),這也是為什么有時候阻塞態(tài)被稱為等待態(tài)的原因。

特別典型的例子是C++中我們可以使用

system("pause");

來讓該進(jìn)程處于阻塞狀態(tài)。

轉(zhuǎn)換上圖的2和3是由進(jìn)程調(diào)度程序引起的,進(jìn)程調(diào)度程序是操作系統(tǒng)的一部分。實(shí)際上進(jìn)程調(diào)度也被叫做低級調(diào)度,當(dāng)系統(tǒng)認(rèn)為一個運(yùn)行進(jìn)程占用處理器太久了,他就會讓其他進(jìn)程去占用CPU,此時發(fā)生轉(zhuǎn)換2;當(dāng)系統(tǒng)已經(jīng)讓所有的程序都占用過CPU了,公平了,那么這個時候就會“重新洗牌”,第一個進(jìn)程再次占有CPU,此時發(fā)生轉(zhuǎn)換3;當(dāng)進(jìn)程等待的一個外部事件發(fā)生時,則發(fā)生轉(zhuǎn)換4,當(dāng)CPU此時空閑,則可以發(fā)生轉(zhuǎn)換3,該進(jìn)程立刻運(yùn)行,否則該進(jìn)程將處于就緒態(tài),等待CPU空閑。

2.1.6 進(jìn)程的實(shí)現(xiàn)

為了實(shí)現(xiàn)進(jìn)程模型,操作系統(tǒng)維護(hù)著一張表格,即進(jìn)程表。每個進(jìn)程都占有一條元組(數(shù)據(jù)庫的說法),每條元組即PCB(進(jìn)程控制塊),該元組中包含了進(jìn)程狀態(tài)的重要信息,包括程序計(jì)數(shù)器、堆棧指針、內(nèi)存分配情況、所打開文件的狀態(tài)、賬號和調(diào)度信息以及其他在進(jìn)程由運(yùn)行態(tài)轉(zhuǎn)換為就緒態(tài)或阻塞態(tài)時必須保存的信息,從而保證該進(jìn)程隨后能夠再次啟動。

一個進(jìn)程在執(zhí)行過程中可能被中斷數(shù)千次,但由于PCB的存在,即使中斷,也可以返回到發(fā)生中斷前完全相同的狀態(tài)。

2.2 線程

在很久以前還沒有引入進(jìn)程之前,系統(tǒng)中的各個程序只能串行執(zhí)行。比如你想要邊聽歌邊開QQ,這是不可能做到的,只能先做一件事再做一件事。

后來引入進(jìn)程后,系統(tǒng)中的各個程序可以并發(fā)執(zhí)行。也就是說,可以同時聽歌和開QQ。但是,即使引入了進(jìn)程,也不能在QQ中同時視頻聊天和傳輸文件。這是因?yàn)椴僮飨到y(tǒng)每一次執(zhí)行都是按照進(jìn)程為單位來執(zhí)行的。

從上面的例子來看,進(jìn)程是程序的一次執(zhí)行。但是這些功能顯然不可能是由一個程序順序處理就能實(shí)現(xiàn)的。

有的進(jìn)程可能需要“同時做很多事”,而傳統(tǒng)的進(jìn)程只能串行地執(zhí)行一系列程序。為此,引入了線程來提高并發(fā)度。

在傳統(tǒng)中,進(jìn)程是程序執(zhí)行流的最小單位,也就是說,CPU每次執(zhí)行任務(wù),最少執(zhí)行一個進(jìn)程。而后在現(xiàn)在,CPU每次執(zhí)行任務(wù),最少執(zhí)行一個線程,線程是進(jìn)程的子集。也就是說,引入線程后,線程成為了程序執(zhí)行流的最小單位。

綜上所述,我們可以把線程理解為“輕量級進(jìn)程”。線程是一個基本的CPU執(zhí)行單元,也是程序執(zhí)行流的最小單位。引入線程之后,不僅是進(jìn)程之間可以并發(fā),進(jìn)程內(nèi)的各線程之間也可以并發(fā),從而進(jìn)一步提升了系統(tǒng)的并發(fā)度,使得一個進(jìn)程內(nèi)也可以并發(fā)處理各種任務(wù)(如QQ視頻、文字聊天、傳文件)。引入線程后,進(jìn)程只作為除CPU之外的系統(tǒng)資源的分配單元(如打印機(jī)、內(nèi)存地址空間等都是分配給進(jìn)程的)。

2.2.1 進(jìn)程的使用

如上所說,為了追求多功能的同時運(yùn)行,輕量級進(jìn)程顯得尤為重要,線程比進(jìn)程更輕量級,它們比進(jìn)程更容易創(chuàng)建,也更容易撤銷。

舉一個例子說明為什么線程更容易創(chuàng)建,也更容易撤銷。假如我們用電腦寫一本書,通常的做法是創(chuàng)建一個doc文件直接寫,這樣的話如果中間要查詢某個東西非常方便,你只需要用WPS自帶的查找或者Office的查找都可以完成這個工作,這就是一個進(jìn)程內(nèi)含有多個線程的現(xiàn)實(shí)模型。

但是如果你采用創(chuàng)建一個文件夾,一個文件夾內(nèi)含有多個章節(jié)的文件,那么你每次要處理某個章節(jié)的一小段都需要完成打開文件,修改內(nèi)容,關(guān)閉文件等一系列操作,十分麻煩。

綜上所述,我們可以總結(jié)如下:

資源分配、調(diào)度并發(fā)性系統(tǒng)開銷
傳統(tǒng)進(jìn)程機(jī)制中,進(jìn)程是資源分配、調(diào)度的基本單位傳統(tǒng)進(jìn)程機(jī)制中,只能進(jìn)程間并發(fā)傳統(tǒng)的進(jìn)程間并發(fā),需要切換進(jìn)程的運(yùn)行環(huán)境,系統(tǒng)開銷很大。
引入線程后,進(jìn)程是資源分配的基本單位,線程是調(diào)度的基本單位引入線程后,各線程間也能并發(fā),提高了并發(fā)度線程間并發(fā),如果是同一進(jìn)程內(nèi)的線程切換,則不需要切換進(jìn)程環(huán)境,系統(tǒng)開銷小,也就是說引入線程后,并發(fā)所帶來的系統(tǒng)開銷減小。

2.2.2 經(jīng)典的線程模型

進(jìn)程模型基于兩種獨(dú)立的概念:資源分組處理和執(zhí)行。引入線程后,由于一個進(jìn)程含有多個線程,所以功能的執(zhí)行依賴于線程的切換,而不必使用開銷更大的進(jìn)程切換,線程的切換即涉及到線程的調(diào)度;而對于多個線程來說,其使用的是同一個資源,程序所需的資源分配的基本單位是進(jìn)程而不是線程,多個線程共享同一個資源。

在每個線程中,通常帶有一個程序計(jì)數(shù)器、寄存器和堆棧指針,這和進(jìn)程是十分類似的。線程給進(jìn)程模型增加的內(nèi)容即同一個進(jìn)程可以有多個線程,其切換我們在前面也提到過,CPU允許多線程切換納秒級完成。

和傳統(tǒng)進(jìn)程一樣,線程也有進(jìn)程所擁有的進(jìn)程狀態(tài)。在Windows中線程的創(chuàng)建時通過調(diào)用庫函數(shù)thread_create創(chuàng)建的,調(diào)用庫函數(shù)thread_exit進(jìn)行退出。

2.2.3 POSIX線程

為了實(shí)現(xiàn)可移植的線程程序,IEEE定義了線程的標(biāo)準(zhǔn)。它定義的線程包叫做pthread,大部分UNIX系統(tǒng)支持該標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)定義了超過60個函數(shù)調(diào)用。常見的幾個如下所示:

2.2.4 在用戶空間中實(shí)現(xiàn)線程

有兩種主要的方法實(shí)現(xiàn)線程包:在用戶空間中和內(nèi)核中。

第一種方法是把整個線程包放在用戶空間中,內(nèi)核對線程包一無所知。這樣的話就會出現(xiàn)一個問題,即使用戶開多條線程,內(nèi)核還是以為只有一個進(jìn)程,因?yàn)樗⒉恢肋M(jìn)程內(nèi)發(fā)生了啥,所以這時候就會出現(xiàn)單線程進(jìn)程。即使多個線程處理機(jī)也是分配其中一個。

以上的情況比較明顯地體現(xiàn)是在Java中利用thread開啟多線程,多條線程的執(zhí)行并不是并行地,而是并發(fā)地,你可以在兩條線程中各自打印一點(diǎn)東西,然后同時啟動你就能了解到效果了。

在用戶空間管理線程時,每個進(jìn)程需要有其專用的線程表,用拉力跟蹤該進(jìn)程中的線程。這些表和內(nèi)核中的進(jìn)程表類似,不過它們僅僅記錄各個線程的屬性,如每個線程的程序計(jì)數(shù)器、堆棧指針、寄存器和狀態(tài)等。

用戶級線程有一個優(yōu)點(diǎn)是,它允許每個進(jìn)程有自己定制的調(diào)度算法,并且其具有較好的擴(kuò)展性,你可以多開幾條線程,但是在內(nèi)核空間中萬一開多了線程是會出現(xiàn)問題的。

其另外一個優(yōu)點(diǎn)是,在用戶級線程下,線程的切換開銷小,其無需切換為核心態(tài);如果是內(nèi)核級切換線程,需要陷入內(nèi)核,開銷較大。

有一個問題我們前面提到,如果是在用戶空間下實(shí)行多線程,那么實(shí)際上處理器的占用取決于內(nèi)核中有多少條線程。如果用戶空間里有6條線程,而內(nèi)核中只有一條線程,那么實(shí)際處理線程時,處理器只會用到一個。也就是說,如果在用戶空間下實(shí)行多線程,那么一旦有一條線程阻塞,那么其他所有線程都將阻塞。

系統(tǒng)調(diào)用實(shí)際上是可以全部改成非阻塞的,但是這需要修改操作系統(tǒng)。還有一種替代方案是某個調(diào)用如果阻塞了就提前通知,但是這個處理方法需要重寫部分系統(tǒng)調(diào)用庫,所以也不太好,但是可惜的是,沒有第三種方法了。

用戶級線程包的最后一個問題是,如果一個線程開始運(yùn)行,那么在該進(jìn)程中的其他線程就不能運(yùn)行,除非第一個線程自動放棄CPU,這和我們前面所講的是一樣的。需要知道的是,在一個單獨(dú)的進(jìn)程內(nèi)部是沒有時鐘中斷的,所以也就不可能以輪轉(zhuǎn)調(diào)度的方式調(diào)度線程。所以除非某個線程能夠按照自己的意志進(jìn)行運(yùn)行時系統(tǒng),要不然調(diào)度程序是沒有任何機(jī)會的。

2.2.5 在內(nèi)核中實(shí)現(xiàn)線程

如圖所示,此時如果是在內(nèi)核中實(shí)現(xiàn)線程,那么不需要運(yùn)行時系統(tǒng)了。內(nèi)核實(shí)現(xiàn)線程的情況下,進(jìn)程表和線程表都由內(nèi)核控制。根據(jù)我們上一小節(jié)所說,內(nèi)核控制的線程可以按照線程數(shù)來分配處理器,當(dāng)一個線程阻塞時,內(nèi)核會自動切換另外一個線程。

雖然使用內(nèi)核線程可以解決阻塞等諸多問題,但也不是一勞永逸,內(nèi)核級線程的管理工作由操作系統(tǒng)內(nèi)核完成。線程調(diào)度、切換等工作都由內(nèi)核負(fù)責(zé),因此內(nèi)核級線程的切換必然需要在核心態(tài)下才能完成,線程管理的成本高,開銷大。

2.2.6 混合實(shí)現(xiàn)

在前面,我們說的兩種情況如圖所示:

這兩個圖在有的書中也被叫做多對一模型和一對多模型。

但是既然這兩種模型各有各的缺點(diǎn),為什么不聯(lián)合起來呢?將用戶級線程和某些內(nèi)核線程多路復(fù)用起來,這在一些書上叫做多對多模型,如圖所示:

采用這種方法的特點(diǎn)是:內(nèi)核還是只能識別內(nèi)核級線程,這也就導(dǎo)致了即使用戶級線程再多,處理器的分配數(shù)量還是依照內(nèi)核級線程來確定,但是不會再有阻塞問題,也不會再有內(nèi)核線程開多出毛病的問題。

2.2.7 調(diào)度程序激活機(jī)制

盡管內(nèi)核級線程在一些關(guān)鍵點(diǎn)上優(yōu)于用戶級線程,但是內(nèi)核級線程速度慢是硬傷。為了保持其優(yōu)良特性并且改進(jìn)其速度,研究人員研究出了調(diào)度程序激活機(jī)制。

調(diào)度程序激活機(jī)制的本質(zhì)即:既然能在用戶空間中有這么大的便利,那我把內(nèi)核的權(quán)限給你不就行了,用戶線程如果發(fā)出的系統(tǒng)調(diào)用是安全的,那么就行使內(nèi)核賦予的權(quán)限去處理即可,如果實(shí)在不能處理,再去陷入內(nèi)核交給內(nèi)核去處理。這樣的話,由于避免了在用戶空間和內(nèi)核空間之間的不必要轉(zhuǎn)換,從而提高了效率。

在2.2.4前面我們說到過,多對一模型中,由于只有一個內(nèi)核級線程,所以一旦線程堵塞就完蛋了。這時候如果堵塞,內(nèi)核就會通知該進(jìn)程的運(yùn)行時系統(tǒng),并且在堆棧中以參數(shù)形式傳遞有問題的線程編號和所發(fā)生事件的一個描述。內(nèi)核通過在一個已知的其實(shí)地址啟動運(yùn)行時系統(tǒng),從而發(fā)出了通知,這種機(jī)制被叫做上行調(diào)用。一旦如此激活,運(yùn)行時系統(tǒng)就重新調(diào)度其線程。

在某個用戶線程運(yùn)行的同時發(fā)生一個硬件中斷時,被中斷的CPU切換進(jìn)內(nèi)核態(tài)。如果該線程沒有什么大問題,在相關(guān)的事件發(fā)生后并處理完成,那么線程會通過與PCB同樣功能的TCB(線程控制塊)去重新啟動自己所在的線程。

總結(jié)

以上是生活随笔為你收集整理的操作系统随笔(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。