操作系統(tǒng)完整總結(jié)

操作系統(tǒng)概論

操作系統(tǒng)的概念

操作系統(tǒng)是指控制和管理計(jì)算機(jī)的軟硬件資源,并合理的組織調(diào)度計(jì)算機(jī)的工作和資源的分配核行,以提供給用戶和其他軟件方便的接口和環(huán)境集合。

操作系統(tǒng)的特性

  1. 并發(fā)性:是指兩個(gè)或兩個(gè)以上的事件或活動(dòng)在同一個(gè)時(shí)間間隔內(nèi)發(fā)生蹬耘。

  2. 共享性:是指系統(tǒng)中并發(fā)執(zhí)行的多個(gè)進(jìn)程共享系統(tǒng)資源芝雪,而不是被一個(gè)進(jìn)程獨(dú)占。由于資源的屬性不同综苔,多個(gè)進(jìn)程對(duì)資源的共享方式也不同惩系,可以分為互斥共享方式和同時(shí)訪問(wèn)方式。

  3. 虛擬性:通過(guò)虛擬技術(shù)實(shí)現(xiàn)系統(tǒng)功能的擴(kuò)充如筛。虛擬是指把一個(gè)物理上的實(shí)體映射成若干個(gè)邏輯上的對(duì)應(yīng)物堡牡。在操作系統(tǒng)中,虛擬的實(shí)現(xiàn)主要采用了分時(shí)的方法杨刨,如果 n 是某個(gè)物理設(shè)備對(duì)應(yīng)的虛擬邏輯設(shè)備數(shù)晤柄,顯然每個(gè)虛擬邏輯設(shè)備的速度是物理設(shè)備的 1/n。

    • 在多道分時(shí)系統(tǒng)中妖胀,利用多道程序設(shè)計(jì)技術(shù)可以把一臺(tái)物理上的CPU虛擬為多臺(tái)邏輯上的CPU芥颈,供多個(gè)終端用戶使用;
    • 在虛擬存儲(chǔ)器中赚抡,僅把作業(yè)的一部分裝入內(nèi)存便可運(yùn)行作業(yè)爬坑,從邏輯上對(duì)內(nèi)存容量進(jìn)行了擴(kuò)充;
    • 在虛擬設(shè)備管理中虛擬設(shè)備技術(shù)的使用涂臣,可將一臺(tái)物理設(shè)備變換為若干臺(tái)邏輯上的對(duì)應(yīng)物妇垢。
  4. 異步性:在多道程序設(shè)計(jì)環(huán)境下,允許多個(gè)進(jìn)程并發(fā)執(zhí)行,由于資源等多個(gè)因素的限制闯估,進(jìn)程的執(zhí)行不是“一氣呵成”灼舍,而是“走走停停”的方式運(yùn)行涨薪。內(nèi)存中的每個(gè)進(jìn)程在何時(shí)執(zhí)行骑素,何時(shí)暫停,以怎樣的方式向前推進(jìn)刚夺,每道程序需要多長(zhǎng)時(shí)間運(yùn)行完等等都是不確定的献丑。

操作系統(tǒng)的功能

  • 服務(wù)用戶觀點(diǎn)——作為用戶接口和公共服務(wù)程序:向用戶提供方便的軟件接口和良好的界面。
  • 進(jìn)程交互觀點(diǎn)——作為進(jìn)程執(zhí)行的控制者和協(xié)調(diào)者:進(jìn)程和線程的管理侠姑。
  • 系統(tǒng)實(shí)現(xiàn)觀點(diǎn)——作為擴(kuò)展機(jī)或虛擬機(jī):對(duì)硬件提供功能的擴(kuò)展创橄。
  • 資源管理觀點(diǎn)——作為資源的管理者和控制者:管理計(jì)算機(jī)系統(tǒng)的軟硬件資源(處理器管理、存儲(chǔ)管理、文件管理、設(shè)備管理国葬、聯(lián)網(wǎng)與通信管理)。

操作系統(tǒng)的分類(lèi)

  • 單用戶操作系統(tǒng):一次只能支持一個(gè)用戶程序的運(yùn)行醉蚁,如 MS-DOS 系統(tǒng)
  • 批處理操作系統(tǒng):優(yōu)點(diǎn)是資源利用率高、系統(tǒng)吞吐量大鬼店,缺點(diǎn)是不具有交互性网棍、作業(yè)周轉(zhuǎn)時(shí)間長(zhǎng)。
  • 分時(shí)操作系統(tǒng):優(yōu)點(diǎn)是多路性強(qiáng)妇智、交互性好滥玷、響應(yīng)及時(shí)
  • 實(shí)時(shí)操作系統(tǒng):優(yōu)點(diǎn)是及時(shí)性好、可靠性高
  • 網(wǎng)絡(luò)與分布式系統(tǒng)巍棱、多機(jī)系統(tǒng)

操作系統(tǒng)的結(jié)構(gòu)

  • 單體式結(jié)構(gòu)/模塊化結(jié)構(gòu)
  • 分層式結(jié)構(gòu)
  • 虛擬機(jī)結(jié)構(gòu)
  • 微內(nèi)核結(jié)構(gòu)

多道程序設(shè)計(jì)

為什么說(shuō)批處理多道系統(tǒng)能極大地提高計(jì)算機(jī)系統(tǒng)的工作效率罗捎?

  1. 多道作業(yè)并行工作,減少了處理器的空閑時(shí)間拉盾。
  2. 作業(yè)調(diào)度可以合理選擇裝入主存儲(chǔ)器中的作業(yè),充分利用計(jì)算機(jī)系統(tǒng)的資源豁状。
  3. 作業(yè)執(zhí)行過(guò)程中不再訪問(wèn)低速設(shè)備捉偏,而直接訪問(wèn)高速的磁盤(pán)設(shè)備,縮短執(zhí)行時(shí)間泻红。
  4. 作業(yè)成批輸入夭禽,減少了從操作到作業(yè)的交接時(shí)間。

優(yōu)點(diǎn):提高CPU的利用率谊路;提高設(shè)備的利用率讹躯;提高系統(tǒng)吞吐量

處理器管理

中斷技術(shù)

進(jìn)程管理

進(jìn)程的概念

進(jìn)程是具有一定獨(dú)立功能的程序,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,重點(diǎn)在系統(tǒng)調(diào)度的單位潮梯,也就是說(shuō)進(jìn)程是可以獨(dú)立運(yùn)行的一段程序骗灶。
一句話概括,進(jìn)程是并發(fā)環(huán)境中完成的程序的執(zhí)行過(guò)程秉馏。
進(jìn)程是資源分配的最小單位耙旦。

進(jìn)程 = (一個(gè))資源+(多個(gè))指令執(zhí)行序列,也就是將資源和指令執(zhí)行分開(kāi)

進(jìn)程的作用:提高資源利用率萝究、正確描述程序的執(zhí)行情況免都、使CPU和外設(shè)間有效地并行工作。

進(jìn)程的描述和組成

進(jìn)程是由程序段帆竹、數(shù)據(jù)段绕娘、進(jìn)程控制塊(PCB)組成。

PCB

進(jìn)程標(biāo)識(shí)符

處理機(jī)狀態(tài)

進(jìn)程調(diào)度信息

進(jìn)程控制信息

進(jìn)程的基本特征

  • 動(dòng)態(tài)性:進(jìn)程是正在執(zhí)行程序的實(shí)例栽连;進(jìn)程是動(dòng)態(tài)產(chǎn)生险领、動(dòng)態(tài)消亡的;進(jìn)程在其生命周期內(nèi)升酣,在三種基本狀態(tài)之間轉(zhuǎn)換
  • 獨(dú)立性:進(jìn)程是資源分配的一個(gè)獨(dú)立單位(例如:各進(jìn)程的地址空間相互獨(dú)立)
  • 并發(fā)性:任何進(jìn)程都可以和其他進(jìn)程一起向前推進(jìn)舷暮、并發(fā)執(zhí)行
  • 交互性:進(jìn)程在執(zhí)行過(guò)程中可能與其他進(jìn)程產(chǎn)生直接或間接的關(guān)系
  • 異步性:由于進(jìn)程間的相互制約,使進(jìn)程具有執(zhí)行的間斷性噩茄,即每個(gè)進(jìn)程都以其相對(duì)獨(dú)立的不可預(yù)知的速度向前推進(jìn)

進(jìn)程的狀態(tài)及其轉(zhuǎn)化

三態(tài)模型:

  • 運(yùn)行態(tài):進(jìn)程占用CPU正在運(yùn)行下面。
  • 就緒態(tài):進(jìn)程具備了運(yùn)行的條件(已獲得除CPU以外的所需資源),但因其他進(jìn)程正在運(yùn)行而暫時(shí)停止绩聘,等待系統(tǒng)分配處理器以便運(yùn)行沥割。
  • 等待態(tài)/阻塞態(tài):進(jìn)程不具備運(yùn)行條件,正在等待某個(gè)事件的完成凿菩。

狀態(tài)轉(zhuǎn)換:

  • 就緒 -> 運(yùn)行:調(diào)度進(jìn)程為其分配處理機(jī)
  • 運(yùn)行 -> 就緒:時(shí)間片用完机杜;或出現(xiàn)更高優(yōu)先級(jí)進(jìn)程,當(dāng)前進(jìn)程被迫讓出處理器衅谷。
  • 運(yùn)行 -> 等待:正在執(zhí)行的進(jìn)程因等待某種事件發(fā)生而無(wú)法繼續(xù)執(zhí)行時(shí)椒拗,申請(qǐng)臨界資源而未被滿足,如 IO 請(qǐng)求(等待 I/O 完成)或者申請(qǐng)緩存
  • 等待 -> 就緒:請(qǐng)求得到滿足(等待的事件已經(jīng)發(fā)生)获黔,如 IO 完成

引起進(jìn)程阻塞和喚醒的事件

  1. 請(qǐng)求系統(tǒng)服務(wù)蚀苛。當(dāng)正在執(zhí)行的進(jìn)程請(qǐng)求系統(tǒng)提供服務(wù)而系統(tǒng)無(wú)法滿足其請(qǐng)求時(shí),進(jìn)程阻塞等待玷氏;由釋放服務(wù)的進(jìn)程喚醒阻塞進(jìn)程堵未。
  2. 啟動(dòng)某種操作。當(dāng)進(jìn)程啟動(dòng)某種I/O操作后阻塞以等待操作完成盏触;由中斷處理程序喚醒阻塞進(jìn)程渗蟹。
  3. 新數(shù)據(jù)尚未到達(dá)块饺。相互合作的進(jìn)程中,消費(fèi)者進(jìn)程阻塞等待數(shù)據(jù)到達(dá)雌芽;生產(chǎn)者進(jìn)程在數(shù)據(jù)到達(dá)后喚醒阻塞進(jìn)程授艰。
  4. 無(wú)新工作可做。系統(tǒng)進(jìn)程沒(méi)有新工作可做時(shí)阻塞等待膘怕;當(dāng)有進(jìn)程發(fā)出請(qǐng)求時(shí)喚醒阻塞進(jìn)程想诅。

引起掛起的事件

  • 系統(tǒng)資源不足:當(dāng)系統(tǒng)資源尤其是內(nèi)存資源不能再滿足進(jìn)程運(yùn)行的要求時(shí),必須把某些進(jìn)程掛起岛心,對(duì)換到磁盤(pán)交換區(qū)中来破,釋放掉它占有的某些資源,暫時(shí)不參與低級(jí)調(diào)度忘古,起到平滑負(fù)載的目的徘禁。
  • 系統(tǒng)出現(xiàn)故障:以便故障消除后再接觸掛起并恢復(fù)進(jìn)程運(yùn)行。
  • 用戶調(diào)試程序:以便進(jìn)行某種檢查和修改髓堪。

線程管理

線程的概念

線程是“輕量級(jí)的進(jìn)程”送朱。

為什么引入(多)線程

  • 并行實(shí)體共享同一個(gè)地址空間和所有可用數(shù)據(jù)的能力。
  • 線程比進(jìn)程更輕量級(jí)干旁,它們比進(jìn)程更容易驶沼、更快地撤銷(xiāo)。
  • 同一進(jìn)程內(nèi)的線程間切換比進(jìn)程間的切換要快争群,尤其是用戶級(jí)線程間的切換回怜。
  • 擁有多個(gè)線程允許這樣活動(dòng)彼此重疊進(jìn)行,從而會(huì)加快應(yīng)用程序執(zhí)行速度换薄。

一句話概括:快速線程切換玉雾,通信易于實(shí)現(xiàn),并行程度提高轻要,減少(系統(tǒng))管理開(kāi)銷(xiāo)

多線程有什么用复旬?

操作系統(tǒng)分類(lèi)

根據(jù)進(jìn)程與線程的設(shè)置,操作系統(tǒng)大致分為如下類(lèi)型:

  1. 單進(jìn)程冲泥、單線程驹碍,MS-DOS 大致是這種操作系統(tǒng);
  2. 多進(jìn)程凡恍、單線程志秃,多數(shù) UNIX(及類(lèi) UNIX 的 LINUX) 是這種操作系統(tǒng);
  3. 多進(jìn)程咳焚、多線程,Win32(Windows NT/2000/XP 等)庞溜、Solaris 2.x 和 OS/2 都是這種操作系統(tǒng)革半;
  4. 單進(jìn)程碑定、多線程,VxWorks 是這種操作系統(tǒng)又官。

線程的實(shí)現(xiàn)方式

  • 內(nèi)核級(jí)線程:1:1
  • 用戶級(jí)線程:N:1
  • 混合型線程:M:N

詳細(xì)來(lái)說(shuō):

  • 一對(duì)一模型:該模型為每個(gè)用戶級(jí)線程都設(shè)置一個(gè)內(nèi)核線程與之連接延刘,并發(fā)能力較強(qiáng),但每創(chuàng)建一個(gè)用戶線程六敬,都需要?jiǎng)?chuàng)建一個(gè)內(nèi)核線程碘赖。
  • 多對(duì)一模型:該模型為多個(gè)用戶級(jí)線程分配一個(gè)內(nèi)核線程。這樣的話外构,線程管理的開(kāi)銷(xiāo)較小普泡,但是當(dāng)一個(gè)線程在訪問(wèn)內(nèi)核時(shí)發(fā)生阻塞,則整個(gè)進(jìn)程會(huì)被阻塞审编。
  • 多對(duì)多模型:多個(gè)用戶線程連接到多個(gè)內(nèi)核線程上撼班,內(nèi)核控制線程的數(shù)目可以根據(jù)應(yīng)用和系統(tǒng)的不同而變化,可以比用戶線程少垒酬,也可以與之相同砰嘁。

內(nèi)核級(jí)線程

如圖所示,即內(nèi)核級(jí)線程的實(shí)現(xiàn)方式勘究,每個(gè)用戶線程都直接與一個(gè)內(nèi)核線程相關(guān)聯(lián):

