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

歡迎訪問 生活随笔!

生活随笔

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

windows

操作系统机制学习总结

發(fā)布時(shí)間:2025/4/14 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统机制学习总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

操作系統(tǒng)的運(yùn)行機(jī)制

http://blog.csdn.net/dongyanxia1000/article/details/51244589?
1、程序
在計(jì)算機(jī)系統(tǒng)中,通常CPU執(zhí)行兩種不同性質(zhì)的程序:
------- 一種是操作系統(tǒng)內(nèi)核程序;
------- 另一種是用戶自編程序或系統(tǒng)外層的應(yīng)用程序。
內(nèi)核程序是應(yīng)用程序的”管理者”。
“管理程序“可以執(zhí)行一些特權(quán)指令,而”被管理程序“出于安全考慮不能執(zhí)行這些指令。
所謂特權(quán)指令,是指計(jì)算機(jī)中不允許用戶直接使用的指令,如:
I/O指令、置中斷指令,存取用于內(nèi)存保護(hù)的寄存器,送程序狀態(tài)字到程序狀態(tài)字寄存器等指令。
操作系統(tǒng)在具體實(shí)現(xiàn)上劃分了用戶態(tài)(目態(tài))和核心態(tài)(管態(tài)),以嚴(yán)格區(qū)分兩類程序。
2、層次式結(jié)構(gòu)
在軟件工程思想和結(jié)構(gòu)程序設(shè)計(jì)方法的影響下誕生的現(xiàn)代操作系統(tǒng),幾乎都是層次式的結(jié)構(gòu)。
操作系統(tǒng)的各項(xiàng)功能分別被設(shè)置在不同的層次上。
------- ?一些與硬件關(guān)聯(lián)較緊密的模塊,諸如時(shí)鐘管理、中斷管理、設(shè)備驅(qū)動(dòng)等處于最底層。
------- ?其次是運(yùn)行頻率較高的程序,諸如進(jìn)程管理、存儲(chǔ)管理和設(shè)備管理等。
上面的這兩部分內(nèi)容構(gòu)成了操作系統(tǒng)的內(nèi)核,這部分內(nèi)容的指令操作工作在核心態(tài)。
3、內(nèi)核
內(nèi)核是計(jì)算機(jī)上配置的底層軟件,是計(jì)算機(jī)功能的延伸。
不同系統(tǒng)對(duì)內(nèi)核的定義稍有區(qū)別,大多數(shù)操作系統(tǒng)內(nèi)核包括4個(gè)方面的內(nèi)容。
1)時(shí)鐘管理
在計(jì)算機(jī)的各種部件中,時(shí)鐘是最關(guān)鍵的設(shè)備。
時(shí)鐘的第一功能是計(jì)時(shí),操作系統(tǒng)需要通過時(shí)鐘管理,向用戶提供標(biāo)準(zhǔn)的系統(tǒng)時(shí)間。
其次,通過時(shí)鐘中斷的管理,可以實(shí)現(xiàn)進(jìn)程的切換。
在分時(shí)操作系統(tǒng)中,采用時(shí)間片輪轉(zhuǎn)調(diào)度的實(shí)現(xiàn);
在實(shí)時(shí)系統(tǒng)中,按截至?xí)r間控制運(yùn)行的實(shí)現(xiàn);
在批處理系統(tǒng)中,通過時(shí)鐘管理來衡量一個(gè)作業(yè)的運(yùn)行程度等。
2)中斷機(jī)制
引入中斷技術(shù)的初衷是提高多道程序運(yùn)行環(huán)境中CPU的利用率,主要針對(duì)外部設(shè)備。
后來逐步得到發(fā)展,形成了多種類型,稱為操作系統(tǒng)各項(xiàng)操作的基礎(chǔ)。
如,鍵盤或鼠標(biāo)信息的輸入、進(jìn)程的管理和調(diào)度、系統(tǒng)功能的調(diào)用、設(shè)備驅(qū)動(dòng)、文件訪問等。都依賴于中斷機(jī)制。
可以說,現(xiàn)代操作系統(tǒng)是靠中斷驅(qū)動(dòng)的軟件。
中斷機(jī)制中,只有一小部分功能屬于內(nèi)核,負(fù)責(zé)保護(hù)和恢復(fù)中斷現(xiàn)場的信息,轉(zhuǎn)移控制權(quán)到相關(guān)的處理程序。
這樣可以減少中斷的處理時(shí)間,提高系統(tǒng)的并行處理能力。
3)原語
按照層次結(jié)構(gòu)設(shè)計(jì)的操作系統(tǒng),底層必然是一些可被調(diào)用的公用小程序,它們各自完成一個(gè)規(guī)定的操作,其特點(diǎn)是:
------ ?它們處于操作系統(tǒng)的最底層,是最接近硬件的部分。
------ ?這些程序的運(yùn)行具有原子性---其操作只能一氣呵成
------ ?這些程序的運(yùn)行時(shí)間都較短,而且調(diào)用頻繁。
通常把具有這些特點(diǎn)的程序稱為原語(Atomic Operation)。
定義原語的直接方法是關(guān)閉中斷,讓它的所有動(dòng)作不可分割地進(jìn)行完再打開中斷。
系統(tǒng)中的設(shè)備驅(qū)動(dòng)、CPU切換、進(jìn)程通信等功能中的
部分操作都可以定義為原語,使它們成為內(nèi)核的組成部分。
4)系統(tǒng)控制的數(shù)據(jù)結(jié)構(gòu)及處理
系統(tǒng)中用來登記狀態(tài)信息的數(shù)據(jù)結(jié)構(gòu)很多,比如:
作業(yè)控制塊、進(jìn)程控制塊、設(shè)備控制塊、各類鏈表、消息隊(duì)列、緩沖區(qū)、空閑區(qū)登記表、內(nèi)存分配表等。
為了實(shí)現(xiàn)有效的管理,系統(tǒng)需要一些基本的操作,常見的操作有以下三種:
------ ?進(jìn)程管理:進(jìn)程狀態(tài)管理、進(jìn)程調(diào)度和分配、創(chuàng)建和撤銷進(jìn)程控制塊等。
------ ?存儲(chǔ)器管理:存儲(chǔ)器的空間分配和回收、內(nèi)存信息保護(hù)程序、代碼對(duì)換程序等。
------ ?設(shè)備管理:緩沖區(qū)管理、設(shè)備分配和回收等。
核心態(tài)指令實(shí)際上包括系統(tǒng)調(diào)用類指令和一些針對(duì)時(shí)鐘、中斷和原語的操作指令。
========

操作系統(tǒng)的運(yùn)行機(jī)制

http://www.cnblogs.com/kakawater/p/6093709.html
在計(jì)算機(jī)系統(tǒng)中,操作系統(tǒng)處于中間層,向下管理和控制硬件,向上為外層軟件和用戶編寫的程序提供使用方便、功能強(qiáng)大的服務(wù)。操作系統(tǒng)的主要功能就是管理CPU、主存、I/O設(shè)備和文件,并提供支持程序并發(fā)運(yùn)行的機(jī)制。


通常,操作系統(tǒng)提供的主要功能都是由操作系統(tǒng)內(nèi)核程序?qū)崿F(xiàn)的,CPU在運(yùn)行上層程序時(shí),唯一能進(jìn)入內(nèi)核程序運(yùn)行的途徑就是中斷或異常。