image

  • 內(nèi)核線程的創(chuàng)建矮湘、撤銷(xiāo)和切換等,都是內(nèi)核負(fù)責(zé)口糕、通過(guò)系統(tǒng)調(diào)用完成的缅阳,即內(nèi)核了解每一個(gè)作為可調(diào)度實(shí)體的線程。
  • 這些線程可以在全系統(tǒng)內(nèi)進(jìn)行資源的競(jìng)爭(zhēng)走净。
  • 內(nèi)核管理所有線程管理券时,并向應(yīng)用程序提供API接口。
  • 內(nèi)核維護(hù)進(jìn)程和線程的上下文伏伯。
  • 以線程為基礎(chǔ)進(jìn)行調(diào)度橘洞。
  • 內(nèi)核空間內(nèi)為每一個(gè)內(nèi)核支持線程設(shè)置了一個(gè)線程控制塊(PCB),內(nèi)核根據(jù)該控制塊说搅,感知線程的存在炸枣,并進(jìn)行控制。
  • 內(nèi)核線程駐留在內(nèi)核空間弄唧,它們是內(nèi)核對(duì)象适肠。有了內(nèi)核線程,每個(gè)用戶線程被映射或綁定到一個(gè)內(nèi)核線程候引。用戶線程在其生命期內(nèi)都會(huì)綁定到該內(nèi)核線程侯养。一旦用戶線程終止,兩個(gè)線程都將離開(kāi)系統(tǒng)澄干。這被稱作“一對(duì)一”線程映射逛揩。

內(nèi)核線程的優(yōu)點(diǎn):

  • 多處理器系統(tǒng)中柠傍,內(nèi)核能夠調(diào)度同一進(jìn)程中的多個(gè)線程并行執(zhí)行
  • 不需要任何新的辩稽、非阻塞的系統(tǒng)調(diào)用惧笛。如果進(jìn)程中的一個(gè)線程被阻塞,能夠切換同一進(jìn)程內(nèi)的其他線程繼續(xù)執(zhí)行(用戶級(jí)線程的一個(gè)缺點(diǎn))逞泄。內(nèi)核還可以運(yùn)行另一個(gè)進(jìn)程的線程患整,而用戶空間實(shí)現(xiàn)的線程中,運(yùn)行時(shí)系統(tǒng)始終運(yùn)行自己進(jìn)程中的線程喷众。
  • 所有能夠阻塞線程的調(diào)用都以系統(tǒng)調(diào)用的形式實(shí)現(xiàn)各谚,代價(jià)可觀。
  • 信號(hào)是發(fā)給進(jìn)程而不是線程的侮腹,當(dāng)一個(gè)信號(hào)到達(dá)時(shí)嘲碧,應(yīng)該由哪一個(gè)線程處理它?線程可以 “注冊(cè)” 它們感興趣的信號(hào)父阻。

內(nèi)核線程的缺點(diǎn):

  • 內(nèi)核線程數(shù)量有限愈涩。
  • 如果內(nèi)核線程的操作比較多,會(huì)導(dǎo)致上下文的開(kāi)銷(xiāo)很大加矛。

用戶級(jí)線程

image

在用戶空間建立線程庫(kù)履婉,這個(gè)線程庫(kù)里提供了一系列的針對(duì)線程的操作。這些線程的管理通過(guò)運(yùn)行時(shí)系統(tǒng)(Run-time System)來(lái)管理的斟览。
它的管理還是以進(jìn)程為單位進(jìn)行管理的毁腿,它無(wú)法感知線程的存在。因此線程間的切換不需要內(nèi)核的參與苛茂,比較快已烤。

  • 用戶級(jí)線程僅存在于用戶空間。
  • 內(nèi)核并不能看到用戶線程妓羊。

內(nèi)核資源的分配仍然是按照進(jìn)程進(jìn)行分配的胯究;各個(gè)用戶線程只能在進(jìn)程內(nèi)進(jìn)行資源競(jìng)爭(zhēng)。

用戶進(jìn)程的優(yōu)點(diǎn):

  • 可以在不支持線程的操作系統(tǒng)中實(shí)現(xiàn)躁绸;
  • 線程切換速度非吃Q快,創(chuàng)建和銷(xiāo)毀線程净刮、線程切換代價(jià)等線程管理的代價(jià)比內(nèi)核線程少得多剥哑,因?yàn)楸4婢€程狀態(tài)的過(guò)程和調(diào)用程序都只是本地過(guò)程;
  • 線程的調(diào)度不需要內(nèi)核直接參與淹父,控制簡(jiǎn)單株婴;
  • 具有較好的可擴(kuò)展性,允許應(yīng)用程序根據(jù)需要指定線程調(diào)度算法暑认;
  • 線程能夠利用的表空間和堆椑Ы椋空間比內(nèi)核級(jí)線程多揪垄;
  • 不需要陷阱,不需要上下文切換逻翁,也不需要對(duì)內(nèi)存高速緩存進(jìn)行刷新,使得線程調(diào)用非臣裼悖快捷八回;

用戶線程的缺點(diǎn):

  • 資源調(diào)度按照進(jìn)程進(jìn)行(內(nèi)核只將處理器分配給進(jìn)程),多個(gè)處理機(jī)下驾诈,同一個(gè)進(jìn)程中的線程只能在同一個(gè)處理機(jī)下分時(shí)復(fù)用缠诅;
  • 線程發(fā)生 I/O 或頁(yè)面故障引起的阻塞時(shí),如果調(diào)用阻塞系統(tǒng)調(diào)用乍迄,則內(nèi)核由于不知道有線程的存在管引,而會(huì)阻塞整個(gè)進(jìn)程從而阻塞所有線程直到磁盤(pán) I/O 完成為止(盡管其他線程是可以運(yùn)行的),因此同一進(jìn)程中只能同時(shí)有一個(gè)線程在運(yùn)行闯两;
  • 一個(gè)單獨(dú)的進(jìn)程內(nèi)部褥伴,沒(méi)有時(shí)鐘中斷,所以不可能用輪轉(zhuǎn)調(diào)度的方式調(diào)度線程漾狼;

混合型線程

下圖說(shuō)明了用戶級(jí)與內(nèi)核級(jí)的組合實(shí)現(xiàn)方式, 在這種模型中重慢,每個(gè)內(nèi)核級(jí)線程有一個(gè)可以輪流使用的用戶級(jí)線程集合:

image

線程創(chuàng)建在用戶空間完成,線程調(diào)度等在核心態(tài)完成逊躁。
多個(gè)用戶級(jí)線程多路復(fù)用多個(gè)內(nèi)核級(jí)線程似踱。也就是說(shuō),核外的用戶空間的線程通過(guò)一個(gè)機(jī)制和核內(nèi)的一個(gè)內(nèi)核級(jí)線程對(duì)應(yīng)起來(lái)稽煤,那么調(diào)度內(nèi)核的這個(gè)線程上CPU也就是調(diào)度核外的線程上的CPU核芽。

用戶級(jí)線程和內(nèi)核級(jí)線程的區(qū)別

  • 內(nèi)核支持線程是 OS 內(nèi)核可感知的,而用戶級(jí)線程是 OS 內(nèi)核不可感知的酵熙。
  • 用戶級(jí)線程的創(chuàng)建轧简、撤消和調(diào)度不需要 OS 內(nèi)核的支持,是在語(yǔ)言(如 Java)這一級(jí)處理的绿店;而內(nèi)核支持線程的創(chuàng)建吉懊、撤消和調(diào)度都需 OS 內(nèi)核提供支持,而且與進(jìn)程的創(chuàng)建假勿、撤消和調(diào)度大體是相同的借嗽。
  • 用戶級(jí)線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)將導(dǎo)致其所屬進(jìn)程被中斷,而內(nèi)核支持線程執(zhí)行系統(tǒng)調(diào)用指令時(shí)转培,只導(dǎo)致該線程被中斷恶导。
  • 在只有用戶級(jí)線程的系統(tǒng)內(nèi),CPU 調(diào)度還是以進(jìn)程為單位浸须,處于運(yùn)行狀態(tài)的進(jìn)程中的多個(gè)線程惨寿,由用戶程序控制線程的輪換運(yùn)行邦泄;在有內(nèi)核支持線程的系統(tǒng)內(nèi),CPU 調(diào)度則以線程為單位裂垦,由 OS 的線程調(diào)度程序負(fù)責(zé)線程的調(diào)度顺囊。
  • 用戶級(jí)線程的程序?qū)嶓w是運(yùn)行在用戶態(tài)下的程序,而內(nèi)核支持線程的程序?qū)嶓w則是可以運(yùn)行在任何狀態(tài)下的程序蕉拢。
image

進(jìn)程與線程之間的關(guān)系

  • 一個(gè)程序至少有一個(gè)進(jìn)程特碳,一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程晕换,但至少有一個(gè)線程(通常說(shuō)的主線程)午乓。
    線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高
  • 資源分配給進(jìn)程闸准,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源益愈。
  • 線程在執(zhí)行過(guò)程中,需要協(xié)作同步夷家。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步蒸其。
  • 處理機(jī)分給線程,即真正在處理機(jī)上運(yùn)行的是線程库快。
  • 線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元枣接,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體。

進(jìn)程與線程之間的區(qū)別

  1. 調(diào)度:線程作為CPU調(diào)度和分配的基本單位缺谴,進(jìn)程作為資源分配的基本單位但惶。把傳統(tǒng)進(jìn)程的兩個(gè)屬性分開(kāi),線程便能輕裝運(yùn)行湿蛔,從而可顯著地提高系統(tǒng)的并發(fā)程度膀曾。在同一進(jìn)程中,線程的切換不會(huì)引起進(jìn)程的切換阳啥;在由一個(gè)進(jìn)程中的線程切換到另一個(gè)進(jìn)程中的線程時(shí)添谊,才會(huì)引起進(jìn)程的切換。
  2. 并發(fā)性:在引入線程的操作系統(tǒng)中察迟,不僅進(jìn)程之間可以并發(fā)執(zhí)行斩狱,同一個(gè)進(jìn)程的多個(gè)線程之間也可以并發(fā)執(zhí)行。因而使操作系統(tǒng)具有更好的并發(fā)性扎瓶,從而能更有效地使用系統(tǒng)資源和提高系統(tǒng)吞吐量所踊。
  3. 擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,它可以擁有自己的資源概荷;而線程不擁有系統(tǒng)資源秕岛,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧)
    但可以訪問(wèn)隸屬于同進(jìn)程擁有的全部資源继薛。
    子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間修壕,而多個(gè)線程則共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文遏考。
  4. 系統(tǒng)開(kāi)銷(xiāo):由于在創(chuàng)建或撤消進(jìn)程時(shí)慈鸠,系統(tǒng)都要為之分配或回收資源,在進(jìn)程切換時(shí)灌具,設(shè)計(jì)整個(gè)進(jìn)程當(dāng)前的CPU環(huán)境的保存以及新調(diào)度到進(jìn)程的CPU環(huán)境的設(shè)置林束,而線程切換只需保存和設(shè)置少量寄存器內(nèi)容,開(kāi)銷(xiāo)很小稽亏,而且進(jìn)程內(nèi)多個(gè)線程共享進(jìn)程地址空間多線程之間的同步與通信非常容易實(shí)現(xiàn)缕题,甚至無(wú)需操作系統(tǒng)干預(yù)截歉。因此,操作系統(tǒng)所付出的開(kāi)銷(xiāo)將顯著地大于在創(chuàng)建或撤消線程時(shí)的開(kāi)銷(xiāo)烟零。進(jìn)程切換的開(kāi)銷(xiāo)也遠(yuǎn)大于線程切換的開(kāi)銷(xiāo)瘪松。

處理器調(diào)度

實(shí)時(shí)操作系統(tǒng)主要的追求目標(biāo):可靠性、及時(shí)響應(yīng)锨阿、快速處理宵睦。與追求系統(tǒng)的吞吐率、CPU 的利用效率無(wú)關(guān)墅诡。

進(jìn)程調(diào)度的方式

  • 可搶占式(可剝奪式):就緒隊(duì)列中一旦有某進(jìn)程的優(yōu)先級(jí)高于當(dāng)前正在執(zhí)行的進(jìn)程的優(yōu)先級(jí)時(shí)壳嚎,操作系統(tǒng)便立即進(jìn)行進(jìn)程調(diào)度昔汉,完成進(jìn)程切換座舍。
  • 不可搶占式(不可剝奪式):即使在就緒隊(duì)列存在有某進(jìn)程優(yōu)先級(jí)高于當(dāng)前正在執(zhí)行的進(jìn)程的優(yōu)先級(jí)時(shí)敬扛,當(dāng)前進(jìn)程仍將占用處理機(jī)執(zhí)行纵穿,直到該進(jìn)程自己進(jìn)入阻塞狀態(tài)裳涛,或時(shí)間片用完沮尿,或在執(zhí)行完系統(tǒng)調(diào)用后準(zhǔn)備返回用戶進(jìn)程前的時(shí)刻齐饮,才重新發(fā)生調(diào)度讓出處理機(jī)疮薇。

顯然姿搜,可搶占式調(diào)度可有效減少等待時(shí)間和響應(yīng)時(shí)間寡润,但會(huì)帶來(lái)較大的其他管理開(kāi)銷(xiāo),使得吞吐量等的性能指標(biāo)比不可搶占式調(diào)度要低舅柜。所以一般在桌面計(jì)算機(jī)中都支持可搶占式調(diào)度梭纹,使得用戶可以得到更好的人機(jī)交互體驗(yàn),而在服務(wù)器領(lǐng)域不必非要可搶占式調(diào)度致份,而通常會(huì)采用不可搶占式調(diào)度栗柒,從而可提高系統(tǒng)的整體吞吐量。

處理器調(diào)度層次

  • 高級(jí)調(diào)度:作業(yè)調(diào)度,本質(zhì)就是根據(jù)某種算法瞬沦,把外存上的作業(yè)調(diào)入內(nèi)存太伊,并為之創(chuàng)建進(jìn)程掛入就緒隊(duì)列逛钻,分配處理機(jī)并執(zhí)行僚焦。執(zhí)行完后,回收資源曙痘。
    一般而言芳悲,批處理系統(tǒng)中才會(huì)有高級(jí)調(diào)度。
  • 中級(jí)調(diào)度:交換調(diào)度边坤,本質(zhì)就是讓暫時(shí)不能運(yùn)行的進(jìn)程掛起名扛,釋放內(nèi)存資源,并把它們調(diào)到外存上去等待茧痒。
  • 低級(jí)調(diào)度:進(jìn)程調(diào)度肮韧,本質(zhì)就是根據(jù)某種算法,把處理機(jī)分配給就緒進(jìn)程隊(duì)列中的某個(gè)進(jìn)程旺订。
    進(jìn)程調(diào)度首先會(huì)保存處理機(jī)現(xiàn)場(chǎng)弄企。將程序計(jì)數(shù)器等指定寄存器中的內(nèi)容保存到 PCB 中。然后將按照某種算法從就緒隊(duì)列中選取進(jìn)程区拳,把處理機(jī)分配給進(jìn)程拘领。最后,把指定進(jìn)程的 PCB 中的處理機(jī)現(xiàn)場(chǎng)信息恢復(fù)到處理機(jī)中樱调,處理機(jī)分配給進(jìn)程執(zhí)行约素。

調(diào)度算法目標(biāo)

1)公平;2)保持系統(tǒng)素有部分盡可能忙碌笆凌;

  • 批處理:1)吞吐量业汰;2)周轉(zhuǎn)時(shí)間;3)CPU 利用率菩颖。
  • 交互式:1)最小響應(yīng)時(shí)間样漆;2)均衡性。
  • 實(shí)時(shí):1)滿足截止時(shí)間晦闰;2)可預(yù)測(cè)性放祟。

調(diào)度算法(批處理、交互式呻右、實(shí)時(shí))

  • 批處理系統(tǒng)
    • 先來(lái)先服務(wù)算法(FCFS):不可搶占調(diào)度方式跪妥,優(yōu)點(diǎn)是公平,實(shí)現(xiàn)簡(jiǎn)單声滥;缺點(diǎn)是不利于短作業(yè)眉撵。
    • 最短作業(yè)優(yōu)先算法(SJF):不可搶占調(diào)度方式侦香,有效地縮短進(jìn)程的平均周轉(zhuǎn)時(shí)間,提高系統(tǒng)的吞吐量纽疟,但不利于長(zhǎng)進(jìn)程的運(yùn)行罐韩。
    • 最短剩余時(shí)間優(yōu)先算法(SRTF):可搶占調(diào)度方式
    • 最高響應(yīng)比優(yōu)先算法(HRRF):介于先來(lái)先服務(wù)算法(只考慮了進(jìn)程的等待時(shí)間)與最短進(jìn)程優(yōu)先算法(只考慮了用戶估計(jì)的進(jìn)程的執(zhí)行時(shí)間)之間的一種折中算法。
      根據(jù) “響應(yīng)比 =(進(jìn)程執(zhí)行時(shí)間 + 進(jìn)程等待時(shí)間)/ 進(jìn)程執(zhí)行時(shí)間” 這個(gè)公式得到的響應(yīng)比來(lái)進(jìn)行調(diào)度污朽。
      高響應(yīng)比優(yōu)先算法在等待時(shí)間相同的情況下散吵,作業(yè)執(zhí)行的時(shí)間越短,響應(yīng)比越高蟆肆,滿足段任務(wù)優(yōu)先矾睦,同時(shí)響應(yīng)比會(huì)隨著等待時(shí)間增加而變大,優(yōu)先級(jí)會(huì)提高炎功,能夠避免饑餓現(xiàn)象枚冗。優(yōu)點(diǎn)是兼顧長(zhǎng)短作業(yè),缺點(diǎn)是計(jì)算響應(yīng)比開(kāi)銷(xiāo)大蛇损,適用于批處理系統(tǒng)赁温。
  • 交互式系統(tǒng)
    • 優(yōu)先級(jí)調(diào)度算法(HPF):在進(jìn)程等待隊(duì)列中選擇優(yōu)先級(jí)最高的來(lái)執(zhí)行。
    • 輪轉(zhuǎn)調(diào)度算法(RR):搶占式調(diào)度州藕,給每個(gè)進(jìn)程固定的執(zhí)行時(shí)間,根據(jù)進(jìn)程到達(dá)的先后順序讓進(jìn)程在單位時(shí)間片內(nèi)執(zhí)行酝陈,執(zhí)行完成后便調(diào)度下一個(gè)進(jìn)程執(zhí)行床玻,時(shí)間片輪轉(zhuǎn)調(diào)度不考慮進(jìn)程等待時(shí)間和執(zhí)行時(shí)間。
    • 多級(jí)反饋隊(duì)列調(diào)度算法(MLFQ):長(zhǎng)進(jìn)程無(wú)法長(zhǎng)期占用處理機(jī)沉帮,且系統(tǒng)的響應(yīng)時(shí)間會(huì)縮短锈死,吞吐量也不錯(cuò)(前提是沒(méi)有頻繁的短進(jìn)程)。所以 MLFQ 調(diào)度算法是一種合適不同類(lèi)型應(yīng)用特征的綜合進(jìn)程調(diào)度算法穆壕。
      優(yōu)點(diǎn)是兼顧長(zhǎng)短作業(yè)待牵,有較好的響應(yīng)時(shí)間,可行性強(qiáng)喇勋,適用于各種作業(yè)環(huán)境缨该;缺點(diǎn)是平均等待時(shí)間較長(zhǎng),上下文切換較費(fèi)時(shí)川背。適用于分時(shí)系統(tǒng)贰拿。
  • 實(shí)時(shí)調(diào)度
    • 硬實(shí)時(shí)(hard real time)調(diào)度:調(diào)度機(jī)制確保一個(gè)關(guān)鍵任務(wù)能在指定時(shí)間前完成
    • 軟實(shí)時(shí)(soft real time)調(diào)度:調(diào)度機(jī)制盡量給予關(guān)鍵任務(wù)最高優(yōu)先級(jí),盡量在指定時(shí)間前完成

同步熄云、通信與死鎖

進(jìn)程間通信 IPC

如何傳遞消息膨更?
確保多個(gè)進(jìn)程在關(guān)鍵活動(dòng)時(shí)不會(huì)交叉
正確的順序

為什么進(jìn)程間要進(jìn)行通信

  • 數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程。
  • 資源共享:多個(gè)進(jìn)程間共享同樣的資源缴允。
  • 通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息荚守。通知它們發(fā)送了某種事件。
  • 進(jìn)程控制:有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Debug進(jìn)程),此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有操作矗漾,并能夠及時(shí)知道它的狀態(tài)改變锈候。

進(jìn)程間的通信方式

每個(gè)進(jìn)程各自有不同的用戶地址空間,任何一個(gè)進(jìn)程的全局變量在另一個(gè)進(jìn)程中都看不到缩功,所以進(jìn)程之間要交換數(shù)據(jù)必須通過(guò)內(nèi)核晴及,在內(nèi)核中開(kāi)辟一塊緩沖區(qū),進(jìn)程 1 把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū)嫡锌,進(jìn)程 2 再?gòu)膬?nèi)核緩沖區(qū)把數(shù)據(jù)讀走虑稼,內(nèi)核提供的這種機(jī)制稱為進(jìn)程間通信(IPC,InterProcess Communication)势木。

進(jìn)程通信實(shí)質(zhì)上就是進(jìn)程中線程之間的通信蛛倦。

進(jìn)程通信就是指進(jìn)程間的信息交換,交換信息可以使一個(gè)狀態(tài)啦桌,也可以是很多的 byte溯壶。進(jìn)程間同步互斥也存在信息的交換,因此也屬于是一種 IPC甫男,屬于是低級(jí)通信且改。該低級(jí)通信存在的問(wèn)題:1)通信的數(shù)據(jù)量太少;2)通信對(duì)用戶不透明 (數(shù)據(jù)的傳遞或者同步互斥都需要程序員實(shí)現(xiàn))

高級(jí)通信機(jī)制:

  • 信號(hào)(signal)通信機(jī)制:信號(hào)是一種比較復(fù)雜的通信方式板驳,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生又跛。只能發(fā)送單個(gè)信號(hào)而不能傳送數(shù)據(jù)
  • 管道(pipeline)通信機(jī)制
    • 匿名管道(pipe):管道是一種半雙工的通信方式若治,數(shù)據(jù)只能單向流動(dòng)慨蓝,需要雙向通信時(shí)需要建立起兩個(gè)管道;而且只能在具有親緣關(guān)系的進(jìn)程間(父子進(jìn)程關(guān)系)通信端幼。
    • 命名管道(FIFO):有名管道也是半雙工的通信方式礼烈,克服了管道沒(méi)有名字的限制,它允許無(wú)親緣關(guān)系進(jìn)程間的通信婆跑。
  • 消息傳遞(message passing)通信機(jī)制:消息隊(duì)列是由消息的鏈表此熬,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息滑进,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息摹迷。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)郊供。
  • 信號(hào)量(semaphore)通信機(jī)制:信號(hào)量是一個(gè)計(jì)數(shù)器峡碉,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)。它常作為一種鎖機(jī)制驮审,防止某進(jìn)程正在訪問(wèn)共享資源時(shí)鲫寄,其他進(jìn)程也訪問(wèn)該資源吉执。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段地来。
  • 共享內(nèi)存(shared memory)通信機(jī)制:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存戳玫,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)未斑。共享內(nèi)存是最快的 IPC 方式咕宿,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門(mén)設(shè)計(jì)的。它往往與其他通信機(jī)制蜡秽,如信號(hào)兩府阀,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信芽突。
  • 套接字(socket)通信機(jī)制:套解口也是一種進(jìn)程間通信機(jī)制试浙,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信寞蚌。

進(jìn)程間通信 IPC (InterProcess Communication)

信號(hào)通信機(jī)制

信號(hào)機(jī)制是unix系統(tǒng)中最為古老的進(jìn)程間通信機(jī)制田巴,很多條件可以產(chǎn)生一個(gè)信號(hào):

  • 當(dāng)用戶按某些鍵時(shí),產(chǎn)生信號(hào)挟秤;
  • 硬件異常產(chǎn)生信號(hào)壹哺,這些情況通常由硬件檢測(cè)到;
  • 進(jìn)程用kill函數(shù)將信號(hào)發(fā)送給另一個(gè)進(jìn)程艘刚;
  • 用戶可用kill命令將信號(hào)發(fā)送給其它進(jìn)程管宵。

缺點(diǎn):開(kāi)銷(xiāo)太大,發(fā)送進(jìn)程需要調(diào)用系統(tǒng)調(diào)用昔脯,這時(shí)核心會(huì)中斷接收進(jìn)程啄糙,且要管理它的堆棧笛臣、調(diào)用處理程序云稚、恢復(fù)被中斷的接收信號(hào)進(jìn)程等。另外信號(hào)的數(shù)量受到限制沈堡,并且只能傳送有限的信息量静陈,例如不能攜帶參數(shù)等,所以對(duì)于復(fù)雜的通信操作不適用诞丽。

管道通信機(jī)制

匿名管道通信

特點(diǎn):

  • 管道是半雙工的鲸拥,數(shù)據(jù)只能向一個(gè)方向流動(dòng);需要雙方通信時(shí)僧免,需要建立起兩個(gè)管道刑赶;
  • 只能在具有公共祖先的兩個(gè)進(jìn)程之間使用;
  • 一個(gè)進(jìn)程向管道中寫(xiě)的內(nèi)容被管道另一端的進(jìn)程讀出懂衩。寫(xiě)入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾撞叨,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)金踪。如果讀進(jìn)程不讀走管道緩沖區(qū)中的數(shù)據(jù),那么寫(xiě)操作將阻塞牵敷。
  • 管道內(nèi)部提供了同步機(jī)制
image
  1. 父進(jìn)程調(diào)用 pipe 開(kāi)辟管道胡岔,得到兩個(gè)文件描述符指向管道的兩端。
  2. 父進(jìn)程調(diào)用 fork 創(chuàng)建子進(jìn)程靶瘸,那么子進(jìn)程也有兩個(gè)文件描述符指向同一管道。
  3. 父進(jìn)程關(guān)閉管道寫(xiě)端毛肋,子進(jìn)程關(guān)閉管道讀端怨咪。子進(jìn)程可以往管道里寫(xiě),父進(jìn)程可以從管道里讀村生,管道是用環(huán)形隊(duì)列實(shí)現(xiàn)的惊暴,數(shù)據(jù)從寫(xiě)端流入從讀端流出,這樣就實(shí)現(xiàn)了進(jìn)程間通信趁桃。

在 linux 下辽话,管道被非常廣泛地使用,一般在編程中我們實(shí)現(xiàn)了 popen 等的應(yīng)用即可提供管道功能卫病。而在命令行中使用地也非常多油啤,| 就是最為典型的管道的應(yīng)用例子。shell 會(huì)為 | 符號(hào)兩側(cè)的命令各創(chuàng)建一個(gè)腳本蟀苛,將左側(cè)的輸出管道與右側(cè)的輸入管道進(jìn)行連接益咬,可以進(jìn)行單向管道通信。 比如我們使用 go env 來(lái)確認(rèn) go 語(yǔ)言的環(huán)境變量帜平,然后使用 grep 從中確認(rèn)出 GOROOT 環(huán)境變量的值一般會(huì)如下這樣做:go env | grep GOROOT幽告。
實(shí)現(xiàn)的過(guò)程其實(shí)是: go env 會(huì)啟動(dòng)一個(gè)進(jìn)程, 而 grep 命令也會(huì)產(chǎn)生一個(gè)進(jìn)程裆甩,grep 的進(jìn)程會(huì)在 go env 的標(biāo)準(zhǔn)輸出中進(jìn)行檢索 GOROOT 的行的信息然后顯示出來(lái)冗锁,而負(fù)責(zé)這兩個(gè)進(jìn)程間的通信的正是管道。 在 c 語(yǔ)言中嗤栓,我們需要父進(jìn)程中進(jìn)行 fork 以及對(duì)父進(jìn)程的基本信息進(jìn)行處理冻河,同時(shí)初期化連接的管道信息從而實(shí)現(xiàn)管道通信。接下來(lái)茉帅,我們來(lái)看一下在 go 語(yǔ)言中是如何實(shí)現(xiàn)的

命名管道

FIFO 是一種先進(jìn)先出的隊(duì)列叨叙。它類(lèi)似于一個(gè)管道,只允許數(shù)據(jù)的單向流動(dòng)堪澎。每個(gè)FIFO 都有一個(gè)名字擂错,允許不相關(guān)的進(jìn)程訪問(wèn)同一個(gè) FIFO。因此也成為命名管道樱蛤。

命名管道 (NamedPipe) 是服務(wù)器進(jìn)程和一個(gè)或多個(gè)客戶進(jìn)程之間通信的單向或雙向管道钮呀。不同于匿名管道的是:命名管道可以在不相關(guān)的進(jìn)程之間和不同計(jì)算機(jī)之間使用桃犬,服務(wù)器建立命名管道時(shí)給它指定一個(gè)名字,任何進(jìn)程都可以通過(guò)該名字打開(kāi)管道的另一端行楞,根據(jù)給定的權(quán)限和服務(wù)器進(jìn)程通信攒暇。命名管道提供了相對(duì)簡(jiǎn)單的編程接口,使通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)并不比同一計(jì)算機(jī)上兩進(jìn)程之間通信更困難子房,不過(guò)如果要同時(shí)和多個(gè)進(jìn)程通信它就力不從心了形用。

命名管道不同與管道只能在具有親緣關(guān)系的進(jìn)程間通信了。它提供了一個(gè)路徑名與之關(guān)聯(lián)证杭,有了自己的傳輸格式田度。

命名管道和管道的不同之處還有一點(diǎn)是, 有名管道是個(gè)設(shè)備文件,存儲(chǔ)在文件系統(tǒng)中解愤,沒(méi)有親緣關(guān)系的進(jìn)程也可以訪問(wèn)镇饺,但是它要按照先進(jìn)先出的原則讀取數(shù)據(jù)。同樣也是單雙工的送讲。

消息傳遞通信機(jī)制

消息隊(duì)列實(shí)際上就是一個(gè)鏈表奸笤,而消息就是鏈表中具有特定格式和優(yōu)先級(jí)的記錄,對(duì)消息隊(duì)列有寫(xiě)權(quán)限的進(jìn)程可以根據(jù)一定規(guī)則在消息鏈表中添加消息哼鬓,對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中獲得所需的信息监右。