中斷和異常
中斷和異常時(shí)操作系統(tǒng)的重要概念,中斷的引入是為了實(shí)現(xiàn)CPU和通道(或設(shè)備)之間的并行操作,當(dāng)CPU啟動(dòng)通道(或設(shè)備)進(jìn)入I/O后,通道(或設(shè)備)就可以獨(dú)立工作了,CPU可以去做與此I/O不相關(guān)的事情。當(dāng)通道處理完CPU交付的I/O任務(wù)之后就必須告知CPU,讓CPU繼續(xù)處理I/O操作以上的事情。在計(jì)算機(jī)中,通道(或設(shè)備)通過中斷機(jī)制來告知CPU。


由于眾多原因,當(dāng)CPU在執(zhí)行指令的時(shí)候可能會(huì)出現(xiàn)錯(cuò)誤,這個(gè)錯(cuò)誤就稱為”異常”。例如,CPU在執(zhí)行指令時(shí),可能會(huì)出現(xiàn)算術(shù)一出、零作除數(shù)、訪存越界等錯(cuò)誤。此外,在操作系統(tǒng)中,還提供一種異常指令-陷入指令trap(即陷入指令trap是一種會(huì)產(chǎn)生異常的指令),用來實(shí)現(xiàn)系統(tǒng)調(diào)用(用來實(shí)現(xiàn)CPU切換到內(nèi)核程序運(yùn)行)。


中斷和異常的區(qū)別


中斷和異常都能用來讓CPU切換到內(nèi)核程序運(yùn)行,但是兩者的是有區(qū)別的:


調(diào)用方不一樣:中斷是由硬件來產(chǎn)生,而異常則是由CPU當(dāng)前執(zhí)行的指令的實(shí)現(xiàn)邏輯發(fā)生錯(cuò)誤而產(chǎn)生。
中斷是一種通知機(jī)制,異常是一種錯(cuò)誤處理機(jī)制。故中斷可以被屏蔽或者稍后處理,而異常則不能被屏蔽,并且應(yīng)當(dāng)立即處理。
中斷/異常的響應(yīng)和處理
處理機(jī)在執(zhí)行任何指令時(shí)都可能產(chǎn)生中斷或者異常,那么處理機(jī)如何響應(yīng)中斷和異常呢?


中斷/異常響應(yīng)


中斷信號(hào)是由外部設(shè)備或者時(shí)鐘部件發(fā)送給CPU的,為了能及時(shí)監(jiān)測中斷信號(hào),通過在CPU的控制部件中增加一個(gè)能夠監(jiān)測中斷信號(hào)的機(jī)構(gòu)來完成。該機(jī)構(gòu)能夠在每條機(jī)器指令執(zhí)行周期內(nèi)的最后時(shí)刻掃描中斷寄存器詢問是否含有中斷信號(hào)。如果沒有中斷信號(hào)或被信號(hào)暫時(shí)被屏蔽,CPU繼續(xù)執(zhí)行程序的后續(xù)指令,否則CPU停止執(zhí)行當(dāng)前程序的后續(xù)指令,無條件地轉(zhuǎn)入操作系統(tǒng)內(nèi)核的中斷處理程序,我們稱該過程為中斷響應(yīng)


異常是在執(zhí)行指令時(shí),由于指令的邏輯錯(cuò)誤造成CPU轉(zhuǎn)入執(zhí)行操作系統(tǒng)內(nèi)核的異常處理程序。


和CPU在切換程序運(yùn)行時(shí)一樣,CPU在執(zhí)行異常處理程序或中斷處理程序時(shí)依舊需要涉及到對(duì)當(dāng)前程序的運(yùn)行現(xiàn)場進(jìn)行保護(hù)。


斷點(diǎn)和恢復(fù)點(diǎn)


CPU一旦響應(yīng)中斷,立刻開始執(zhí)行內(nèi)核中的中斷處理程序,當(dāng)中斷處理程序結(jié)束后,重新返回中斷點(diǎn)執(zhí)行后續(xù)指令。我們稱當(dāng)中斷發(fā)生時(shí),CPU剛執(zhí)行完的那條指令的內(nèi)存地址稱為”斷點(diǎn)”。一般情況下,斷點(diǎn)應(yīng)為中斷的那一瞬間,CPU的PC寄存器(程序計(jì)數(shù)器)所指指令的前一條指令的內(nèi)存地址。而中斷時(shí),PC寄存器所指指令的內(nèi)存地址為恢復(fù)點(diǎn)。


在異常發(fā)生時(shí),返回點(diǎn)(即異常處理程序執(zhí)行完后,CPU要執(zhí)行的下一條指令的地址)會(huì)因?yàn)椴煌漠惓6兴鶇^(qū)別:


對(duì)于大部分由用戶程序指令執(zhí)行出錯(cuò)而引起的異常,操作系統(tǒng)的處理方式是結(jié)束所運(yùn)行的程序,因此就不會(huì)回到用戶程序。
如果是通過trap指令進(jìn)行系統(tǒng)調(diào)用,則處理完成后trap指令的下一條指令。
對(duì)于虛存系統(tǒng)訪存指令的缺頁異常,異常處理完后則會(huì)返回發(fā)生異常的指令重新執(zhí)行該訪存指令,以保證這次訪存指令能夠順利執(zhí)行。
現(xiàn)場保護(hù)


CPU在執(zhí)行程序時(shí),主要操作的時(shí)寄存器中的值。所謂現(xiàn)場信息,就是值中斷那一時(shí)刻確保存放程序繼續(xù)運(yùn)行的有關(guān)信息,例如PC寄存器、通用寄存器以及一些與程序運(yùn)行相關(guān)的特殊寄存器中的內(nèi)存(即CPU中與程序運(yùn)行相關(guān)的寄存器的狀態(tài))。


現(xiàn)場信息的保護(hù)和恢復(fù)可由硬件、軟件共通完成,現(xiàn)場信息通常保存在操作系統(tǒng)中的與被中斷程序相關(guān)的數(shù)據(jù)結(jié)構(gòu)中。


中斷/異常響應(yīng)的CPU模式


中斷和異常的處理程序都是操作系統(tǒng)的內(nèi)核程序,都必須在特權(quán)模式下運(yùn)行,因?yàn)檫@些程序需要訪問外設(shè)等操作系統(tǒng)管理的資源或者設(shè)計(jì)系統(tǒng)的管理表格。


在操作系統(tǒng),我們將在監(jiān)督程序中CPU的兩種模式,監(jiān)督模式和用戶模式,分別稱為”核心態(tài)”和”用戶態(tài)”。我們通過在CPU的狀態(tài)字寄存器中設(shè)置一個(gè)標(biāo)識(shí)位,根據(jù)其當(dāng)前值為1或0來分別表示處理機(jī)處在核心態(tài)或用戶態(tài)。


通常CPU執(zhí)行兩種不同的程序,一種是操作系統(tǒng)內(nèi)核程序(核心態(tài)),另一種是用戶自行編寫的程序(用戶態(tài))或系統(tǒng)外層的應(yīng)用程序(用戶態(tài))。前者是后者的服務(wù)者和控制者。


中斷/異常處理程序的執(zhí)行


操作系統(tǒng)為每個(gè)中斷/異常都創(chuàng)建一個(gè)處理程序,并把這些處理程序的入口地址放在主存的特定位置(主存單元),并稱這些主存單元為中斷/異常向量,或稱系統(tǒng)控制塊