在某個(gè)進(jìn)程往一個(gè)消息隊(duì)列寫(xiě)入消息之前,并不需要另外某個(gè)進(jìn)程在該隊(duì)列上等待消息的到達(dá)异希。這跟命名管道是不同的健盒,對(duì)后者來(lái)說(shuō),除非讀端已經(jīng)存在称簿,否則寫(xiě)端的打開(kāi)管道操作會(huì)一直阻塞扣癣。此外,管道和命名管道都是隨進(jìn)程持續(xù)的憨降,而消息隊(duì)列還有后面的信號(hào)量父虑、共享內(nèi)存都是隨內(nèi)核持續(xù)的。也就是說(shuō)當(dāng)一個(gè)管道或 FIFO 的最后一次關(guān)閉發(fā)生時(shí)券册,仍在該管道或 FIFO 上的數(shù)據(jù)將被丟棄频轿。而對(duì)于消息隊(duì)列來(lái)說(shuō)垂涯,除非內(nèi)核自舉或顯式刪除烁焙,否則其一直存在。

與命名管道相比耕赘,消息隊(duì)列的優(yōu)勢(shì)在于:

  • 消息隊(duì)列可以獨(dú)立于發(fā)送和接收進(jìn)程而存在骄蝇,從而消除了在同步命名管道的打開(kāi)和關(guān)閉時(shí)可能產(chǎn)生的困難。
  • 同時(shí)通過(guò)發(fā)送消息還可以避免命名管道的同步和阻塞問(wèn)題操骡,不需要由進(jìn)程自己來(lái)提供同步方法九火。
  • 接收程序可以通過(guò)消息類(lèi)型有選擇地接收數(shù)據(jù)赚窃,而不是像命名管道中那樣,只能默認(rèn)地接收岔激。

信號(hào)量通信機(jī)制

為了防止出現(xiàn)因多個(gè)程序同時(shí)訪問(wèn)一個(gè)共享資源而引發(fā)的一系列問(wèn)題勒极,我們需要一種方法,它可以通過(guò)生成并使用令牌來(lái)授權(quán)虑鼎,在任一時(shí)刻只能有一個(gè)執(zhí)行線程訪問(wèn)代碼的臨界區(qū)域辱匿。而信號(hào)量就可以提供這樣的一種訪問(wèn)機(jī)制,讓一個(gè)臨界區(qū)同一時(shí)間只有一個(gè)線程在訪問(wèn)它炫彩,也就是說(shuō)信號(hào)量是用來(lái)協(xié)調(diào)進(jìn)程對(duì)共享資源的訪問(wèn)的匾七。

信號(hào)量是一個(gè)特殊的變量,程序?qū)ζ湓L問(wèn)都是原子操作江兢,且只允許對(duì)它進(jìn)行等待和發(fā)送操作昨忆,也即 P(sv) 和 V(sv),他們的行為是這樣的:

  • P(sv):如果 sv 的值大于零杉允,就給它減 1邑贴;如果它的值為零,就掛起該進(jìn)程的執(zhí)行叔磷;
  • V(sv):如果有其他進(jìn)程因等待 sv 而被掛起痢缎,就讓它恢復(fù)運(yùn)行,如果沒(méi)有進(jìn)程因等待 sv 而掛起世澜,就給它加 1独旷。

最簡(jiǎn)單的信號(hào)量是只能取 0 和 1 的變量,這也是信號(hào)量最常見(jiàn)的一種形式寥裂,叫做互斥信號(hào)量嵌洼,可以取多個(gè)正整數(shù)的信號(hào)量被稱為通用信號(hào)量。

舉個(gè)例子來(lái)說(shuō)封恰,如果兩個(gè)進(jìn)程共享互斥信號(hào)量 sv麻养,一旦其中一個(gè)進(jìn)程執(zhí)行了 P(sv) 操作,它將得到信號(hào)量诺舔,并可以進(jìn)入臨界區(qū)鳖昌,使 sv 減 1。而第二個(gè)進(jìn)程將被阻止進(jìn)入臨界區(qū)低飒,因?yàn)楫?dāng)它試圖執(zhí)行 P(sv) 時(shí)许昨,sv 為 0,它會(huì)被掛起以等待第一個(gè)進(jìn)程離開(kāi)臨界區(qū)域并執(zhí)行 V(sv) 釋放信號(hào)量褥赊,這時(shí)第二個(gè)進(jìn)程就可以恢復(fù)執(zhí)行糕档。

共享內(nèi)存通信機(jī)制

共享內(nèi)存就是允許兩個(gè)不相關(guān)的進(jìn)程訪問(wèn)同一個(gè)邏輯內(nèi)存。共享內(nèi)存是在兩個(gè)正在運(yùn)行的進(jìn)程之間共享和傳遞數(shù)據(jù)的一種最有效的方式拌喉,不同進(jìn)程之間共享的內(nèi)存通常安排為同一段物理內(nèi)存速那。進(jìn)程可以將同一段共享內(nèi)存連接到它們自己的地址空間中俐银,所有進(jìn)程都可以訪問(wèn)共享內(nèi)存中的地址,就好像它們是由用 C 語(yǔ)言函數(shù) malloc 分配的內(nèi)存一樣端仰。而如果某個(gè)進(jìn)程向共享內(nèi)存寫(xiě)入數(shù)據(jù)捶惜,所做的改動(dòng)將立即影響到可以訪問(wèn)同一段共享內(nèi)存的任何其他進(jìn)程。

image

注意共享內(nèi)存并未提供同步機(jī)制荔烧,也就是說(shuō)售躁,在第一個(gè)進(jìn)程結(jié)束對(duì)共享內(nèi)存的寫(xiě)操作之前,并無(wú)自動(dòng)機(jī)制可以阻止第二個(gè)進(jìn)程開(kāi)始對(duì)它進(jìn)行讀取茴晋。所以通常需要用其他的機(jī)制來(lái)同步對(duì)共享內(nèi)存的訪問(wèn)陪捷,例如前面說(shuō)到的信號(hào)量。

采用共享內(nèi)存通信的一個(gè)顯而易見(jiàn)的好處是效率高诺擅,因?yàn)檫M(jìn)程可以直接讀寫(xiě)內(nèi)存把沼,而不需要任何數(shù)據(jù)的拷貝五嫂。對(duì)于像管道和消息隊(duì)列等通信方式讼育,則需要在內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝牺蹄,而共享內(nèi)存則只拷貝兩次數(shù)據(jù):一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件撮执。

套接字通信機(jī)制

Socket 通信微峰,不僅僅是一臺(tái)主機(jī)上的兩個(gè)進(jìn)程可以進(jìn)行通信,還可以讓處在因特網(wǎng)中的兩個(gè)進(jìn)程進(jìn)行通信抒钱。在兩個(gè)進(jìn)程進(jìn)行通信的時(shí)候蜓肆,首先本地的進(jìn)程在運(yùn)行的時(shí)候會(huì)綁定一個(gè)端口,然后我們本地為該進(jìn)程生成一個(gè)緩沖區(qū)谋币,返回一個(gè)值仗扬,即為 socket 作為對(duì)其進(jìn)行標(biāo)記,每當(dāng)本地進(jìn)程和遠(yuǎn)程一個(gè)進(jìn)程建立連接的時(shí)候蕾额,就會(huì)根據(jù)遠(yuǎn)程進(jìn)程的信息和本地進(jìn)程的信息生成一個(gè) socket早芭,然后雙方借助于 socket 就可以進(jìn)行通信,運(yùn)輸層得到的數(shù)據(jù)寫(xiě)入 socket 標(biāo)志的緩沖區(qū)诅蝶,然后在里面進(jìn)行相應(yīng)的操作之后將其提交給網(wǎng)絡(luò)層退个。相比其它的幾種處理方式,該中方式比較麻煩调炬。多于服務(wù)端语盈,通過(guò) listen 阻塞監(jiān)聽(tīng),監(jiān)聽(tīng)到有連接請(qǐng)求筐眷,通過(guò) accept 函數(shù)得到一個(gè)本地與之對(duì)應(yīng)的緩沖區(qū)黎烈,然后創(chuàng)建一個(gè)進(jìn)程用來(lái)和該連接進(jìn)行交互习柠,然后通過(guò) receive 來(lái)接收信息匀谣。

解決并發(fā)的方案

需要滿足 4 個(gè)條件:

  • 空閑讓進(jìn)
  • 忙則等待
  • 有限等待
  • 讓權(quán)等待(阻塞的進(jìn)程把 CPU 讓給其他進(jìn)程)

經(jīng)典的進(jìn)程同步問(wèn)題

生產(chǎn)者 - 消費(fèi)者問(wèn)題照棋;哲學(xué)家進(jìn)餐問(wèn)題;讀者 - 寫(xiě)者問(wèn)題

死鎖

死鎖的概念

死鎖:當(dāng)某進(jìn)程提出資源申請(qǐng)后武翎,使得系統(tǒng)中一些進(jìn)程處于無(wú)休止的阻塞狀態(tài)烈炭,在無(wú)外力作用下,永遠(yuǎn)不能再繼續(xù)前進(jìn)宝恶。

產(chǎn)生死鎖的根本原因:資源有限且操作不當(dāng)符隙。

產(chǎn)生死鎖的必要條件

  • 互斥條件:某段時(shí)間內(nèi)某資源只能由一個(gè)進(jìn)程使用。
  • 占有和等待條件:進(jìn)程因請(qǐng)求資源而阻塞時(shí)垫毙,對(duì)已分配給它的資源保持不放霹疫。
  • 不剝奪條件:資源在未使用完前,不能被剝奪综芥,由使用進(jìn)程釋放丽蝎。
  • 循環(huán)等待條件:發(fā)生死鎖時(shí),有向圖必構(gòu)成一環(huán)路膀藐。

解決死鎖的方法

死鎖防止:破壞四個(gè)條件
死鎖避免:銀行家算法
死鎖的檢測(cè)和恢復(fù):死鎖檢測(cè)算法

死鎖例題

  • 一個(gè)計(jì)算機(jī)有 6 臺(tái)可互換使用的磁帶機(jī)屠阻,由 n 個(gè)進(jìn)程競(jìng)爭(zhēng)使用,每一個(gè)進(jìn)程在一段時(shí)間內(nèi)需要獨(dú)占兩臺(tái)磁帶機(jī)進(jìn)行使用额各,n 最多為 5 時(shí)系統(tǒng)一定不會(huì)發(fā)生死鎖国觉。

這種題的解法一般都是從最壞的角度出發(fā):即假設(shè)有很多進(jìn)程來(lái)申請(qǐng)磁帶機(jī),假設(shè)已經(jīng)有 5 個(gè)進(jìn)程虾啦,一個(gè)進(jìn)程申請(qǐng)了一個(gè)磁帶機(jī)麻诀,那么還剩下一個(gè)磁帶機(jī),此時(shí)剛剛的 5 個(gè)進(jìn)程中的任意一個(gè)還可以再申請(qǐng)一個(gè)磁帶機(jī)即可滿足運(yùn)行條件傲醉。但是如果一開(kāi)始就有 6 個(gè)進(jìn)程针饥,一個(gè)進(jìn)程申請(qǐng)一個(gè)磁帶機(jī)的話,那么就沒(méi)有剩下的磁帶機(jī)了需频,所以這時(shí)候誰(shuí)都不能運(yùn)行丁眼,所以,最多不能超過(guò) 5 個(gè)昭殉。

  • 某系統(tǒng)中有 11 臺(tái)打印機(jī)苞七,N 個(gè)進(jìn)程共享打印機(jī)資源,每個(gè)進(jìn)程要求 3 臺(tái)挪丢,當(dāng) N 不超過(guò) 5 時(shí)蹂风,系統(tǒng)不會(huì)發(fā)生死鎖。

思路和上面的一樣乾蓬,考慮最壞的情況惠啄,有 5 個(gè)進(jìn)程均申請(qǐng)了 2 臺(tái)打印機(jī),那么此時(shí) 5 個(gè)進(jìn)程中的任一進(jìn)程再申請(qǐng)一臺(tái)打印機(jī)即可正常運(yùn)行。但是如果 N=6撵渡,那么假設(shè)有 5 個(gè)進(jìn)程申請(qǐng)了 2 臺(tái)打印機(jī)融柬,一個(gè)進(jìn)程申請(qǐng)了一臺(tái)打印機(jī),此時(shí)已經(jīng)沒(méi)有剩余的打印機(jī)了趋距,現(xiàn)在誰(shuí)都不能繼續(xù)運(yùn)行粒氧。

多道程序設(shè)計(jì)中,進(jìn)程間存在的制約關(guān)系有哪些节腐?

同步:某一進(jìn)程收不到另一進(jìn)程給他的必要信息外盯,就不能繼續(xù)運(yùn)行下去,這種制約關(guān)系源于進(jìn)程間的合作翼雀。 互斥:某一進(jìn)程要求使用某資源饱苟,而該資源正被另一進(jìn)程使用,并且這以資源不許兩進(jìn)程同時(shí)使用狼渊,那么進(jìn)程只好等占用資源進(jìn)程釋放資源后才能占有使用掷空。

高級(jí)通信機(jī)制與低級(jí)通信機(jī)制PV操作的區(qū)別是什么?簡(jiǎn)述消息緩沖隊(duì)列的工作原理囤锉。

PV操作時(shí)指進(jìn)程之間通過(guò)共享變量實(shí)現(xiàn)信息傳遞坦弟;而高級(jí)通信機(jī)制是由系統(tǒng)提供發(fā)送(sender)與接收(receive)兩個(gè)操作,進(jìn)程間通過(guò)這兩個(gè)操作進(jìn)行通信官地,無(wú)需貢獻(xiàn)任何變量酿傍。基本原理:操作系統(tǒng)管理一個(gè)用于進(jìn)程通信的緩沖池驱入,其中的每一個(gè)緩沖區(qū)單元咳存放一條信息赤炒。發(fā)送消息時(shí),發(fā)送者從中申請(qǐng)一個(gè)可用緩沖區(qū)亏较,接受者取出一條信息時(shí)再釋放該緩沖區(qū)莺褒,每個(gè)進(jìn)程均設(shè)置一條消息隊(duì)列,任何發(fā)送給該進(jìn)程的消息均暫存在其中雪情。

存儲(chǔ)管理

存儲(chǔ)器工作原理

存儲(chǔ)器功能

  • 存儲(chǔ)分配與回收:為每道程序分配內(nèi)存空間遵岩;提高內(nèi)存利用率;允許動(dòng)態(tài)申請(qǐng)內(nèi)存空間巡通。
  • 地址映射:在多道程序環(huán)境下尘执,程序中的邏輯地址與內(nèi)存中的物理地址不可能一致,因此必須提供地址變換功能宴凉,將用戶的邏輯地址轉(zhuǎn)換成主存的物理地址誊锭,實(shí)現(xiàn)重定位,確保程序正常運(yùn)行弥锄。
  • 存儲(chǔ)保護(hù):每道程序都只在自己的內(nèi)存空間內(nèi)運(yùn)行丧靡,互不干擾蟆沫。
  • 存儲(chǔ)共享:
  • 存儲(chǔ)擴(kuò)充:借助于虛擬存儲(chǔ)技術(shù),從邏輯上去擴(kuò)充內(nèi)存容量温治。

程序裝入和鏈接

創(chuàng)建進(jìn)程首先要將程序和數(shù)據(jù)裝入內(nèi)存饭庞。將用戶源程序變?yōu)榭稍趦?nèi)存中執(zhí)行的程序,通常需要以下幾個(gè)步驟:

編譯:由編譯程序?qū)⒂脩粼创a編譯成若干個(gè)目標(biāo)模塊罐盔。
鏈接:由鏈接程序?qū)⒕幾g后形成的一組目標(biāo)模塊但绕,以及所需庫(kù)函數(shù)鏈接在一起救崔,形成一個(gè)完整的裝入模塊惶看。
裝入:由裝入程序?qū)⒀b入模塊裝入內(nèi)存運(yùn)行。

重定位

重定位的概念

由于一個(gè)作業(yè)裝入到與其地址空間不一致的存儲(chǔ)空間六孵,對(duì)有關(guān)地址部分的調(diào)整過(guò)程稱為重定位∥忱瑁現(xiàn)在一般計(jì)算機(jī)系統(tǒng)中都采用動(dòng)態(tài)重定位方法。

為什么要重定位劫窒?

我們寫(xiě)正常程序的時(shí)候根本不用去關(guān)心變量的位置本今,因?yàn)樵闯绦蛟诰幾g的時(shí)候它的內(nèi)存中的位置郡被計(jì)算好了。程序裝入內(nèi)存時(shí)主巍,系統(tǒng)不會(huì)為它重定位冠息。我們需要用到變量 的時(shí)候直接用變量名訪問(wèn)它就行了。有的程序不可避免也要用到變量孕索,各個(gè)變量 在內(nèi)存中的位置自然也不相同逛艰。既然這些變量沒(méi)有固定的地址,那么程序在運(yùn)行的過(guò)程中只有重定位搞旭,才可以正常地訪問(wèn)相關(guān)資源散怖。

重定位方式

對(duì)程序進(jìn)行重定位的技術(shù)按重定位的時(shí)機(jī)可分為兩種:靜態(tài)重定位和動(dòng)態(tài)重定位。

  • 靜態(tài)重定位:是在目標(biāo)程序裝入內(nèi)存時(shí)肄渗,由裝入程序?qū)δ繕?biāo)程序中的指令和數(shù)據(jù)的地址進(jìn)行修改镇眷,即把程序的邏輯地址都改成實(shí)際的地址。對(duì)每個(gè)程序來(lái)說(shuō)翎嫡,這種地址變換只是在裝入時(shí)一次完成欠动,在程序運(yùn)行期間不再進(jìn)行重定位。

    • 優(yōu)點(diǎn):是無(wú)需增加硬件地址轉(zhuǎn)換機(jī)構(gòu)惑申,便于實(shí)現(xiàn)程序的靜態(tài)連接翁垂。在早期計(jì)算機(jī)系統(tǒng)中大多采用這種方案。
    • 缺點(diǎn):(1)程序的存儲(chǔ)空間只能是連續(xù)的一片區(qū)域硝桩,而且在重定位之后就不能再移動(dòng)沿猜。這不利于內(nèi)存空間的有效使用。(2)各個(gè)用戶進(jìn)程很難共享內(nèi)存中的同一程序的副本碗脊。
  • 動(dòng)態(tài)重定位:是在程序執(zhí)行期間每次訪問(wèn)內(nèi)存之前進(jìn)行重定位啼肩,即逐條指令執(zhí)行時(shí)完成地址轉(zhuǎn)換橄妆。這種變換是靠硬件地址變換機(jī)構(gòu)實(shí)現(xiàn)的。通常采用一個(gè)重定位寄存器祈坠,其中放有當(dāng)前正在執(zhí)行的程序在內(nèi)存空間中的起始地址害碾,而地址空間中的代碼在裝入過(guò)程中不發(fā)生變化。

    • 優(yōu)點(diǎn):(1)程序占用的內(nèi)存空間動(dòng)態(tài)可變赦拘,不必連續(xù)存放在一處慌随。(2)比較容易實(shí)現(xiàn)幾個(gè)進(jìn)程對(duì)同一程序副本的共享使用。
    • 缺點(diǎn):是需要附加的硬件支持躺同,增加了機(jī)器成本阁猜,而且實(shí)現(xiàn)存儲(chǔ)管理的軟件算法比較復(fù)雜。
      動(dòng)態(tài)重定位是在作業(yè)運(yùn)行時(shí)執(zhí)行到一條訪存指令時(shí)再把邏輯地址轉(zhuǎn)換為主存中的物理地址蹋艺,實(shí)際中是通過(guò)硬件地址轉(zhuǎn)換機(jī)制實(shí)現(xiàn)的剃袍。

連續(xù)存儲(chǔ)管理

單一連續(xù)存儲(chǔ)管理

在這種管理方式中,內(nèi)存被分為兩個(gè)區(qū)域:系統(tǒng)區(qū)和用戶區(qū)捎谨。應(yīng)用程序裝入到用戶區(qū)民效,可使用用戶區(qū)全部空間。其特點(diǎn)是涛救,最簡(jiǎn)單畏邢,適用于單用戶、單任務(wù)的操作系統(tǒng)检吆。CP/M 和 DOS 2.0 以下就是采用此種方式舒萎。這種方式的最大優(yōu)點(diǎn)就是易于管理。但也存在著一些問(wèn)題和不足之處咧栗,例如對(duì)要求內(nèi)存空間少的程序逆甜,造成內(nèi)存浪費(fèi);程序全部裝入致板,使得很少使用的程序部分也占用—定數(shù)量的內(nèi)存交煞。

固定分區(qū)存儲(chǔ)管理

原理

把內(nèi)存空間劃分為數(shù)量和大小固定不變的連續(xù)分區(qū),各分區(qū)大小不等斟或,每個(gè)分區(qū)只裝入一個(gè)作業(yè)素征,若多個(gè)分區(qū)中都裝有作業(yè),則它們可以并發(fā)執(zhí)行萝挤,這樣就支持多道程序設(shè)計(jì)御毅。

設(shè)置一張內(nèi)存分配表,記錄內(nèi)存中劃分的分區(qū)及其使用情況怜珍。內(nèi)存分配表指出各分區(qū)起始地址和長(zhǎng)度端蛆,占用標(biāo)志用來(lái)指示此分區(qū)是否被使用。

內(nèi)存分配時(shí)總是選擇那些占用標(biāo)志為0的未被占用分區(qū)酥泛,當(dāng)某分區(qū)被分配給一個(gè)長(zhǎng)度小于等于分區(qū)長(zhǎng)度的作業(yè)后今豆,則在占用標(biāo)志中填入占用此分區(qū)的作業(yè)名嫌拣。

當(dāng)分區(qū)中的程序執(zhí)行結(jié)束歸還內(nèi)存區(qū)時(shí),相應(yīng)分區(qū)的占用標(biāo)志置0呆躲,其占用的分區(qū)又變成空閑异逐,可被重新分配使用。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):易于實(shí)現(xiàn)插掂,開(kāi)銷(xiāo)谢艺啊;能解決單道程序運(yùn)行在并發(fā)環(huán)境下與CPU速度不匹配內(nèi)存空間利用率低的問(wèn)題辅甥。

缺點(diǎn):內(nèi)碎片問(wèn)題酝润;存儲(chǔ)器利用率極低;大作業(yè)無(wú)法裝入肆氓;分區(qū)總數(shù)固定袍祖,很難動(dòng)態(tài)擴(kuò)充內(nèi)存空間底瓣;分區(qū)數(shù)目在系統(tǒng)初始化時(shí)指定谢揪,限制了并發(fā)執(zhí)行的程序數(shù)目。

可變分區(qū)存儲(chǔ)管理

原理

動(dòng)態(tài)創(chuàng)建分區(qū):在裝入程序時(shí)按其初始要求分配捐凭,或在其執(zhí)行過(guò)程中根據(jù)作業(yè)大小通過(guò)系統(tǒng)調(diào)用進(jìn)行分配或改變分區(qū)大小拨扶。

動(dòng)態(tài)分區(qū)的分區(qū)分配就是尋找某個(gè)空閑分區(qū),其大小需大于或等于程序的要求茁肠。若是大于要求患民,則將該分區(qū)分割成兩個(gè)分區(qū),其中一個(gè)分區(qū)為要求的大小并標(biāo)記為 “占用”垦梆,而另一個(gè)分區(qū)為余下部分并標(biāo)記為 “空閑”匹颤。分區(qū)分配的先后次序通常是從內(nèi)存低端到高端。動(dòng)態(tài)分區(qū)的分區(qū)釋放過(guò)程中有一個(gè)要注意的問(wèn)題是托猩,將相鄰的空閑分區(qū)合并成一個(gè)大的空閑分區(qū)印蓖。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):沒(méi)有內(nèi)碎片。

缺點(diǎn):外碎片問(wèn)題京腥。

可變分區(qū)分配算法

  • 最先適應(yīng)法(first fit):按分區(qū)在內(nèi)存的先后次序從頭查找赦肃,找到符合要求的第一個(gè)分區(qū)進(jìn)行分配。該算法的分配和釋放的時(shí)間性能較好公浪,較大的空閑分區(qū)可以被保留在內(nèi)存高端他宛。但隨著低端分區(qū)不斷劃分會(huì)產(chǎn)生較多小分區(qū),每次分配時(shí)查找時(shí)間開(kāi)銷(xiāo)便會(huì)增大欠气。
  • 下次適應(yīng)法(next fit):按分區(qū)在內(nèi)存的先后次序從上次分配的分區(qū)起查找厅各,找到符合要求的第一個(gè)分區(qū)進(jìn)行分配。該算法的分配和釋放的時(shí)間性能較好预柒,使空閑分區(qū)分布得更均勻队塘,但較大空閑分區(qū)不易保留琐鲁。
  • 最優(yōu)適應(yīng)法(best fit):按分區(qū)在內(nèi)存的先后次序從頭查找,找到其大小與要求相差最小的空閑分區(qū)進(jìn)行分配人灼。從個(gè)別來(lái)看围段,外碎片較小投放;但從整體來(lái)看奈泪,會(huì)形成較多外碎片優(yōu)點(diǎn)是較大的空閑分區(qū)可以被保留。
  • 最壞適應(yīng)法(worst fit):按分區(qū)在內(nèi)存的先后次序從頭查找灸芳,找到最大的空閑分區(qū)進(jìn)行分配涝桅。基本不留下小空閑分區(qū)烙样,不易形成外碎片冯遂。但由于較大的空閑分區(qū)不被保留,當(dāng)對(duì)內(nèi)存需求較大的進(jìn)程需要運(yùn)行時(shí)谒获,其要求不易被滿足蛤肌。
  • 快速應(yīng)法 (quick fit):為那些經(jīng)常用到的長(zhǎng)度的空閑區(qū)設(shè)立單獨(dú)的空閑區(qū)鏈表。

內(nèi)存不足的存儲(chǔ)管理技術(shù)(碎片整理)

  • 移動(dòng)技術(shù):把已在內(nèi)存中的進(jìn)程分區(qū)連接到一起批狱,使分散的空閑區(qū)匯集成片裸准,也叫內(nèi)存緊湊。
  • 對(duì)換技術(shù):在某個(gè)進(jìn)程在不被使用(阻塞)或在CPU調(diào)度原則下被剝奪運(yùn)行權(quán)利的時(shí)候赔硫,被暫時(shí)移出內(nèi)存炒俱,騰出空間給其他進(jìn)程使用,同時(shí)交換到磁盤(pán)中爪膊,此時(shí)處于就緒狀態(tài)权悟,需要時(shí)再加載回來(lái)
  • 覆蓋技術(shù):一個(gè)程序的幾個(gè)代碼段或數(shù)據(jù)段推盛,按照時(shí)間先后來(lái)占用公共的內(nèi)存空間峦阁。將程序必要部分(常用功能)的代碼和數(shù)據(jù)常駐內(nèi)存;可選部分(不常用功能)平時(shí)存放在外存(覆蓋文件)中小槐,在需要時(shí)才裝入內(nèi)存拇派。不存在調(diào)用關(guān)系的模塊不必同時(shí)裝入到內(nèi)存,從而可以相互覆蓋凿跳。

交換技術(shù)主要是在不同進(jìn)程(或作業(yè))之間進(jìn)行件豌,而覆蓋則用于同一個(gè)程序或進(jìn)程中。由于覆蓋技術(shù)要求給出程序段之間的覆蓋結(jié)構(gòu)控嗜,使得其對(duì)用戶和程序員不透明茧彤,所以對(duì)于主存無(wú)法存放用戶程序的矛盾,現(xiàn)代操作系統(tǒng)是通過(guò)虛擬內(nèi)存技術(shù)來(lái)解決的疆栏,覆蓋技術(shù)則已成為歷史曾掂;而交換技術(shù)在現(xiàn)代操作系統(tǒng)中仍具有較強(qiáng)的生命力惫谤。

分頁(yè)存儲(chǔ)管理

非連續(xù)分配允許一個(gè)程序分散地裝入到不相鄰的內(nèi)存分區(qū)中,根據(jù)分區(qū)的大小是否固定分為分頁(yè)存儲(chǔ)管理方式和分段存儲(chǔ)管理方式珠洗。

原理

  • 將用戶進(jìn)程地址空間(進(jìn)程的虛擬空間)劃分為大小相等的部分溜歪,稱為“頁(yè)”或“頁(yè)面”。
  • 將內(nèi)存空間按同樣的大小劃分為大小相等的部分许蓖,稱為“頁(yè)框”或“物理頁(yè)”蝴猪。
  • 然后把頁(yè)式虛擬地址與內(nèi)存地址建立一一對(duì)應(yīng)的頁(yè)表,并用相應(yīng)的硬件地址轉(zhuǎn)換機(jī)構(gòu)來(lái)解決離散地址變換問(wèn)題膊爪。
  • 內(nèi)存分配規(guī)則:以頁(yè)為單位進(jìn)行分配自阱,并按進(jìn)程需要的頁(yè)數(shù)來(lái)分配。邏輯上相鄰的頁(yè)物理上不一定相鄰米酬。
  • 頁(yè)式管理采用請(qǐng)求調(diào)頁(yè)預(yù)調(diào)頁(yè)技術(shù)來(lái)實(shí)現(xiàn)內(nèi)外存存儲(chǔ)器的統(tǒng)一管理沛豌。

把主存空間劃分為大小相等且固定的塊,塊相對(duì)較小赃额,作為主存的基本單位加派。每個(gè)進(jìn)程也以塊為單位進(jìn)行劃分,進(jìn)程在執(zhí)行時(shí)爬早,以塊為單位逐個(gè)申請(qǐng)主存中的塊空間哼丈。

因?yàn)槌绦驍?shù)據(jù)存儲(chǔ)在不同的頁(yè)面中启妹,而頁(yè)面又離散的分布在內(nèi)存中筛严,因此需要一個(gè)頁(yè)表來(lái)記錄邏輯地址和實(shí)際存儲(chǔ)地址之間的映射關(guān)系,以實(shí)現(xiàn)從頁(yè)號(hào)到物理塊號(hào)的映射饶米。

由于頁(yè)表也是存儲(chǔ)在內(nèi)存中的桨啃,因此和不適用分頁(yè)管理的存儲(chǔ)方式相比,訪問(wèn)分頁(yè)系統(tǒng)中內(nèi)存數(shù)據(jù)需要兩次的內(nèi)存訪問(wèn) (一次是從內(nèi)存中訪問(wèn)頁(yè)表檬输,從中找到指定的物理塊號(hào)照瘾,加上頁(yè)內(nèi)偏移得到實(shí)際物理地址;第二次就是根據(jù)第一次得到的物理地址訪問(wèn)內(nèi)存取出數(shù)據(jù))丧慈。