對(duì)于不同的操作系統(tǒng)。中斷/異常向量中的內(nèi)存細(xì)節(jié)也不完全相同。中斷/異常向量的每一個(gè)單元中出了存儲(chǔ)中斷/異常處理程序的入口地址外,還常用來保存CPU狀態(tài)轉(zhuǎn)換的信息。例如,中斷/異常處理程序運(yùn)行需要用到的新PS寄存器值和新PC寄存器值。


在中斷/異常向量中,每一個(gè)中斷信號(hào)占用連續(xù)的兩個(gè)單元:一個(gè)用來存放中斷/異常處理程序的地址(對(duì)應(yīng)PC寄存器的新值),另一個(gè)單元用來存放執(zhí)行中斷/異常處理程序時(shí)CPU所處的狀態(tài)(對(duì)應(yīng)PS寄存器的新值)。當(dāng)響應(yīng)中斷/異常時(shí),硬件首先將當(dāng)前PC和PS寄存器的值作為程序現(xiàn)場保存起來,然后再從中斷/異常向量中的相應(yīng)單元取出要放入PC和PS寄存器中的值并放入相應(yīng)的寄存器。最后再根據(jù)PC寄存器中的值去執(zhí)行中斷/異常處理程序


中斷
在計(jì)算機(jī)系統(tǒng)中, 多個(gè)中斷可能在同一時(shí)刻產(chǎn)生,并且還會(huì)在前一個(gè)中斷還未處理完的情況下就產(chǎn)生下一個(gè)中斷。系統(tǒng)為了保存每個(gè)中斷信號(hào),通常用一些中斷寄存器來將它們保存,為了區(qū)分不同的信號(hào)源,一般對(duì)中斷寄存器的各位順序編號(hào),我們稱該編號(hào)為中斷序號(hào),并且規(guī)定其值為1時(shí)表示有中斷信號(hào),其值為0時(shí)表示沒有中斷信號(hào)。


在實(shí)時(shí)系統(tǒng)中,通過將中斷分為不同的級(jí)別,我們稱為中斷優(yōu)先級(jí),以便系統(tǒng)能夠立刻處理實(shí)時(shí)性要求比較高的中斷。級(jí)別高的中斷享有絕對(duì)優(yōu)先處理的權(quán)利:


當(dāng)級(jí)別不同的兩個(gè)以上中斷信號(hào)同時(shí)產(chǎn)生時(shí),首先處理級(jí)別高的中斷。
級(jí)別高的中斷可以打斷級(jí)別低的中斷的處理過程。
當(dāng)兩個(gè)級(jí)別相同的中斷產(chǎn)生時(shí),根據(jù)中斷寄存器中從左至右的順序來決定處理順序。(是不是很像四則運(yùn)算法則)
在實(shí)際的操作系統(tǒng)中,有多少中斷級(jí)別,每個(gè)中斷應(yīng)該被劃分到那個(gè)級(jí)別,這些都由操作系統(tǒng)設(shè)計(jì)者來決定。通常來說,高速設(shè)備的中斷優(yōu)先級(jí)高,低速設(shè)備的中斷優(yōu)先級(jí)低。但是作為交互系統(tǒng),也要考慮到用戶的特殊需求,例如用戶在輸入指令時(shí),該輸入設(shè)備就應(yīng)當(dāng)設(shè)置為較高的中斷級(jí)別。


某小型機(jī)的操作系統(tǒng)把中斷級(jí)別分為如下三種:


時(shí)鐘中斷的中斷優(yōu)先級(jí)為6
磁盤中斷的中斷優(yōu)先級(jí)為5
終端等其它外設(shè)中斷的中斷優(yōu)先級(jí)為4
中斷屏蔽(中斷過濾)


計(jì)算機(jī)中有那么多的屏蔽,但是有時(shí)候我們希望CPU在執(zhí)行一些任務(wù)的時(shí)候可以過濾一些中斷信號(hào),讓CPU專注于當(dāng)前的任務(wù),在一點(diǎn)在很多場景下都很有用,譬如當(dāng)多個(gè)程序同時(shí)操縱一塊內(nèi)存的時(shí)候很有用。


所謂的”中斷屏蔽”通常是指禁止響應(yīng)中斷。在可編程中斷控制器中,CPU可以執(zhí)行特權(quán)指令來設(shè)置可編程中斷控制器的屏蔽碼,這樣即使硬件發(fā)現(xiàn)具有屏蔽碼的中斷產(chǎn)生,也不會(huì)通知處理機(jī),但還是會(huì)保存此次中斷以便將來屏蔽解除時(shí)由CPU來處理. 我們稱這種方式為軟屏蔽


處理器優(yōu)先級(jí)是指當(dāng)前CPU正在運(yùn)行程序的中斷響應(yīng)級(jí)別。當(dāng)處理器處于某一處理器優(yōu)先級(jí)時(shí),就會(huì)只允許處理響應(yīng)級(jí)別比該級(jí)別高的中斷,而屏蔽低于或等于該優(yōu)先級(jí)的中斷。


系統(tǒng)調(diào)用(trap指令)
當(dāng)用戶態(tài)下的程序通過trap指令進(jìn)行系統(tǒng)調(diào)用的時(shí)候,需要進(jìn)行調(diào)用參數(shù),以便根據(jù)系統(tǒng)調(diào)用表調(diào)用相應(yīng)的系統(tǒng)調(diào)用處理程序。


為了方便高級(jí)語言程序使用系統(tǒng)調(diào)用,通常提供一個(gè)系統(tǒng)調(diào)用庫,其中包含許多系統(tǒng)調(diào)用借口函數(shù),這些函數(shù)看上去就是一些普通的子程序,但是實(shí)則這些函數(shù)往往是有為數(shù)不多的幾條匯編指令實(shí)現(xiàn)的,而且這些匯編指令中必須包含一條trap指令,這樣才能保證指令trap指令時(shí)處理器控制轉(zhuǎn)移至操作系統(tǒng)內(nèi)核的相應(yīng)程序。
使用系統(tǒng)提供的系統(tǒng)調(diào)用庫函數(shù)進(jìn)行系統(tǒng)調(diào)用不但可以使用戶不必關(guān)心系統(tǒng)調(diào)用的細(xì)節(jié),而且可以避免由用戶直接使用trap指令可能引起的錯(cuò)誤。


ABI(Application Binary Interface,應(yīng)用程序二進(jìn)制接口)


在進(jìn)行系系統(tǒng)調(diào)用時(shí),系統(tǒng)調(diào)用庫函數(shù)需要向操作系統(tǒng)傳遞什么樣的調(diào)用型號(hào)?該系統(tǒng)調(diào)用需要什么參數(shù)?以及如何傳遞參數(shù)(顯然是通過寄存器來傳遞)?如何接收系統(tǒng)調(diào)用的返回值(顯然也是通過寄存器)等這一系列操作都會(huì)在操作系統(tǒng)的ABI文檔中說明,例如上層用戶應(yīng)該使用哪些寄存器來傳遞參數(shù)。


事實(shí)上,我們可以自己基于操作系統(tǒng)的ABI文檔來實(shí)現(xiàn)一個(gè)系統(tǒng)調(diào)用庫,這在沒有與我們使用的高級(jí)語言相對(duì)應(yīng)的系統(tǒng)調(diào)用庫時(shí)極為有用。
========