為了減少兩次訪問(wèn)內(nèi)存導(dǎo)致的效率影響析命,分頁(yè)管理中引入了快表機(jī)制,包含快表機(jī)制的內(nèi)存管理中逃默,當(dāng)要訪問(wèn)內(nèi)存數(shù)據(jù)的時(shí)候鹃愤,首先將頁(yè)號(hào)在快表中查詢,如果查找到說(shuō)明要訪問(wèn)的頁(yè)表項(xiàng)在快表中完域,那么直接從快表中讀取相應(yīng)的物理塊號(hào)软吐;如果沒(méi)有找到,那么訪問(wèn)內(nèi)存中的頁(yè)表吟税,從頁(yè)表中得到物理地址凹耙,同時(shí)將頁(yè)表中的該映射表項(xiàng)添加到快表中 (可能存在快表?yè)Q出算法)姿现。

在某些計(jì)算機(jī)中如果內(nèi)存的邏輯地址很大,將會(huì)導(dǎo)致程序的頁(yè)表項(xiàng)會(huì)很多肖抱,而頁(yè)表在內(nèi)存中是連續(xù)存放的备典,所以相應(yīng)的就需要較大的連續(xù)內(nèi)存空間。為了解決這個(gè)問(wèn)題意述,可以采用兩級(jí)頁(yè)表或者多級(jí)頁(yè)表的方法熊经,其中外層頁(yè)表一次性調(diào)入內(nèi)存且連續(xù)存放,內(nèi)層頁(yè)表離散存放欲险。相應(yīng)的訪問(wèn)內(nèi)存頁(yè)表的時(shí)候需要一次地址變換镐依,訪問(wèn)邏輯地址對(duì)應(yīng)的物理地址的時(shí)候也需要一次地址變換,而且一共需要訪問(wèn)內(nèi)存 3 次才可以讀取一次數(shù)據(jù)天试。

快表

什么是快表槐壳?它在地址轉(zhuǎn)換中起什么作用?
快表是一個(gè)高速喜每、具有并行查詢能力的聯(lián)想存儲(chǔ)器务唐,用于存放正運(yùn)行的進(jìn)程的當(dāng)前頁(yè)號(hào)和塊號(hào),或者段號(hào)和段起始地址带兜。
加入快表后,在地址轉(zhuǎn)換時(shí)枫笛,首先在快表中查找,若找到就直接進(jìn)行地址轉(zhuǎn)換刚照;未找到刑巧,則在主存頁(yè)表繼續(xù)查找,并把查到的頁(yè)號(hào)和塊號(hào)放入聯(lián)想存儲(chǔ)器中无畔“〕快表的命中率很高,有效地提高了地址轉(zhuǎn)換的速度浑彰。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):沒(méi)有外碎片恭理,每個(gè)內(nèi)碎片不超過(guò)頁(yè)的大小。
缺點(diǎn):程序的最后一頁(yè)會(huì)有浪費(fèi)空間的現(xiàn)象郭变,不能應(yīng)用在分段編寫(xiě)的颜价、非連續(xù)存放的大型程序中。
程序全部裝入內(nèi)存诉濒,要求有相應(yīng)的硬件支持周伦,如地址變換機(jī)構(gòu)缺頁(yè)中斷的產(chǎn)生和選擇淘汰頁(yè)面等都要求有相應(yīng)的硬件支持幕垦。增加了機(jī)器成本和系統(tǒng)開(kāi)銷(xiāo)幢泼。

分段存儲(chǔ)管理

原理

一個(gè)用戶作業(yè)或者進(jìn)程所包含的段對(duì)應(yīng)一個(gè)二維線性虛擬空間,也就是一個(gè)二維虛擬存儲(chǔ)器竹习。

  • 用戶進(jìn)程地址空間:按程序自身的邏輯關(guān)系劃分為若干個(gè)程序段,每個(gè)程序段都有一個(gè)段名狈蚤。
  • 內(nèi)存空間:被動(dòng)態(tài)劃分為若干個(gè)長(zhǎng)度不相同的區(qū)域困肩,稱為“物理段”,每個(gè)物理段由起始地址和長(zhǎng)度確定脆侮。
  • 內(nèi)存分配規(guī)則:以段為單位進(jìn)行分配锌畸,每段在內(nèi)存中占據(jù)連續(xù)空間,但各段之間可以不相鄰靖避。然后通過(guò)地址映射機(jī)構(gòu)把段式虛擬地址轉(zhuǎn)換為實(shí)際內(nèi)存物理地址潭枣。

分頁(yè)是為了提高內(nèi)存利用率,而分段是為了滿足程序員在編寫(xiě)代碼的時(shí)候的一些邏輯需求(比如數(shù)據(jù)共享幻捏,數(shù)據(jù)保護(hù)盆犁,動(dòng)態(tài)鏈接等)。

分段內(nèi)存管理當(dāng)中篡九,地址是二維的谐岁,一維是段號(hào),一維是段內(nèi)地址榛臼;其中每個(gè)段的長(zhǎng)度是不一樣的伊佃,而且每個(gè)段內(nèi)部都是從 0 開(kāi)始編址的。由于分段管理中沛善,每個(gè)段內(nèi)部是連續(xù)內(nèi)存分配航揉,但是段和段之間是離散分配的,因此也存在一個(gè)邏輯地址到物理地址的映射關(guān)系金刁,相應(yīng)的就是段表機(jī)制帅涂。段表中的每一個(gè)表項(xiàng)記錄了該段在內(nèi)存中的起始地址和該段的長(zhǎng)度。段表可以放在內(nèi)存中也可以放在寄存器中胀葱。

訪問(wèn)內(nèi)存的時(shí)候根據(jù)段號(hào)和段表項(xiàng)的長(zhǎng)度計(jì)算當(dāng)前訪問(wèn)段在段表中的位置漠秋,然后訪問(wèn)段表,得到該段的物理地址抵屿,根據(jù)該物理地址以及段內(nèi)偏移量就可以得到需要訪問(wèn)的內(nèi)存。由于也是兩次內(nèi)存訪問(wèn)捅位,所以分段管理中同樣引入了聯(lián)想寄存器轧葛。

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):可以分別編寫(xiě)和編譯,可以針對(duì)不同類(lèi)型的段采取不同的保護(hù)艇搀,可以按段為單位來(lái)進(jìn)行共享尿扯,包括通過(guò)動(dòng)態(tài)鏈接進(jìn)行代碼共享。
缺點(diǎn):會(huì)產(chǎn)生碎片焰雕。

分段分頁(yè)方式的比較

頁(yè)是信息的物理單位衷笋,是出于系統(tǒng)內(nèi)存利用率的角度提出的離散分配機(jī)制;段是信息的邏輯單位矩屁,每個(gè)段含有一組意義完整的信息辟宗,是出于用戶角度提出的內(nèi)存管理機(jī)制爵赵。

頁(yè)的大小是固定的,由系統(tǒng)決定泊脐;段的大小是不確定的空幻,由用戶決定。

段頁(yè)式存儲(chǔ)管理

原理

系統(tǒng)必須為每個(gè)作業(yè)或者進(jìn)程建立一張段表以管理內(nèi)存分配與釋放容客、缺段處理等秕铛。另外由于一個(gè)段又被劃分為若干個(gè)頁(yè),每個(gè)段必須建立一張頁(yè)表以把段中的虛頁(yè)變換為內(nèi)存中的實(shí)際頁(yè)面缩挑。顯然與頁(yè)式管理時(shí)相同但两,頁(yè)表也要有相應(yīng)的實(shí)現(xiàn)缺頁(yè)中斷處理和頁(yè)面保護(hù)等功能的表項(xiàng)。

優(yōu)缺點(diǎn)

段頁(yè)式管理是段式管理和頁(yè)式管理相結(jié)合而成供置,具有兩者的優(yōu)點(diǎn)镜遣。

由于管理軟件的增加,復(fù)雜性和開(kāi)銷(xiāo)也增加士袄。另外需要的硬件以及占用的內(nèi)存也有所增加悲关,使得執(zhí)行速度下降。

在分頁(yè)娄柳、分段和段頁(yè)式存儲(chǔ)管理中寓辱,當(dāng)訪問(wèn)一條指令時(shí),需要訪問(wèn)內(nèi)存幾次各做什么操作赤拒?

在分頁(yè)和分段系統(tǒng)中秫筏,首先需要訪問(wèn)頁(yè)表或段表,然后才能訪問(wèn)實(shí)際數(shù)據(jù)挎挖,因此需要至少訪問(wèn)內(nèi)存 2 次这敬。
在段頁(yè)式存儲(chǔ)管理中,首先要訪問(wèn)段表蕉朵,最后訪問(wèn)相關(guān)段的頁(yè)表崔涂,最后才能訪問(wèn)實(shí)際數(shù)據(jù),因此一共需訪問(wèn)內(nèi)存至少 3 次始衅。
如果采用的是多級(jí)頁(yè)表冷蚂,則訪問(wèn)次數(shù)還將增加。如果使用快表汛闸,且在快表中命中蝙茶,則只需要訪問(wèn)內(nèi)存 1 次。

在固定分區(qū)管理诸老、動(dòng)態(tài)分區(qū)管理隆夯、分頁(yè)存儲(chǔ)管理、分段存儲(chǔ)管理中,各會(huì)產(chǎn)生何種碎片蹄衷?

答:在固定分區(qū)管理中忧额,每個(gè)分區(qū)內(nèi)都可能存在碎片;

在動(dòng)態(tài)分區(qū)管理中宦芦,會(huì)存在一些很小的宙址,不足以任何應(yīng)用程序使用的小碎片; 在分頁(yè)存儲(chǔ)管理中调卑,每個(gè)應(yīng)用程序的最后一頁(yè)可能存在碎片抡砂。

在分段存儲(chǔ)管理中,可能存在小的內(nèi)存區(qū)恬涧,不足以存放應(yīng)用程序的一個(gè)連續(xù)的段注益,形成碎片。

在內(nèi)存管理中溯捆,“內(nèi)零頭” 和 “外零頭” 個(gè)指的是什么丑搔?在固定式分區(qū)分配、可變式分區(qū)分配提揍、頁(yè)式虛擬存儲(chǔ)系統(tǒng)啤月、段式虛擬存儲(chǔ)系統(tǒng)中,各會(huì)存在何種零頭劳跃?為什么谎仲?
解答:
在存儲(chǔ)管理中,內(nèi)零頭是指分配給作業(yè)的存儲(chǔ)空間中未被利用的部分刨仑,外零頭是指系統(tǒng)中無(wú)法利用的小存儲(chǔ)塊郑诺。

在固定式分區(qū)分配中,為將一個(gè)用戶作業(yè)裝入內(nèi)存杉武,內(nèi)存分配程序從系統(tǒng)分區(qū)表中找出一個(gè)能滿足作業(yè)要求的空閑分區(qū)分配給作業(yè)辙诞,由于一個(gè)作業(yè)的大小并不一定與分區(qū)大小相等,因此轻抱,分區(qū)中有一部分存儲(chǔ)空間浪費(fèi)掉了飞涂。由此可知,固定式分區(qū)分配中存在內(nèi)零頭十拣。

在可變式分區(qū)分配中封拧,為把一個(gè)作業(yè)裝入內(nèi)存,應(yīng)按照一定的分配算法從系統(tǒng)中找出一個(gè)能滿足作業(yè)需求的空閑分區(qū)分配給作業(yè)夭问,如果這個(gè)空閑分區(qū)的容量比作業(yè)申請(qǐng)的空間容量要大,則將該分區(qū)一分為二曹铃,一部分分配給作業(yè)缰趋,剩下的部分仍然留作系統(tǒng)的空閑分區(qū)。由此可知,可變式分區(qū)分配中存在外零頭秘血。

在頁(yè)式虛擬存儲(chǔ)系統(tǒng)中味抖,用戶作業(yè)的地址空間被劃分成若干大小相等的頁(yè)面,存儲(chǔ)空間也分成也頁(yè)大小相等的物理塊灰粮,但一般情況下仔涩,作業(yè)的大小不可能都是物理塊大小的整數(shù)倍,因此作業(yè)的最后一頁(yè)中仍有部分空間被浪費(fèi)掉了粘舟。由此可知熔脂,頁(yè)式虛擬存儲(chǔ)系統(tǒng)中存在內(nèi)零頭。在段式虛擬存儲(chǔ)系統(tǒng)中柑肴,作業(yè)的地址空間由若干個(gè)邏輯分段組成霞揉,每段分配一個(gè)連續(xù)的內(nèi)存區(qū),但各段之間不要求連續(xù)晰骑,其內(nèi)存的分配方式類(lèi)似于動(dòng)態(tài)分區(qū)分配适秩。

由此可知,段式虛擬存儲(chǔ)系統(tǒng)中存在外零頭硕舆。

基本內(nèi)存管理方案小結(jié)

虛擬存儲(chǔ)管理

局部性原理

程序的局部性原理:指程序在執(zhí)行過(guò)程中的一個(gè)較短時(shí)期秽荞,所執(zhí)行的指令地址和指令的操作數(shù)地址,分別局限于一定區(qū)域抚官。這可以表現(xiàn)為:

  • 時(shí)間局部性:一條指令的一次執(zhí)行和下次執(zhí)行扬跋,一個(gè)數(shù)據(jù)的一次訪問(wèn)和下次訪問(wèn)都集中在一個(gè)較短時(shí)期內(nèi)。即如果程序中的某條指令一旦執(zhí)行耗式,不久以后該指令可能再次執(zhí)行胁住;如果某數(shù)據(jù)被訪問(wèn)過(guò),不久以后該數(shù)據(jù)可能再次被訪問(wèn)刊咳。產(chǎn)生時(shí)間局部性的典型原因彪见,是由于在程序中存在著大量的循環(huán)操作。
  • 空間局部性:當(dāng)前指令和鄰近的幾條指令娱挨,當(dāng)前訪問(wèn)的數(shù)據(jù)和鄰近的幾個(gè)數(shù)據(jù)都集中在一個(gè)較小區(qū)域內(nèi)余指。即一旦程序訪問(wèn)了某個(gè)存儲(chǔ)單元,在不久之后跷坝,其附近的存儲(chǔ)單元也將被訪問(wèn)酵镜,即程序在一段時(shí)間內(nèi)所訪問(wèn)的地址,可能集中在一定的范圍之內(nèi)柴钻,這是因?yàn)橹噶钔ǔJ琼樞虼娣呕淳隆㈨樞驁?zhí)行的,數(shù)據(jù)也一般是以向量贴届、數(shù)組靠粪、表等形式簇聚存儲(chǔ)的蜡吧。

時(shí)間局部性是通過(guò)將近來(lái)使用的指令和數(shù)據(jù)保存到高速緩存存儲(chǔ)器中,并使用高速緩存的層次結(jié)構(gòu)實(shí)現(xiàn)占键。
空間局部性通常是使用較大的高速緩存昔善,并將預(yù)取機(jī)制集成到高速緩存控制邏輯中實(shí)現(xiàn)。

虛擬內(nèi)存技術(shù)實(shí)際上就是建立了 “內(nèi)存一外存” 的兩級(jí)存儲(chǔ)器的結(jié)構(gòu)畔乙,利用局部性原理實(shí)現(xiàn)髙速緩存君仆。

虛擬存儲(chǔ)器的概念及特點(diǎn)

虛擬存儲(chǔ)器是一種存儲(chǔ)管理技術(shù),用以完成用小的內(nèi)存實(shí)現(xiàn)在大的虛空間中程序的運(yùn)行工作牲距。它是由操作系統(tǒng)提供的一個(gè)假想的特大存儲(chǔ)器返咱。但是虛擬存儲(chǔ)器的容量并不是無(wú)限的,它由計(jì)算機(jī)的地址結(jié)構(gòu)長(zhǎng)度所確定嗅虏,另外虛存容量的擴(kuò)大是以犧牲CPU工作時(shí)間以及內(nèi)洛姑、外存交換時(shí)間為代價(jià)的。

虛存技術(shù)的特征

  • 大的用戶空間:通過(guò)把物理內(nèi)存與外存相結(jié)合皮服,提供給用戶的虛擬內(nèi)存空間通常大于實(shí)際的物理內(nèi)存楞艾,即實(shí)現(xiàn)了這兩者的分離。
  • 虛擬擴(kuò)充:即不是物理上而是邏輯上擴(kuò)充了內(nèi)存容量龄广。
  • 部分裝入:即每個(gè)作業(yè)不是全部一次性地裝入內(nèi)存硫眯,而是只裝入一部分。
  • 離散分配(不連續(xù)性):即不必占用連續(xù)的內(nèi)存空間择同,而是“見(jiàn)縫插針”两入。
  • 多次對(duì)換:即所需的全部程序和數(shù)據(jù)要分成多次調(diào)入內(nèi)存。

虛擬存儲(chǔ)器的容量主要受到指令中表示地址的字長(zhǎng)和外存的容量的限制敲才。

虛存技術(shù)的目標(biāo)

  • 像覆蓋技術(shù)那樣裹纳,不是把程序的所有內(nèi)容都放在內(nèi)存中(部分裝入),因而能夠運(yùn)行比當(dāng)前的空閑內(nèi)存空間還要大的程序紧武。但做得更好剃氧,由操作系統(tǒng)自動(dòng)完成而無(wú)須程序員的干涉。
  • 像交換技術(shù)那樣阻星,能夠實(shí)現(xiàn)進(jìn)程在內(nèi)存與外存之間的交換朋鞍,因而獲得更多的空閑內(nèi)存空間。但做得更好妥箕,只對(duì)進(jìn)程的部分內(nèi)容進(jìn)行交換滥酥。(交換技術(shù)的粒度是以一個(gè)程序?yàn)閱挝唬摯嬉愿〉牧6葘?shí)現(xiàn))

虛存技術(shù)的實(shí)現(xiàn)

在頁(yè)式或段式內(nèi)存管理的基礎(chǔ)上實(shí)現(xiàn)畦幢。

  • 在裝入程序時(shí)坎吻,不必將其全部裝入到內(nèi)存,則只需將當(dāng)前需要執(zhí)行的部分頁(yè)面或段裝入到內(nèi)存宇葱,就可以讓程序開(kāi)始執(zhí)行禾怠;
  • 在程序執(zhí)行過(guò)程中返奉,如果需執(zhí)行的指令或訪問(wèn)的數(shù)據(jù)尚未在內(nèi)存(稱為缺頁(yè)或缺段)贝搁,則由處理器通知操作系統(tǒng)將相應(yīng)的頁(yè)面或段調(diào)入到內(nèi)存吗氏,然后繼續(xù)執(zhí)行程序;
  • 另一方面雷逆,操作系統(tǒng)將內(nèi)存中暫時(shí)不使用的頁(yè)面或段調(diào)出保存在外存上弦讽,從而騰出更多空閑空間存放將要裝入的程序以及將要調(diào)入的頁(yè)面或段。
虛擬頁(yè)式內(nèi)存管理

在頁(yè)式存儲(chǔ)管理的基礎(chǔ)上膀哲,增加請(qǐng)求調(diào)頁(yè)和頁(yè)面置換功能往产。

主存空間信息保護(hù)

  1. 程序執(zhí)行時(shí)訪問(wèn)屬于自己主存區(qū)域的信息,允許它既可讀某宪,又可寫(xiě)仿村;
  2. 對(duì)共享區(qū)域中的信息只可讀,不可修改兴喂;
  3. 對(duì)非共享區(qū)域或非自己的主存區(qū)域中的信息既不可讀蔼囊,也不可寫(xiě)。

設(shè)備管理

設(shè)備管理的功能

  • 管理所有外圍設(shè)備衣迷,包括完成用戶的 IO 請(qǐng)求
  • 為用戶進(jìn)程分配 IO 設(shè)備
  • 提高 IO 設(shè)備利用率
  • 提高 IO 速度
  • 方便 IO 的使用

I/O硬件原理

I/O設(shè)備的分類(lèi)

  • 獨(dú)占設(shè)備:在一段時(shí)間內(nèi)只能有一個(gè)進(jìn)程使用的設(shè)備畏鼓,一般為低速I(mǎi)/O設(shè)備(如打印機(jī),磁帶等)
  • 共享設(shè)備:在一段時(shí)間內(nèi)可由多個(gè)進(jìn)程共同使用的設(shè)備壶谒,多個(gè)進(jìn)程以交叉的方式來(lái)使用設(shè)備云矫,其資源利用率高(如硬盤(pán))
  • 虛擬設(shè)備:在一類(lèi)設(shè)備上模擬另一類(lèi)設(shè)備,常用共享設(shè)備模擬獨(dú)占設(shè)備汗菜,用高速設(shè)備模擬低速設(shè)備让禀,被模擬的設(shè)備稱為虛設(shè)備。其目的就是將慢速的獨(dú)占設(shè)備改造成多個(gè)用戶可共享的設(shè)備陨界,提高設(shè)備的利用率巡揍。如SPOOLing技術(shù),利用虛設(shè)備技術(shù)(用硬盤(pán)模擬輸入輸出設(shè)備)

設(shè)備管理的主要功能

在現(xiàn)代的操作系統(tǒng)中普碎,設(shè)備管理的任務(wù)主要有以下幾個(gè)方面吼肥。

  • 根據(jù)用戶提出的要求對(duì) I/O 設(shè)備進(jìn)行控制,完成用戶提出的輸入 / 輸出要求麻车。
  • 由于現(xiàn)代的操作系統(tǒng)允許多個(gè)進(jìn)程的并發(fā)執(zhí)行缀皱,為了有效地分配設(shè)備資源,要求設(shè)備管理能夠根據(jù)設(shè)備請(qǐng)求的情況动猬,按照一定的算法實(shí)現(xiàn)對(duì)某個(gè) I/O 設(shè)備進(jìn)行合理分配啤斗。
  • 當(dāng)計(jì)算機(jī)系統(tǒng)屮有種類(lèi)繁多的 I/O 設(shè)備時(shí),要求設(shè)備管理能夠充分而有效地使用這些設(shè)備赁咙,盡可能提高它們與 CPU 的并行操作程度钮莲。

針對(duì)上述的任務(wù)需求免钻,設(shè)備管理應(yīng)具有以下功能:

  • 緩沖管理:CPU 與設(shè)備之間、設(shè)備與設(shè)備之間交換信息時(shí)崔拥,需要利用緩沖區(qū)來(lái)緩解速度不匹配的矛盾极舔,提高 CPU 與設(shè)備之間、設(shè)備與設(shè)備之間操作的并行程度链瓦。
  • 設(shè)備分配:系統(tǒng)根據(jù)進(jìn)程所請(qǐng)求的設(shè)備拆魏,按分配算法對(duì)設(shè)備和設(shè)備相應(yīng)的控制器和通道進(jìn)行分配,建立從設(shè)備到內(nèi)存之間傳輸信息的通路慈俯。在進(jìn)程的 I/O 完成后渤刃,系統(tǒng)應(yīng)及時(shí)回收設(shè)備,以便重新分配給其他進(jìn)程使用贴膘。將未獲得所需設(shè)備的進(jìn)程放進(jìn)相應(yīng)設(shè)備的等待隊(duì)列中卖子。
  • 設(shè)備驅(qū)動(dòng):邏輯設(shè)備名轉(zhuǎn)換成設(shè)備的物理地址,啟動(dòng)指定的 I/O 設(shè)備刑峡,完成程序規(guī)定的 I/O 操作洋闽,并對(duì)由設(shè)備發(fā)來(lái)的中斷請(qǐng)求進(jìn)行及時(shí)響應(yīng),根據(jù)中斷類(lèi)型進(jìn)行相應(yīng)的處理氛琢。
  • 設(shè)備無(wú)關(guān)性: 用戶在編制程序時(shí)喊递,不直接使用實(shí)際的設(shè)備名而使用邏輯設(shè)備名。有利于解決設(shè)備的故障和增加設(shè)備分配的靈活性阳似。
  • 虛擬設(shè)備:一次僅允許一個(gè)進(jìn)程使用的設(shè)備稱為獨(dú)占設(shè)備骚勘。獨(dú)占設(shè)備不僅降低了系統(tǒng)的設(shè)備利用率,而且可能產(chǎn)生死鎖撮奏。虛擬設(shè)備能被多個(gè)進(jìn)程共享俏讹,提高了設(shè)備的利用率,并且防止了死鎖畜吊。關(guān)于虛擬設(shè)備的實(shí)現(xiàn)以后章節(jié)將詳細(xì)討論泽疆。

I/O控制方式

設(shè)備管理的主要任務(wù)之一是控制設(shè)備和內(nèi)存或者處理機(jī)之間的數(shù)據(jù)傳送。

  • 輪詢方式
  • 中斷方式
  • DMA方式
  • 通道方式

輪詢方式

CPU 需要時(shí)刻對(duì)外設(shè)設(shè)備狀態(tài)進(jìn)行循環(huán)檢查玲献,直到確定該字已經(jīng)在 I/O 控制器的數(shù)據(jù)寄存器中殉疼。CPU 和設(shè)備只能串行工作,CPU 效率相當(dāng)?shù)汀?/p>

中斷方式

允許 I/O 設(shè)備主動(dòng)打斷 CPU 的運(yùn)行并且請(qǐng)求服務(wù)捌年,使得其向 I/O 控制器發(fā)送讀命令瓢娜。

DMA方式

直接存儲(chǔ)讀取在 I/O 設(shè)備和內(nèi)存之間加上 DMA 控制器使得數(shù)據(jù)進(jìn)行直接傳輸而不經(jīng)過(guò) CPU。

通道方式

I/O 通道是指專門(mén)負(fù)責(zé)輸入 / 輸出的處理機(jī)礼预,因此屬于硬件技術(shù)眠砾。
CPU 要完成一組相關(guān)的讀寫(xiě)操作以及有關(guān)控制時(shí)候,向 I/O 通道發(fā)送一條 I/O 指令托酸,給出所要執(zhí)行的通道程序的首地址和要訪問(wèn)的 I/O 設(shè)備褒颈,通道接受指令后柒巫,執(zhí)行通道程序完成 CPU 指定的 I/O 任務(wù),數(shù)據(jù)傳送結(jié)束時(shí)向 CPU 發(fā)送中斷請(qǐng)求谷丸。
通道方式由通道控制傳輸?shù)臄?shù)據(jù)塊大小以及傳輸?shù)膬?nèi)存位置堡掏,一個(gè)通道可以控制多臺(tái)設(shè)備與內(nèi)存的數(shù)據(jù)交換。

I/O軟件原理

設(shè)備獨(dú)立性

設(shè)備獨(dú)立性即應(yīng)用程序獨(dú)立于使用的物理設(shè)備淤井,在應(yīng)用程序中使用邏輯設(shè)備名稱來(lái)請(qǐng)求使用某類(lèi)設(shè)備布疼。系統(tǒng)在執(zhí)行時(shí),是使用物理設(shè)備名稱币狠。

要實(shí)現(xiàn)設(shè)備獨(dú)立性必須由設(shè)備獨(dú)立性軟件完成,包括執(zhí)行所有設(shè)備的公有操作軟件提供統(tǒng)一的接口砾层,其中邏輯設(shè)備到物理設(shè)備的映射是由邏輯設(shè)備表LUT完成的漩绵。

I/O軟件的分層結(jié)構(gòu)

共有5層,從底到高依次是硬件->中斷處理程序->設(shè)備驅(qū)動(dòng)程序->設(shè)備獨(dú)立性軟件->用戶層I/O軟件肛炮。

  • 中斷處理程序:用于保存被中斷進(jìn)程的CPU環(huán)境止吐,轉(zhuǎn)入相應(yīng)的中斷處理程序進(jìn)行處理,處理完后恢復(fù)現(xiàn)場(chǎng)侨糟,并返回到被中斷的進(jìn)程
  • 設(shè)備驅(qū)動(dòng)程序:與硬件直接有關(guān)碍扔,用來(lái)具體實(shí)現(xiàn)系統(tǒng)對(duì)設(shè)備發(fā)出的操作指令,驅(qū)動(dòng)I/O設(shè)備工作
  • 設(shè)備獨(dú)立性軟件/獨(dú)立于設(shè)備的I/O軟件:用于實(shí)現(xiàn)用戶程序與設(shè)備驅(qū)動(dòng)器的統(tǒng)一接口秕重、設(shè)備命令不同、設(shè)備保護(hù),以及設(shè)備分配與釋放等溶耘。
  • 最高層:用于實(shí)現(xiàn)用戶與I/O設(shè)備交互

I/O軟件的主要功能

通常將 I/O 軟件組織成四個(gè)層次:用戶應(yīng)用層軟件二拐、中斷處理程序、獨(dú)立于設(shè)備的軟件和設(shè)備驅(qū)動(dòng)程序凳兵。
I/O 軟件包括 I/O 設(shè)備驅(qū)動(dòng)軟件和設(shè)備無(wú)關(guān)軟件百新。設(shè)計(jì) I/O 軟件的一個(gè)最關(guān)鍵的目標(biāo)是設(shè)備無(wú)關(guān)性,I/O 設(shè)備管理軟件采用分層構(gòu)造庐扫,每一層的軟件都有自己獨(dú)立的功能饭望,最低層軟件與硬件的細(xì)節(jié)密切相關(guān),并對(duì)高層軟件隱藏了硬件的具體特性形庭,I/O 軟件除了直接與設(shè)備打交道的低層軟件之外铅辞,其他部分的軟件并不依賴于硬件。

I/O軟件的處理過(guò)程

采用分層思想碘勉,當(dāng)用戶進(jìn)程提出 I/O 請(qǐng)求訪問(wèn)硬件時(shí)巷挥,需要按:進(jìn)程請(qǐng)求 I/O→獨(dú)立于設(shè)備的軟件→設(shè)備驅(qū)動(dòng)程序→中斷處理程序→硬件的層次結(jié)構(gòu)進(jìn)行。

緩沖技術(shù)

緩沖引入的原因

  • 緩和CPU與I/O設(shè)備間速度不匹配的矛盾
  • 減少對(duì)CPU的中斷頻率验靡,放寬對(duì)CPU中斷響應(yīng)時(shí)間的限制
  • 提高CPU和I/O設(shè)備之間的并行性
  • 解決數(shù)據(jù)粒度不匹配的問(wèn)題

緩沖的實(shí)現(xiàn)方式

軟緩沖的種類(lèi)