操作系統(tǒng)的運(yùn)行機(jī)制

http://c.biancheng.net/cpp/html/2583.html


計(jì)算機(jī)系統(tǒng)中,通常CPU執(zhí)行兩種不同性質(zhì)的程序:一種是操作系統(tǒng)內(nèi)核程序;另一種是用戶自編程序或系統(tǒng)外層的應(yīng)用程序。對(duì)操作系統(tǒng)而言,這兩種程序的作用不同,前者是后者的管理者,因此“管理程序”要執(zhí)行一些特權(quán)指令,而“被管理程序”出于安全考慮不能執(zhí)行這些指令。所謂特權(quán)指令,是指計(jì)算機(jī)中不允許用戶直接使用的指令,如I/O指令、 置中斷指令,存取用于內(nèi)存保護(hù)的寄存器、送程序狀態(tài)字到程序狀態(tài)字寄存器等指令。操作系統(tǒng)在具體實(shí)現(xiàn)上劃分了用戶態(tài)(目態(tài))和核心態(tài)(管態(tài)),以嚴(yán)格區(qū)分兩類程序。


在軟件工程思想和結(jié)構(gòu)程序設(shè)計(jì)方法的影響下誕生的現(xiàn)代操作系統(tǒng),幾乎都是層次式的結(jié)構(gòu)。操作系統(tǒng)的各項(xiàng)功能分別被設(shè)置在不同的層次上。一些與硬件關(guān)聯(lián)較緊密的模塊,諸如時(shí)鐘管理、中斷處理、設(shè)備驅(qū)動(dòng)等處于最底層。其次是運(yùn)行頻率較髙的程序,諸如進(jìn)程管理、存儲(chǔ)器管理和設(shè)備管理等。這兩部分內(nèi)容構(gòu)成了操作系統(tǒng)的內(nèi)核。這部分內(nèi)容的指令操作工作在核心態(tài)。


內(nèi)核是計(jì)算機(jī)上配置的底層軟件,是計(jì)算機(jī)功能的延伸。不同系統(tǒng)對(duì)內(nèi)核的定義稍有區(qū)別,大多數(shù)操作系統(tǒng)內(nèi)核包括四個(gè)方面的內(nèi)容。
1) 時(shí)鐘管理


在計(jì)算機(jī)的各種部件中,時(shí)鐘是最關(guān)鍵的設(shè)備。時(shí)鐘的第一功能是計(jì)時(shí),操作系統(tǒng)需要通過時(shí)鐘管理,向用戶提供標(biāo)準(zhǔn)的系統(tǒng)時(shí)間。另外,通過時(shí)鐘中斷的管理,可以實(shí)現(xiàn)進(jìn)程的切換。諸如,在分時(shí)操作系統(tǒng)中,釆用時(shí)間片輪轉(zhuǎn)調(diào)度的實(shí)現(xiàn);在實(shí)時(shí)系統(tǒng)中,按截止時(shí)間控制運(yùn)行的實(shí)現(xiàn);在批處理系統(tǒng)中,通過時(shí)鐘管理來衡量一個(gè)作業(yè)的運(yùn)行程度等。因此,系統(tǒng)管理的方方面面無不依賴于時(shí)鐘。
2) 中斷機(jī)制


引入中斷技術(shù)的初衷是提高多道程序運(yùn)行環(huán)境中CPU的利用率,而且主要是針對(duì)外部設(shè)備的。后來逐步得到發(fā)展,形成了多種類型,成為操作系統(tǒng)各項(xiàng)操作的基礎(chǔ)。例如,鍵盤或鼠標(biāo)信息的輸入、進(jìn)程的管理和調(diào)度、系統(tǒng)功能的調(diào)用、設(shè)備驅(qū)動(dòng)、文件訪問等,無不依賴于中斷機(jī)制。可以說,現(xiàn)代操作系統(tǒng)是靠中斷驅(qū)動(dòng)的軟件。


中斷機(jī)制中,只有一小部分功能屬于內(nèi)核,負(fù)責(zé)保護(hù)和恢復(fù)中斷現(xiàn)場的信息,轉(zhuǎn)移控制權(quán)到相關(guān)的處理程序。這樣可以減少中斷的處理時(shí)間,提高系統(tǒng)的并行處理能力。
3) 原語


按層次結(jié)構(gòu)設(shè)計(jì)的操作系統(tǒng),底層必然是一些可被調(diào)用的公用小程序,它們各自完成一個(gè)規(guī)定的操作。其特點(diǎn)是:
它們處于操作系統(tǒng)的最底層,是最接近硬件的部分。
這些程序的運(yùn)行具有原子性——其操作只能一氣呵成(這主要是從系統(tǒng)的安全性和便于管理考慮的)。
這些程序的運(yùn)行時(shí)間都較短,而且調(diào)用頻繁。


通常把具有這些特點(diǎn)的程序稱為原語(Atomic Operation)。定義原語的直接方法是關(guān)閉中斷,讓它的所有動(dòng)作不可分割地進(jìn)行完再打開中斷。


系統(tǒng)中的設(shè)備驅(qū)動(dòng)、CPU切換、進(jìn)程通信等功能中的部分操作都可以定義為原語,使它們成為內(nèi)核的組成部分。
4) 系統(tǒng)控制的數(shù)據(jù)結(jié)構(gòu)及處理


系統(tǒng)中用來登記狀態(tài)信息的數(shù)據(jù)結(jié)構(gòu)很多,比如作業(yè)控制塊、進(jìn)程控制塊(PCB)、設(shè)備控制塊、各類鏈表、消息隊(duì)列、緩沖區(qū)、空閑區(qū)登記表、內(nèi)存分配表等。為了實(shí)現(xiàn)有效的管理,系統(tǒng)需要一些基本的操作,常見的操作有以下三種:
進(jìn)程管理:進(jìn)程狀態(tài)管理、進(jìn)程調(diào)度和分派、創(chuàng)建與撤銷進(jìn)程控制塊等。
存儲(chǔ)器管理:存儲(chǔ)器的空間分配和回收、內(nèi)存信息保護(hù)程序、代碼對(duì)換程序等。
設(shè)備管理:緩沖區(qū)管理、設(shè)備分配和回收等。


從上述內(nèi)容可以了解,核心態(tài)指令實(shí)際上包括系統(tǒng)調(diào)用類指令和一些針對(duì)時(shí)鐘、中斷和原語的操作指令。
========

操作系統(tǒng)運(yùn)行環(huán)境和運(yùn)行機(jī)制

http://blog.csdn.net/wyi06/article/details/54808145


1)操作系統(tǒng)運(yùn)行環(huán)境(物理機(jī)器界面):


a.CPU狀態(tài)(模式)


處理器由運(yùn)算器,控制器,一系列的寄存器(用戶可見寄存器,控制和狀態(tài)寄存器)以及高速緩存構(gòu)成


常見的控制和狀態(tài)寄存器:


程序計(jì)數(shù)器(PC:Program Counter),記錄將要取出的指令地址


指令寄存器(IR:Instruction Register),記錄最近取出的指令


程序狀態(tài)字(PSW:Program Status Word),記錄處理的運(yùn)行狀態(tài)如條件碼、模式、控制位等信息


操作系統(tǒng)的需求——保護(hù)


需要硬件提供基本運(yùn)行機(jī)制:


處理器具有特權(quán)級(jí)別,能在不同的特權(quán)級(jí)運(yùn)行不同的指令集合


硬件機(jī)制可將OS與用戶程序隔離


處理器的狀態(tài)(模式MODE)


在PSW中專門設(shè)置一位,根據(jù)運(yùn)行程序?qū)Y源和指令的使用權(quán)限而設(shè)置不同的CPU狀態(tài)


操作系統(tǒng)的兩種狀態(tài)


內(nèi)核態(tài):運(yùn)行操作系統(tǒng)


用戶態(tài):運(yùn)行用戶程序


特權(quán)指令:只能由操作系統(tǒng)使用(啟動(dòng)I/O,內(nèi)存清零,修改程序狀態(tài)字,設(shè)置時(shí)鐘,允許/禁止中斷,停機(jī))


非特權(quán)指令:用戶程序可以使用的命令(控制轉(zhuǎn)移,算術(shù)運(yùn)算,


訪管指令(又稱陷入指令,提供給用戶程序的接口,用于調(diào)用操作系統(tǒng)的功能(服務(wù))),取數(shù)指令)


CPU狀態(tài)之間的轉(zhuǎn)換


用戶態(tài)-->內(nèi)核態(tài)(唯一途徑:中斷/異常/陷入機(jī)制)


內(nèi)核態(tài)-->用戶態(tài) 設(shè)置PSW


b.中斷/異常機(jī)制


中斷/異常的概念:CPU對(duì)系統(tǒng)發(fā)生的某個(gè)事件做出的一種反應(yīng)


事件的發(fā)生改變了處理器控制流


中斷(外中斷如I/O中斷,時(shí)鐘中斷,硬件故障),如為了支持CPU和設(shè)備之間的并行操作;


異常(內(nèi)中斷如系統(tǒng)調(diào)用,頁故障,保護(hù)性異常,斷點(diǎn)指令,其他程序異常)表示CPU執(zhí)行指令本身出現(xiàn)的問題。


特點(diǎn):隨機(jī)發(fā)生的,自動(dòng)處理的,可恢復(fù)的


中斷/異常機(jī)制工作原理


硬件:(發(fā)現(xiàn)中斷、接受中斷)捕獲中斷源發(fā)出的中斷/異常請(qǐng)求,以一定的方式響應(yīng),將處理器控制權(quán)交給特定的處理程序


軟件:(中斷異常處理程序)識(shí)別中斷/異常類型并完成相應(yīng)的處理


中斷響應(yīng)過程:


設(shè)備發(fā)中斷信號(hào),硬件保存現(xiàn)場,根據(jù)中斷碼查表,把中斷處理程序入口地址等推送到相應(yīng)的寄存器,執(zhí)行中斷程序


中斷處理程序:


設(shè)計(jì)操作系統(tǒng)時(shí),為每一類中斷/異常事件編好相應(yīng)的處理程序,并設(shè)置好中斷向量表


系統(tǒng)運(yùn)行時(shí)若響應(yīng)中斷,中斷硬件部件將CPU控制權(quán)轉(zhuǎn)給中斷處理程序:


保存相關(guān)寄存器信息,分析中斷/異常的具體原因,執(zhí)行對(duì)應(yīng)的處理功能,恢復(fù)現(xiàn)場,返回被事件大段的程序


2)操作系統(tǒng)運(yùn)行機(jī)制(虛擬機(jī)界面):


a.系統(tǒng)調(diào)用(操作系統(tǒng)功能調(diào)用)


定義:用戶在編程時(shí)可以調(diào)用的操作系統(tǒng)功能


作用:是操作系統(tǒng)提供給編程人員的唯一接口;使CPU狀態(tài)從用戶態(tài)陷入內(nèi)核態(tài)


系統(tǒng)調(diào)用機(jī)制的設(shè)計(jì):


中斷/異常機(jī)制:支持系統(tǒng)調(diào)用服務(wù)的實(shí)現(xiàn)


選擇一條特殊指令:陷入指令(訪管指令):引發(fā)異常,完成用戶態(tài)到內(nèi)核態(tài)的切換


系統(tǒng)調(diào)用號(hào)和參數(shù):每個(gè)系統(tǒng)調(diào)用都事先給定一個(gè)編號(hào)(功能號(hào))


系統(tǒng)調(diào)用表:存放系統(tǒng)調(diào)用服務(wù)例程的入口地址


用戶程序的參數(shù)傳遞給內(nèi)核:


方法1:由陷入指令自帶參數(shù):陷入指令的長度有限,且還要攜帶系統(tǒng)調(diào)用功能號(hào),只能自帶有限參數(shù)


方法2:通過通用寄存器傳遞參數(shù):這些寄存器是操作系統(tǒng)和用戶程序都能訪問的,但寄存器的個(gè)數(shù)會(huì)限制傳遞參數(shù)的數(shù)量


方法3:在內(nèi)存中開辟專用堆棧區(qū)來傳遞參數(shù)


系統(tǒng)調(diào)用的執(zhí)行過程


當(dāng)CPU執(zhí)行到特殊的陷入指令時(shí):


中斷/異常機(jī)制:硬件保護(hù)現(xiàn)場;通過中斷向量表把控制權(quán)轉(zhuǎn)給系統(tǒng)調(diào)用總?cè)肟诔绦?


系統(tǒng)調(diào)用總?cè)肟诔绦?#xff1a;保存現(xiàn)場;將參數(shù)保存在堆棧里;通過查系統(tǒng)調(diào)用表把控制權(quán)轉(zhuǎn)給相應(yīng)的系統(tǒng)調(diào)用處理例程或內(nèi)核函數(shù)


執(zhí)行系統(tǒng)調(diào)用例程


恢復(fù)現(xiàn)場,返回用戶程序


操作系統(tǒng)概述進(jìn)程/線程模型
========

操作系統(tǒng)-鎖機(jī)制

http://blog.csdn.net/lz20120808/article/details/51707247


計(jì)算機(jī)操作系統(tǒng)鎖機(jī)制.


在多線程編程中,操作系統(tǒng)引入了鎖機(jī)制。通過鎖機(jī)制,能夠保證在多核多線程環(huán)境中,在某一個(gè)時(shí)間點(diǎn)上,只能有一個(gè)線程進(jìn)入臨界區(qū)代碼,從而保證臨界區(qū)中操作數(shù)據(jù)的一致性。


所謂的鎖,可以理解為內(nèi)存中的一個(gè)整型數(shù),擁有兩種狀態(tài):空閑狀態(tài)和上鎖狀態(tài)。加鎖時(shí),判斷鎖是否空閑,如果空閑,修改為上鎖狀態(tài),返回成功;如果已經(jīng)上鎖,則返回失敗。解鎖時(shí),則把鎖狀態(tài)修改為空閑狀態(tài)。?
加鎖過程用如下偽碼表示:?
1、read lock;?
2、判斷l(xiāng)ock狀態(tài);?
3、如果已經(jīng)加鎖,失敗返回;?
4、把鎖狀態(tài)設(shè)置為上鎖;?
5、返回成功。?
雖然每一步是原子性的,但是每一步之間卻是可以中斷的。比如進(jìn)程A在執(zhí)行完2后發(fā)生中斷,中斷中進(jìn)程B也執(zhí)行了加鎖過程,返回中斷后就會(huì)發(fā)生兩個(gè)進(jìn)程都會(huì)加鎖。?
對(duì)于這個(gè)問題,計(jì)算機(jī)已經(jīng)解決,方法是采用原子級(jí)匯編指令test and set 和swap。