系統(tǒng)調(diào)用的處理步驟

首先倍宾,將處理機(jī)狀態(tài)由用戶態(tài)轉(zhuǎn)為系統(tǒng)態(tài)雏节;之后由硬件和內(nèi)核程序進(jìn)行系統(tǒng)調(diào)用的一般處理;然后將用戶定義的參數(shù)傳送到指定的地址并保存起來(lái)高职。
其次钩乍,分析系統(tǒng)調(diào)用類(lèi)型,轉(zhuǎn)入相應(yīng)的系統(tǒng)調(diào)用處理子程序怔锌。
最后寥粹,恢復(fù)被中斷的或設(shè)置新進(jìn)程的CPU現(xiàn)場(chǎng),然后返回被中斷進(jìn)程或新進(jìn)程埃元,繼續(xù)往下執(zhí)行涝涤。

驅(qū)動(dòng)調(diào)度技術(shù)

設(shè)備驅(qū)動(dòng)程序的功能、特點(diǎn)

磁盤(pán)訪問(wèn)時(shí)間包括什么岛杀?

磁盤(pán)訪問(wèn)時(shí)間由:尋道時(shí)間阔拳、旋轉(zhuǎn)延遲時(shí)間和數(shù)據(jù)傳輸時(shí)間三部分構(gòu)成。

磁盤(pán)調(diào)度算法

計(jì)算平均尋道長(zhǎng)度

設(shè)備分配

設(shè)備獨(dú)立性

設(shè)備分配考慮的因素

設(shè)備分配技術(shù)

虛擬設(shè)備

Spooling技術(shù)的組成类嗤、特點(diǎn)糊肠、舉例

概念

SPOOLing技術(shù)又稱假脫機(jī)技術(shù),是一種虛擬設(shè)備技術(shù)遗锣,它可以把一臺(tái)獨(dú)占設(shè)備改造成為虛擬設(shè)備货裹,在進(jìn)程所需的物理設(shè)備不存在或被占用的情況下,使用該設(shè)備精偿。SPOOLING技術(shù)是對(duì)脫機(jī)輸入弧圆,輸出系統(tǒng)的模擬,又稱為假脫機(jī)操作还最。它是一種用空間換取時(shí)間的資源轉(zhuǎn)換技術(shù)墓阀。

組成

image

SPOOLINGing 系統(tǒng)主要由三部分組成:輸入井和輸出井、輸入緩沖區(qū)和輸出緩沖區(qū)拓轻、輸入進(jìn)程和輸出進(jìn)程斯撮。

  1. 輸入井和輸出井: 輸入井和輸出井的存儲(chǔ)區(qū)域是在磁盤(pán)上開(kāi)辟出來(lái)的。輸入輸出井中的數(shù)據(jù)一般以文件的形式組織管理扶叉,這些文件稱之為井文件勿锅。一個(gè)文件僅存放某一個(gè)進(jìn)程的輸入或輸出數(shù)據(jù),所有進(jìn)程的數(shù)據(jù)輸入或輸出文件鏈接成為一個(gè)輸入輸出隊(duì)列枣氧。
  2. 輸入緩沖區(qū)和輸出緩沖區(qū): 輸入緩沖區(qū)和輸出緩沖區(qū)的存儲(chǔ)區(qū)域是在內(nèi)存中開(kāi)辟出來(lái)的溢十。主要用于緩和 CPU 和磁盤(pán)之間速度不匹配的矛盾。輸入緩沖區(qū)用于暫存有輸入設(shè)備傳送的數(shù)據(jù)达吞,之后再傳送到輸入井张弛;輸出緩沖區(qū) 同理。
  3. 輸入進(jìn)程和輸出進(jìn)程: 輸入進(jìn)程也稱為預(yù)輸入進(jìn)程,用于模擬脫機(jī)輸入時(shí)的外圍控制機(jī)吞鸭,將用戶要求的數(shù)據(jù)從輸入設(shè)備傳送到輸入緩沖區(qū)寺董,再存放到輸入井。當(dāng) CPU 需要的時(shí)候刻剥,直接從輸入井將數(shù)據(jù)讀入內(nèi)存遮咖。反之,輸出的同理造虏。
  4. 井管理程序: 用于控制作業(yè)與磁盤(pán)井之間信息的交換御吞。

原理

image

在多道系統(tǒng)中,對(duì)于每一個(gè)獨(dú)占的設(shè)備漓藕,專門(mén)利用一道程序陶珠,即 SPOOLing 程序,來(lái)完成對(duì)這個(gè)設(shè)備的輸入輸出操作撵术。

一方面背率,SPOOLing 程序負(fù)責(zé)與這個(gè)獨(dú)占的 I/O 設(shè)備進(jìn)行數(shù)據(jù)交換,這可以成為 “實(shí)際的 I/O”嫩与。如果這是一個(gè)輸入設(shè)備,那么 SPOOLing 程序預(yù)先從該設(shè)備輸入數(shù)據(jù)并加以緩沖交排,然后在需要時(shí)再交給應(yīng)用程序划滋。如果這是一個(gè)輸出設(shè)備毒返,那么 SPOOLing 程序會(huì)接受應(yīng)用程序的輸出數(shù)據(jù)并加以緩沖错洁,然后在適當(dāng)?shù)臅r(shí)候再輸出到該設(shè)備彬呻。
另一方面刺彩,應(yīng)用程序在進(jìn)行 I/O 操作時(shí)爷耀,只是與 SPOOLing 程序交換數(shù)據(jù)介粘,這可以稱為 “虛擬的 I/O”锈至。

輸入值班進(jìn)程 SPi 模擬 SPOOLing 輸入時(shí)的外圍控制機(jī)的功能附井〔拷牛控制輸入設(shè)備經(jīng)輸入緩沖區(qū)把用戶的數(shù)據(jù)傳送到備用存儲(chǔ)器的輸入井中想邦,當(dāng)用戶進(jìn)程需要輸入數(shù)據(jù)時(shí),直接將輸入井中預(yù)存的輸入數(shù)據(jù)讀入內(nèi)存委刘,提供給用戶進(jìn)程使用丧没。
輸出值班進(jìn)程 SPo 模擬 SPOOLing 輸出時(shí)的外圍控制機(jī)的功能。把用戶進(jìn)程的輸出數(shù)據(jù)傳送到備用存儲(chǔ)器的輸出井中锡移,形成輸出請(qǐng)求隊(duì)列呕童。控制輸出井中的數(shù)據(jù)傳送到低速的輸出設(shè)備淆珊。

優(yōu)點(diǎn)

所有字符設(shè)備都是獨(dú)占設(shè)備并屬于慢速設(shè)備夺饲,因此,當(dāng)一個(gè)進(jìn)程在某臺(tái)字符設(shè)備上進(jìn)行數(shù)據(jù)交換時(shí),往往要等待較長(zhǎng)時(shí)間往声,并且在此進(jìn)程未釋放該設(shè)備之前擂找,其他進(jìn)程不能同時(shí)訪問(wèn)這臺(tái)設(shè)備,從而使這類(lèi)設(shè)備成為系統(tǒng)中的瓶頸資源烁挟,使許多進(jìn)程因等待它們而阻塞婴洼。另一方面,分配到字符設(shè)備的進(jìn)程撼嗓,在其整個(gè)運(yùn)行期間柬采,往往占有這些設(shè)備,卻并不是經(jīng)常使用這些設(shè)備且警,因而使這些設(shè)備的利用率很低粉捻。從而降低了整個(gè)系統(tǒng)的性能。 Spooling技術(shù)正是針對(duì)上述問(wèn)題提出的一種技術(shù)斑芜。

  • 提高I/O的速度:應(yīng)用程序的虛擬 I/O 比實(shí)際的 I/O 速度要快肩刃,因?yàn)樗皇窃趦蓚€(gè)進(jìn)程之前的一種通信,把數(shù)據(jù)從一個(gè)進(jìn)程交給另一個(gè)進(jìn)程杏头。這種數(shù)據(jù)交換是在內(nèi)存中進(jìn)行的盈包,而不是真正地讓機(jī)械的物理設(shè)備去運(yùn)作。這就縮短了應(yīng)用程序的執(zhí)行時(shí)間醇王。對(duì)數(shù)據(jù)執(zhí)行的 I/O 操作呢燥,已從對(duì)低速 I/O 設(shè)備執(zhí)行的 I/O 操作演變?yōu)閷?duì)磁盤(pán)緩沖區(qū)中數(shù)據(jù)的存取,如同脫機(jī)輸入輸出一樣寓娩,提高了 I/O 速度叛氨,緩和了 CPU 和低速的 I/Os 設(shè)備之間速度的不匹配的矛盾。
  • 實(shí)現(xiàn)對(duì)獨(dú)占設(shè)備的共享:由 SPOOLing 程序提供虛擬設(shè)備棘伴,然后各個(gè)用戶進(jìn)程就可以對(duì)這個(gè)獨(dú)占設(shè)備依次地共享使用寞埠。因?yàn)樵诩倜摍C(jī)打印機(jī)系統(tǒng)中,實(shí)際上并沒(méi)有為任何進(jìn)程分配設(shè)備焊夸,而只是在磁盤(pán)緩沖區(qū)中為進(jìn)程分配了一個(gè)空閑盤(pán)塊和建立了一張 I/O 請(qǐng)求表仁连。
  • 實(shí)現(xiàn)了虛擬設(shè)備功能: 宏觀上,對(duì)于每一個(gè)進(jìn)程而言淳地,它們認(rèn)為是自己獨(dú)占了一個(gè)設(shè)備怖糊,即使實(shí)際上是多個(gè)進(jìn)程在同時(shí)使用一臺(tái)獨(dú)占設(shè)備。也可以說(shuō)假脫機(jī)系統(tǒng)實(shí)現(xiàn)了將獨(dú)占設(shè)備變換為若干臺(tái)對(duì)應(yīng)的邏輯設(shè)備的功能颇象。

例子

打印機(jī)就是一種獨(dú)占設(shè)備伍伤,在任何時(shí)候只能允許一個(gè)用戶進(jìn)程使用。在現(xiàn)代操作系統(tǒng)中遣钳,對(duì)于打印機(jī)設(shè)備扰魂,普遍采用了 SPOOLing 技術(shù)。具體來(lái)說(shuō),首先創(chuàng)建一個(gè) SPOOLing 進(jìn)程劝评,或稱后臺(tái)打印程序姐直,以及一個(gè) SPOOLing 目錄。當(dāng)一個(gè)進(jìn)程需要打印一個(gè)文件時(shí)蒋畜,首先會(huì)生成將要打印的文件声畏,并把它放入到 SPOOLing 目錄中,然后由這個(gè)后臺(tái)打印進(jìn)程來(lái)負(fù)責(zé)真正的打印操作姻成。

文件管理

文件管理的意義

由于系統(tǒng)的內(nèi)存有限并且不能長(zhǎng)期保存插龄,故平時(shí)總是把它們以文件的形式存放在外存中,需要時(shí)再將它們調(diào)入內(nèi)存科展。

文件系統(tǒng)的功能

文件系統(tǒng)的主要作用是用于明確磁盤(pán)或分區(qū)上的文件的方法和數(shù)據(jù)結(jié)構(gòu)均牢,即在磁盤(pán)上組織文件的方法。

  • 存儲(chǔ)和管理文件:如創(chuàng)建/刪除文件才睹,對(duì)文件的各種操作等
  • 目錄管理:如創(chuàng)建/刪除目錄項(xiàng)徘跪,權(quán)限驗(yàn)證等
  • 文件存儲(chǔ)空間的管理:如外存空間的分配與回收
  • 文件共享和保護(hù)
  • 提供方便的接口:如實(shí)現(xiàn)按名存取,文件系統(tǒng)調(diào)用等

文件

文件是具有文件名的一組相關(guān)元素的集合,分為有結(jié)構(gòu)文件和無(wú)結(jié)構(gòu)文件琅攘。

文件的邏輯結(jié)構(gòu)及分類(lèi)

  • 無(wú)結(jié)構(gòu)文件
  • 有結(jié)構(gòu)文件
    • 順序文件
    • 索引文件
    • 索引順序文件
    • 散列文件

文件的物理結(jié)構(gòu)及分類(lèi)

  • 順序結(jié)構(gòu)
  • 鏈接結(jié)構(gòu)
    • 隱式鏈接
    • 顯式鏈接:FAT表
    • 索引結(jié)構(gòu)

文件存儲(chǔ)空間的管理方法

  • 空閑表法
  • 空閑鏈表法
  • 位示圖

文件目錄

目錄管理的要求

文件控制塊

索引節(jié)點(diǎn)

成組鏈接法的空閑盤(pán)快的組織垮庐、分配回收過(guò)程

文件系統(tǒng)目錄結(jié)構(gòu)

為了給用戶提供對(duì)文件的存取控制及保護(hù)功能,而按一定規(guī)則對(duì)系統(tǒng)中的文件名坞琴,(亦可包含文件屬性)進(jìn)行組織所形成的表突硝,稱為目錄表或文件目錄。目前操作系統(tǒng)采用的目錄結(jié)構(gòu)是樹(shù)型目錄結(jié)構(gòu)置济,它的優(yōu)點(diǎn)有:有效地提高對(duì)目錄的檢索速度;允許文件重名锋八;便于實(shí)現(xiàn)文件共享浙于。

文件分配的方法/數(shù)據(jù)塊組織方式

  • 連續(xù)方式:一次寫(xiě)入不存在插入問(wèn)題,而且寫(xiě)入文件之后不需要修改挟纱,連續(xù)的數(shù)據(jù)塊組織方式很適合一次性寫(xiě)入磁盤(pán)不再修改的情況羞酗,同時(shí)連續(xù)存儲(chǔ)相對(duì)鏈?zhǔn)胶退饕∪チ酥羔樀目臻g開(kāi)銷(xiāo),支持隨機(jī)查找紊服,查找速度最快檀轨。
  • 鏈接塊方式:
  • 索引方式:

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末参萄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煎饼,更是在濱河造成了極大的恐慌讹挎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異筒溃,居然都是意外死亡马篮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)怜奖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浑测,“玉大人,你說(shuō)我怎么就攤上這事歪玲∏ㄑ耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵读慎,是天一觀的道長(zhǎng)漱贱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)夭委,這世上最難降的妖魔是什么幅狮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮株灸,結(jié)果婚禮上崇摄,老公的妹妹穿的比我還像新娘。我一直安慰自己慌烧,他們只是感情好逐抑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著屹蚊,像睡著了一般厕氨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汹粤,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天命斧,我揣著相機(jī)與錄音,去河邊找鬼嘱兼。 笑死国葬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芹壕。 我是一名探鬼主播汇四,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼踢涌!你這毒婦竟也來(lái)了通孽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斯嚎,失蹤者是張志新(化名)和其女友劉穎利虫,沒(méi)想到半個(gè)月后挨厚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糠惫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年疫剃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硼讽。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巢价,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出固阁,到底是詐尸還是另有隱情壤躲,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布备燃,位于F島的核電站碉克,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏并齐。R本人自食惡果不足惜漏麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望况褪。 院中可真熱鬧撕贞,春花似錦、人聲如沸测垛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)食侮。三九已至号涯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锯七,已是汗流浹背诚隙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留起胰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓巫延,卻偏偏與公主長(zhǎng)得像效五,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炉峰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345