死鎖的概念.


死鎖: 是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去.此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程.?
比如 兩只羊過獨(dú)木橋。進(jìn)程比作羊,資源比作橋。若兩只羊互不相讓,爭著過橋,就產(chǎn)生死鎖。


死鎖的原因.


主要原因(1) 因?yàn)橄到y(tǒng)資源不足。(2) 進(jìn)程運(yùn)行推進(jìn)的順序不合適,保證有先后順序。(3) 資源分配不當(dāng)?shù)取?


死鎖的必要條件.


產(chǎn)生死鎖的四個(gè)必要條件:?
(1) 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用。?
(2) 請(qǐng)求與保持條件:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。?
(3) 不剝奪條件: 進(jìn)程已獲得的資源,在末使用完之前,不能強(qiáng)行剝奪。?
(4) 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。存在一個(gè)進(jìn)程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一 源,……,而Pn等待P1所占有的的某一資源,形成一個(gè)進(jìn)程循環(huán)等待環(huán)。?
這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。


解決死鎖的四個(gè)方式.?
1)忽略該問題。例如鴕鳥算法,該算法可以應(yīng)用在極少發(fā)生死鎖的的情況下。為什么叫鴕鳥算法呢,(鴕鳥策略)?
2)檢測死鎖并且恢復(fù)。(檢測與解除策略)?
3)仔細(xì)地對(duì)資源進(jìn)行動(dòng)態(tài)分配,以避免死鎖。(避免策略)?
4)通過破除死鎖四個(gè)必要條件之一,來防止死鎖產(chǎn)生。(預(yù)防策略)


C++多線程開發(fā)中,容易出現(xiàn)死鎖導(dǎo)致程序掛起的現(xiàn)象。?
解決步驟分為三步:?
1、檢測死鎖線程。?
2、打印線程信息。?
3、修改死鎖程序。


進(jìn)程(Process)和線程(Thread).


  進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。擁有獨(dú)立的內(nèi)存單元。線程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。但是不能獨(dú)立運(yùn)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。線程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程,同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。?
  進(jìn)程與應(yīng)用程序的區(qū)別在于應(yīng)用程序作為一個(gè)靜態(tài)文件存儲(chǔ)在計(jì)算機(jī)系統(tǒng)的硬盤等存儲(chǔ)空間中,而進(jìn)程則是處于動(dòng)態(tài)條件下由操作系統(tǒng)維護(hù)的系統(tǒng)資源管理實(shí)體。


進(jìn)程的狀態(tài)轉(zhuǎn)換圖,及導(dǎo)致轉(zhuǎn)換的事件.?
三個(gè)狀態(tài):?
1)就緒狀態(tài)  進(jìn)程已獲得除處理機(jī)外的所需資源,等待分配處理機(jī)資源,只要分配到CPU就可執(zhí)行。在某一時(shí)刻,可能有若干個(gè)進(jìn)程處于該狀態(tài)。   ?
2)運(yùn)行狀態(tài) 占用處理機(jī)資源運(yùn)行,處于此狀態(tài)的進(jìn)程的數(shù)目小于等于CPU的數(shù)目。   ?
3)阻塞狀態(tài)  由于進(jìn)程等待某種條件(如I/O操作或進(jìn)程同步),在條件滿足之前無法繼續(xù)執(zhí)行。該事件發(fā)生前即使把處理機(jī)分配給該進(jìn)程,也無法運(yùn)行。
========

鎖機(jī)制與原子操作

http://www.cnblogs.com/kissdodog/archive/2013/04/07/3003822.html
一、線程同步中的一些概念
  1.1臨界區(qū)(共享區(qū))的概念


  在多線程的環(huán)境中,可能需要共同使用一些公共資源,這些資源可能是變量,方法邏輯段等等,這些被多個(gè)線程共用的區(qū)域統(tǒng)稱為臨界區(qū)(共享區(qū)),臨界區(qū)的資源不是很安全,因?yàn)榫€程的狀態(tài)是不定的,所以可能帶來的結(jié)果是臨界區(qū)的資源遭到其他線程的破壞,我們必須采取策略或者措施讓共享區(qū)數(shù)據(jù)在多線程的環(huán)境下保持完成性不讓其受到多線程訪問的破壞。


  1.2基元用戶模式


  基元用戶模式是指使用cpu的特殊指令來調(diào)度線程,所以這種協(xié)調(diào)調(diào)度線程是在硬件中進(jìn)行的所以得出了它第一些優(yōu)點(diǎn):


速度特別快;
線程阻塞時(shí)間特別短;
  但是由于該模式中的線程可能被系統(tǒng)搶占,導(dǎo)致該模式中的線程為了獲取某個(gè)資源,而浪費(fèi)許多cpu時(shí)間,同時(shí)如果一直處于等待的話會(huì)導(dǎo)致”活鎖”,也就是既浪費(fèi)了內(nèi)存,又浪費(fèi)了cpu時(shí)間,這比下文中的死鎖更可怕,那么如何利用強(qiáng)大的cpu時(shí)間做更多的事呢?那就引出了下面的一個(gè)模式


?  1.3基元內(nèi)核模式


  該模式和用戶模式不同,它是windows系統(tǒng)自身提供的,使用了操作系統(tǒng)中內(nèi)核函數(shù),所以它能夠阻塞線程提高了cpu的利用率,同時(shí)也帶來了一個(gè)很可怕的bug,死鎖,可能線程會(huì)一直阻塞導(dǎo)致程序的奔潰,常用的內(nèi)核模式的技術(shù)例如Monitor,Mutex,等等會(huì)在下一章節(jié)介紹。本章將詳細(xì)討論鎖的概念,使用方法和注意事項(xiàng)


?  1.4原子性操作


  如果一個(gè)語句執(zhí)行一個(gè)單獨(dú)不可分割的指令,那么它是原子的。嚴(yán)格的原子操作排除了任何搶占的可能性,更方便的理解是這個(gè)值永遠(yuǎn)是最新的,在c#中原子操作如下圖所示:其實(shí)要符合原子操作必須滿足以下條件c#中如果是32位cpu的話,為一個(gè)少于等于32位字段賦值是原子操作,其他(自增,讀,寫操作)的則不是。對(duì)于64位cpu而言,操作32或64位的字段賦值都屬于原子操作其他讀寫操作都不能屬于原子操作相信大家能夠理解原子的特點(diǎn),所以在使用原子操作時(shí)也需要注意當(dāng)前操作系統(tǒng)是32位或是64位cpu或者兩者皆要考慮。


  1.5非阻止同步


  非阻止同步:不阻止其他線程的情況下實(shí)現(xiàn)同步。就是利用原子性操作實(shí)現(xiàn)線程間的同步,不刻意阻塞線程,減少相應(yīng)線程的開銷,interlocked類便是c#中非阻止同步的理念所產(chǎn)生的線程同步技術(shù)。


  1.6阻止同步


  阻止同步:阻止其他線程,同一時(shí)間只允許單個(gè)線程訪問臨界資源。其實(shí)阻止同步也是基元內(nèi)核模式的特點(diǎn)之一。


  例如c# 中的鎖機(jī)制,及mutex,monitor等都屬于阻止同步,他們的根本目的是,以互斥的效果讓同一時(shí)間只有一個(gè)線程能夠訪問共享區(qū),其他線程必須阻止等待,直到該線程離開共享區(qū)后,才讓其他一個(gè)線程訪問共享區(qū),阻止同步缺點(diǎn)也是容易產(chǎn)生死鎖,但是阻止同步提高了cpu時(shí)間的利用率。


二、為何需要同步
  當(dāng)多個(gè)線程同時(shí)訪問某個(gè)資源,可能造成意想不到的結(jié)果。如多個(gè)線程同時(shí)訪問靜態(tài)資源。


復(fù)制代碼
? ? class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //初始化10個(gè)線程1去訪問num
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ThreadPool.QueueUserWorkItem(new WaitCallback(Run));
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? static int num = 0;


? ? ? ? static void Run(object state)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine("當(dāng)前數(shù)字:{0}", ++num);
? ? ? ? }
? ? }
復(fù)制代碼
  輸出如下:


  我們看到,num++按照邏輯,應(yīng)該是1,2,3,4,5,6,7,8,9,10。這就是多個(gè)線程去訪問,順序亂套了。這時(shí)候就需要同步了。


三、原子操作同步原理
  Thread類中的VolatileRead和VolatileWrite方法:


VolatileWrite:當(dāng)線程在共享區(qū)(臨界區(qū))傳遞信息時(shí),通過此方法來原子性的寫入最后一個(gè)值;
VolatileRead:當(dāng)線程在共享區(qū)(臨界區(qū))傳遞信息時(shí),通過此方法來原子性的讀取第一個(gè)值;
復(fù)制代碼
? ? class Program
? ? {
? ? ? ? static Int32 count;//計(jì)數(shù)值,用于線程同步 (注意原子性,所以本例中使用int32)
? ? ? ? static Int32 value;//實(shí)際運(yùn)算值,用于顯示計(jì)算結(jié)果


? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //讀線程
? ? ? ? ? ? Thread thread2 = new Thread(new ThreadStart(Read));
? ? ? ? ? ? thread2.Start();


? ? ? ? ? ? //寫線程
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Thread.Sleep(20);
? ? ? ? ? ? ? ? Thread thread = new Thread(new ThreadStart(Write));
? ? ? ? ? ? ? ? thread.Start();
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? /// <summary>
? ? ? ? /// 實(shí)際運(yùn)算寫操作
? ? ? ? /// </summary>
? ? ? ? private static void Write()
? ? ? ? {
? ? ? ? ? ? Int32 temp = 0;
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? temp += 1;
? ? ? ? ? ? }
? ? ? ? ? ? //真正寫入
? ? ? ? ? ? value += temp;
? ? ? ? ? ? Thread.VolatileWrite(ref count, 1);
? ? ? ? }


? ? ? ? /// <summary>
? ? ? ? /// ?死循環(huán)監(jiān)控讀信息
? ? ? ? /// </summary>
? ? ? ? private static void Read()
? ? ? ? {
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //死循環(huán)監(jiān)聽寫操作線執(zhí)行完畢后立刻顯示操作結(jié)果
? ? ? ? ? ? ? ? if (Thread.VolatileRead(ref count) > 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine("累計(jì)計(jì)數(shù):{1}", Thread.CurrentThread.ManagedThreadId, value);
? ? ? ? ? ? ? ? ? ? count = 0;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
復(fù)制代碼
  輸出如下:


  


三、Volatile關(guān)鍵字
  Volatile關(guān)鍵字的本質(zhì)含義是告訴編譯器,聲明為Volatile關(guān)鍵字的變量或字段都是提供給多個(gè)線程使用的。Volatile無法聲明為局部變量。作為原子性的操作,Volatile關(guān)鍵字具有原子特性,所以線程間無法對(duì)其占有,它的值永遠(yuǎn)是最新的。


  Volatile支持的類型:


引用類型;
指針類型(在不安全的上下文中);
類型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool;
具有以下基類型之一的枚舉類型:byte、sbyte、short、ushort、int 或 uint;
已知為引用類型的泛型類型參數(shù);
IntPtr 和 UIntPtr;
復(fù)制代碼
class Program
? ? {
? ? ? ? static volatile Int32 count;//計(jì)數(shù)值,用于線程同步 (注意原子性,所以本例中使用int32)
? ? ? ? static Int32 value;//實(shí)際運(yùn)算值,用于顯示計(jì)算結(jié)果
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //開辟一個(gè)線程專門負(fù)責(zé)讀value的值,這樣就能看見一個(gè)計(jì)算的過程
? ? ? ? ? ? Thread thread2 = new Thread(new ThreadStart(Read));
? ? ? ? ? ? thread2.Start();
? ? ? ? ? ? //開辟10個(gè)線程來負(fù)責(zé)計(jì)算,每個(gè)線程負(fù)責(zé)1000萬條數(shù)據(jù)
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Thread.Sleep(20);
? ? ? ? ? ? ? ? Thread thread = new Thread(new ThreadStart(Write));
? ? ? ? ? ? ? ? thread.Start();
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? /// <summary>
? ? ? ? /// 實(shí)際運(yùn)算寫操作
? ? ? ? /// </summary>
? ? ? ? private static void Write()
? ? ? ? {
? ? ? ? ? ? Int32 temp = 0;
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? temp += 1;
? ? ? ? ? ? }
? ? ? ? ? ? value += temp;
? ? ? ? ? ? //告訴監(jiān)聽程序,我改變了,讀取最新吧!
? ? ? ? ? ? count = 1;
? ? ? ? }


? ? ? ? /// <summary>
? ? ? ? /// ?死循環(huán)監(jiān)聽
? ? ? ? /// </summary>
? ? ? ? private static void Read()
? ? ? ? {
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (count == 1)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Console.WriteLine("累計(jì)計(jì)數(shù):{1}", Thread.CurrentThread.ManagedThreadId, value);
? ? ? ? ? ? ? ? ? ? count = 0;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
復(fù)制代碼
  輸出:


  


四、lock關(guān)鍵字
  lock的作用在于同一時(shí)間確保一個(gè)對(duì)象只允許一個(gè)線程訪問。


  lock的語法如下:


? ?static object obj = new object();
? ?lock (obj)
? ?{
? ?  //語句塊
? ?}
  我們使用lock來改寫上面的示例:


復(fù)制代碼
? ? class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //初始化10個(gè)線程1去訪問num
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ThreadPool.QueueUserWorkItem(new WaitCallback(Run));
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? static int num = 0;


? ? ? ? static object obj = newobject();


? ? ? ? static void Run(object state)
? ? ? ? {
? ? ? ? ? ? lock (obj)
? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("當(dāng)前數(shù)字:{0}", ++num);
? ? ? ? ? ? }
? ? ? ? }
? ? }
復(fù)制代碼
  輸出如下:




五、Monitor.Enter與Monitor.Exit
  Monitor.Enter和Monitor.Exit這個(gè)東西跟lock的作用一樣。事實(shí)上。lock就是Monitor.Enter和Monitor.Exit的包裝。


  下面用Monitor.Enter與Monitor.Exit來實(shí)現(xiàn)相同的代碼:


復(fù)制代碼
? ? class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? //初始化10個(gè)線程1去訪問num
? ? ? ? ? ? for (int i = 0; i < 10; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ThreadPool.QueueUserWorkItem(new WaitCallback(Run));
? ? ? ? ? ? }
? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? static int num = 0;


? ? ? ? static object obj = new object();


? ? ? ? static void Run(object state)
? ? ? ? {
? ? ? ? ? ? //獲取排他鎖
? ? ? ? Monitor.Enter(obj);


? ? ? ? ? ? Console.WriteLine("當(dāng)前數(shù)字:{0}", ++num);


? ? ? ? ? ? //釋放排它鎖
? ? ? ? Monitor.Exit(obj);
? ? ? ? }
? ? }
復(fù)制代碼
六、Monitor.Wait與Monitor.Pulse
  Wait() 和 Pulse() 機(jī)制用于線程間交互:


Wait() 釋放鎖定資源,進(jìn)入等待狀態(tài)直到被喚醒;
Pulse() 和 PulseAll() 方法用來通知Wait()的線程醒來;
復(fù)制代碼
? ? class Program
? ? {
? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? Thread t1 = new Thread(Run1);
? ? ? ? ? ? Thread t2 = new Thread(Run2);


? ? ? ? ? ? t1.Start();
? ? ? ? ? ? t1.Name = "劉備";


? ? ? ? ? ? t2.Start();
? ? ? ? ? ? t2.Name = "關(guān)羽";


? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? static object obj = new object();


? ? ? ? static void Run1(object state)
? ? ? ? {
? ? ? ? ? ? Monitor.Enter(obj);


? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + ":二弟,你上哪去了?");


? ? ? ? ? ? Monitor.Wait(obj); ? ? ?//暫時(shí)釋放鎖,讓關(guān)羽線程進(jìn)入


? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + ":你混蛋!");
? ? ? ? ? ? ? ??
? ? ? ? ? ? Monitor.Pulse(obj); ? ? //喚醒關(guān)羽線程?


? ? ? ? ? ? Monitor.Exit(obj);
? ? ? ? }


? ? ? ? static void Run2(object state)
? ? ? ? {


? ? ? ? ? ? Monitor.Enter(obj);


? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + ":老子跟曹操了!");


? ? ? ? ? ? Monitor.Pulse(obj); ? ? //喚醒劉備線程
? ? ? ? ? ? Monitor.Wait(obj); ? ? //暫停本線程
? ? ? ? ? ??


? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + ":投降吧,曹孟德當(dāng)世英雄,豎子不足與謀!!");


? ? ? ? ? ? Monitor.Exit(obj);
? ? ? ? }
? ? }
復(fù)制代碼
  輸出如下:  


七、讀寫鎖ReadWriterLock
  寫入串行,讀取并行;


  如果程序中大部分都是讀取數(shù)據(jù)的,那么由于讀并不影響數(shù)據(jù),ReadWriterLock類能夠?qū)崿F(xiàn)”寫入串行“,”讀取并行“。


  常用方法如下:


AcquireWriterLock: 獲取寫入鎖; ReleaseWriterLock:釋放寫入鎖。
AcquireReaderLock: 獲取讀鎖; ReleaseReaderLock:釋放讀鎖。
UpgradeToWriterLock:將讀鎖轉(zhuǎn)為寫鎖;DowngradeFromWriterLock:將寫鎖還原為讀鎖。
復(fù)制代碼
? ?class Program
? ? {
? ? ? ? static List<string> ListStr = new List<string>();
? ? ? ? static ReaderWriterLock rw = new System.Threading.ReaderWriterLock();


? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? Thread t1 = new Thread(Run1);
? ? ? ? ? ? Thread t2 = new Thread(Run2);


? ? ? ? ? ? t1.Start();
? ? ? ? ? ? t1.Name = "劉備";


? ? ? ? ? ? t2.Start();
? ? ? ? ? ? t2.Name = "關(guān)羽";


? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? static object obj = new object();


? ? ? ? static void Run1(object state)
? ? ? ? {
? ? ? ? ? ? //獲取寫鎖2秒
? ? ? ? ? ? rw.AcquireWriterLock(2000);
? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + "正在寫入!");
? ? ? ? ? ? ListStr.Add("曹操混蛋");
? ? ? ? ? ? ListStr.Add("孫權(quán)王八蛋");
? ? ? ? ? ? Thread.Sleep(1200);
? ? ? ? ? ? ListStr.Add("周瑜個(gè)臭小子");
? ? ? ? ? ? rw.ReleaseWriterLock();
? ? ? ? ? ??
? ? ? ? }


? ? ? ? //此方法異常,超時(shí),因?yàn)閷懭霑r(shí)不允許讀(那么不用測也能猜到更加不允許寫咯)
? ? ? ? static void Run2(object state)
? ? ? ? {
? ? ? ? ? ? //獲取讀鎖1秒
? ? ? ? ? ? rw.AcquireReaderLock(1000);
? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + "正在讀取!");
? ? ? ? ? ? foreach (string str in ListStr)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(str);
? ? ? ? ? ? }
? ? ? ? ? ? rw.ReleaseReaderLock();
? ? ? ? }
? ? }
復(fù)制代碼
  異常如下:


  下面是讀取并行的例子:


復(fù)制代碼
? ? class Program
? ? {
? ? ? ? static List<string> ListStr = new List<string>();
? ? ? ? static ReaderWriterLock rw = new System.Threading.ReaderWriterLock();


? ? ? ? static void Main(string[] args)
? ? ? ? {
? ? ? ? ? ? ListStr.Add("貂蟬");
? ? ? ? ? ? ListStr.Add("西施");
? ? ? ? ? ? ListStr.Add("王昭君");
? ? ? ? ? ? Thread t1 = new Thread(Run1);
? ? ? ? ? ? Thread t2 = new Thread(Run2);


? ? ? ? ? ? t1.Start();
? ? ? ? ? ? t1.Name = "劉備";


? ? ? ? ? ? t2.Start();
? ? ? ? ? ? t2.Name = "關(guān)羽";


? ? ? ? ? ? Console.ReadKey();
? ? ? ? }


? ? ? ? static object obj = new object();


? ? ? ? static void Run1(object state)
? ? ? ? {
? ? ? ? ? ? //獲取寫鎖2秒
? ? ? ? ? ? rw.AcquireReaderLock(2000);
? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + "正在讀取!");
? ? ? ? ? ? foreach (string str in ListStr)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + "在讀:" + str);
? ? ? ? ? ? }
? ? ? ? ? ? rw.ReleaseReaderLock();
? ? ? ? ? ??
? ? ? ? }


? ? ? ? //此方法異常,超時(shí),因?yàn)閷懭霑r(shí)不允許讀(那么不用測也能猜到更加不允許寫咯)
? ? ? ? static void Run2(object state)
? ? ? ? {
? ? ? ? ? ? //獲取讀鎖1秒
? ? ? ? ? ? rw.AcquireReaderLock(1000);
? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + "正在讀取!");
? ? ? ? ? ? foreach (string str in ListStr)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine(Thread.CurrentThread.Name + "在讀:" + str);
? ? ? ? ? ? }
? ? ? ? ? ? rw.ReleaseReaderLock();
? ? ? ? }
? ? }
復(fù)制代碼
  輸出如下:

  總結(jié):寫入鎖與任何鎖都不兼容,讀取鎖與讀取鎖可以兼容。
======== 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

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

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