進(jìn)程中的虛存管理與任務(wù)調度
保護模式下的分段分頁(yè)機制解決了地址映射與轉換方面的事情,完成了“轉換地址,從邏輯到線(xiàn)性,從線(xiàn)性到物理”,“形成線(xiàn)性任務(wù)空間”這樣的諸如此類(lèi)的任務(wù),這就是說(shuō),它完成的是建造一個(gè)個(gè)“隔離了的任務(wù)空間”的任務(wù),然而(這主要指CPU的功能和策略), 并沒(méi)有上升到完成負責建造具體任務(wù)的事的層次.因為此時(shí)我們還沒(méi)有談到任務(wù),還沒(méi)有談到任何關(guān)于它在軟件上的意義(任務(wù)是OS的概念,而OS代表軟件平臺).比如,什么是任務(wù)空間,以及任務(wù)怎么樣利用這些隔離了的空間。
也即,線(xiàn)性空間并非指任務(wù)空間,而是指CPU的一種機制,它使保護模式下的可用空間達到4g(CPU在保護模式的引導下,可以看到4g的內存,為形成一個(gè)soft pc成為可能),——- 只不過(guò)是索引的4g .而具體的內存分配與管理與“形成進(jìn)程空間”,其實(shí)是另外一回事.(這些必須要在腦海里明白)
呆會(huì )我們將會(huì )看到它們是在OS中完成的,這一切,就是操作系統技術(shù)中的進(jìn)程技術(shù)要解決的事情。并實(shí)現在OS kernel中。
進(jìn)程實(shí)現在os kernel中。是支持OS作為軟件上的機器的意義首先要解決的事。即虛擬硬件為軟件上可用的東西。
這可以從虛擬硬件執行環(huán)境中的內存和寄存器開(kāi)始。本書(shū)正是按這個(gè)順序來(lái)講解整個(gè)OS原理的。
由于保護模式的CPU已經(jīng)支持受保護了的任務(wù)空間和跳轉機制了,所以這并不同于普通的會(huì )編環(huán)境中的硬件執行環(huán)境,如果在其上展開(kāi)會(huì )編,將會(huì )是一種高級的會(huì )編。
進(jìn)程是一套實(shí)現操作系統任務(wù),多任務(wù)的軟件技術(shù)的統稱(chēng)。簡(jiǎn)言之,任務(wù)是一種使代表soft machine意義的os kernel首先完成的visual machine的整套機制。其形態(tài)有普通進(jìn)程和線(xiàn)程二種。
首先,對于任務(wù),在硬件級是分段分頁(yè)機制和門(mén)的跳轉保護機制,在os core級,可以封裝它們,最終表現出一個(gè)個(gè)“隔離了的線(xiàn)性任務(wù)空間”和受保護的代碼執行環(huán)境和IO環(huán)境。。
進(jìn)程和線(xiàn)程作為任務(wù),模擬了內存和CPU時(shí)間這二者(沒(méi)有CPU或沒(méi)有內存都不足于構成一個(gè)軟件的任務(wù),線(xiàn)程要偏向于CPU時(shí)間一點(diǎn)),是人們分裂一臺計算機的處理能力,為多臺計算機的手段.,故稱(chēng)VM。進(jìn)程“使一個(gè)程序獨享內存1
這里有必要再次提到4g空間作為線(xiàn)性空間與任務(wù)空間的區別,前者主要是指CPU的機制,這里是指進(jìn)程的機制(而進(jìn)程已經(jīng)有軟件的意義了),4G的虛存空間只是映射,這里有alu和mmu的作用(即頁(yè)式內存管理),如果可以,還可以加上段式的作用,其實(shí),進(jìn)程空間是不存在的,更真正的稱(chēng)法是“進(jìn)程空間”,它是個(gè)概念上的映射,故內核內間,用戶(hù)空間,只是4G的“進(jìn)程空間”(這里稱(chēng)為進(jìn)程空間似乎不妥,任務(wù)空間,應稱(chēng)為工作空間,“可供映射空間”)
將進(jìn)程空間分為系統空間與用戶(hù)空間,它主要是強調:CPU從系統空間進(jìn)入用戶(hù)空間(此時(shí),CPU正在一個(gè)受限的局域活動(dòng))時(shí)易,用戶(hù)空間進(jìn)入系統空間時(shí)(此時(shí),CPU可執行作何特權指令)難,必須要通過(guò)OS提供的自陷或中斷,方可進(jìn)入os kernel,進(jìn)入OS kernel所在代碼(在那里,可以執行特權代碼,os kernel本身就是優(yōu)于用戶(hù)進(jìn)程代碼的特權代碼)
先映射系統所在頁(yè)面(通過(guò)內存管理作用),這些頁(yè)面和這個(gè)概念上的空間是不被置換的,用戶(hù)空間會(huì )被進(jìn)程切換刷新其(對于物理頁(yè)面的)映射。
進(jìn)程使計算機成為vm,它有自己的寄存器環(huán)境(這絕不僅僅是一句空話(huà),這句話(huà)是指,計算機成為一臺VM,所有VM共享PC整個(gè)執行硬件,以它為基礎形成保護模式,并形成任務(wù))和內存(用線(xiàn)性空間成就的任務(wù)空間)
進(jìn)程不光有一套自己的虛存空間,也有自己的一套reg環(huán)境,這里涉及到大量的保護模式下的段式轉換等知識,需要講解
前提是,我們是在一個(gè)4G里討論問(wèn)題。有一個(gè)正統的稱(chēng)法叫線(xiàn)性空間 這里介紹一下堆棧機,內核棧,用戶(hù)棧,
進(jìn)程調度不僅是為了多任務(wù)而準備的,單任務(wù)內部也需要調度。這就是門(mén)所規范的任務(wù)代碼跳轉機制。
程序能不能訪(fǎng)問(wèn)硬件,這要視開(kāi)發(fā)該程序所有的語(yǔ)言和程序運行的環(huán)境而定,相比高級語(yǔ)言,會(huì )編是可以控制計算機做任何事情的語(yǔ)言,可是假如計算機booting,init進(jìn)入os,比如windows或linux,那么該程序可能導致錯誤(而它可能在DOS這樣的環(huán)境下或者沒(méi)有DOS的環(huán)境下就不會(huì ))
比如,多任務(wù)環(huán)境下,這么多程序共用一套寄存器,硬件資源是它們的公用設施,這會(huì )不會(huì )造成寄存器混亂呢,不會(huì ),因為每個(gè)程序的進(jìn)程都可以為它們保存副本(每個(gè)進(jìn)程都是四GB,有自己的內核棧).而進(jìn)程調度,即那些保證進(jìn)程對硬件資源訪(fǎng)問(wèn)的邏輯,是由系統核心來(lái)保障的.
內核中的進(jìn)程
內核管理進(jìn)程,進(jìn)程管理線(xiàn)程,線(xiàn)程是時(shí)間單位的一個(gè)函數(由進(jìn)程調度來(lái)協(xié)調產(chǎn)生或同步) 內核線(xiàn)程不可中斷,內核所在頁(yè)面也不可置換
用戶(hù)線(xiàn)程與內核線(xiàn)程是二個(gè)不一樣的東西,如果用戶(hù)進(jìn)程用了內核線(xiàn)程,那么它就是內核線(xiàn)程,反之,如果一個(gè)用戶(hù)進(jìn)程的實(shí)現,沒(méi)有用到任何內核線(xiàn)程的支持,那么,它就是posix兼容的用戶(hù)線(xiàn)程.
虛存管理與調度
虛擬內存不僅指頁(yè)面文件(不是每個(gè)系統都有MMU單元),它其實(shí)是一個(gè)很大的基礎概念,是PC分解它自身只有一個(gè)CPU和主存而產(chǎn)生的“虛擬化CPU時(shí)間”,和“虛擬化主存空間”的二者之一,它作為底層服務(wù)于caching,mm,內存保護,等上層建筑.(是典型的C/S結構,所以,在OS的設計中,windows大量采用管理器之類(lèi)的概念,而這,也導致了微內核的產(chǎn)生),理解虛擬內存的關(guān)鍵是理解“存儲器抽象”和“mm”這二種概念實(shí)際上是一上一下的二大抽象體系.即解決硬件抽象層的問(wèn)題,和關(guān)于任務(wù)中對于內存,的初級系統邏輯.
其次,軟件平臺要作為一個(gè)能運行多任務(wù)的soft vm,進(jìn)程就需要被調度,故是實(shí)現多任務(wù)(此時(shí)不能說(shuō)成多進(jìn)程2,多線(xiàn)程什么的)的基礎.它首先完成任務(wù)調度(此時(shí)它并不一定跟多線(xiàn)程多進(jìn)程同時(shí)運行有關(guān)3,大凡內核,總要處理任務(wù)間的切換,對CPU,IO的使用,此時(shí),就需要調度),再完成并發(fā)調度(基于調度的并發(fā)),線(xiàn)程原來(lái)也叫進(jìn)程.調度是OS的靈魂,它是將“一個(gè)CPU”以“進(jìn)程”為單位分成“多個(gè)CPU”的手段(是一種時(shí)間上的劃分,由定時(shí)設備發(fā)出有規則劃分的信號).
因為進(jìn)程環(huán)境由虛存空間和寄存環(huán)境CPU(它們代表一臺進(jìn)程VM的時(shí)間和空間二方面)組成,因此OS要在內核實(shí)現中提供對它們的管理。
在OS級,CPU與內存如何發(fā)生聯(lián)系被稱(chēng)為CPU的存儲管理機制 – 這個(gè)存儲,專(zhuān)指主存,頁(yè)如何被實(shí)際分配,并形成一個(gè)進(jìn)程空間.即,就是“進(jìn)程地址空間的形成”, 這才是指OS的事。
就是“具體的內存分配與管理”,即頁(yè)式內存分配邏輯(這主要指CPU對內存的策略),這二者都是存諸管理機的二個(gè)階段.
進(jìn)程管理和調度實(shí)際上是os kenerl的應用層,進(jìn)程間通信,才是進(jìn)程管理的server,進(jìn)程管理使用它。進(jìn)程通信是os kernel中的kernel,進(jìn)程管理是os kernel中的application,因此微內核主張,只有進(jìn)程通信才配進(jìn)入os kenel,其它如進(jìn)程管理,使用到進(jìn)程通信的還有文件系統,設備驅動(dòng)等,這些,應做到os kernel的下一層次,比如進(jìn)程的非os kenerl的非kernel層次。
進(jìn)程是OS Kernel的,它維護一個(gè)就緒表和一個(gè)關(guān)于進(jìn)程的條件隊列,在有了系統的原生并發(fā)的支持下,在應用程序層,編程可以通過(guò)共享存儲器或消息傳遞機制實(shí)現某種并發(fā), 對于共享存儲,大約可以分為忙等待和基于調度的方式,又可與“互斥機制”和“條件同步”組合分類(lèi),,于是有四種并發(fā)機制.
從這里開(kāi)始,出現了關(guān)于進(jìn)程的很多很多子問(wèn)題. 比如進(jìn)程的用戶(hù) 進(jìn)程的IO位圖 進(jìn)程上下文 任務(wù)狀態(tài).任務(wù)切換.優(yōu)先級 內核同步 內存映射和mmap(),malloc() – malloc的背后是一個(gè)內存沲,是由C運行時(shí)提供的,都會(huì )擴展一個(gè)進(jìn)程的線(xiàn)性空間,,這些屬于存儲管理的內容,而不是進(jìn)程及進(jìn)程調度的.
伙伴系統,是動(dòng)態(tài)內存的手段,還有一個(gè)slab,,是關(guān)于對內核數據結構的內存分配的..
解決了這二個(gè)問(wèn)題,即解決了任務(wù)問(wèn)題,然后是解決外部子組件
這些問(wèn)題跟任務(wù)機制也有交集,這產(chǎn)生了其它問(wèn)題內核同步進(jìn)程的IO位圖,等等,
在內核中的每一大小問(wèn)題的解決,都有其相似性(就跟解決任務(wù)問(wèn)題中所看到的那樣),比如,用相關(guān)的數據結構表示和算法支持,有相關(guān)的系統
前面分別介紹了os kernel和進(jìn)程(由于cpu和進(jìn)程間的聯(lián)系),但沒(méi)有介紹二者之間的關(guān)系,進(jìn)程管理是OS kenel對進(jìn)程的作用,進(jìn)程間通信是必要的,它需要“進(jìn)程間同步”機制,以保證通信的正?;?有一種是報文小消息的傳遞),進(jìn)程間同步也是進(jìn)程間通信,但它又是低級的進(jìn)程間通信,因此一般把它跟進(jìn)程間通信分開(kāi)來(lái)說(shuō)。
首先,一個(gè)現代的OS必定是需要支持多任務(wù)的,對多任務(wù)的管理,被實(shí)現在OS內核中。
在單CPU上采取多線(xiàn)程策略的情況下,不會(huì )提高程序的真實(shí)速度,因為CPU只是采取時(shí)間片輪分的方法.但是可以得到“界面高速反應”這樣的效果,這跟提不提高速度,是二回事并不矛盾.
計算機運行并完全計算的基本單位是靠一個(gè)個(gè)的“進(jìn)程”來(lái)組織的,由是多任務(wù)要么是多進(jìn)程,要么是多線(xiàn)程。
線(xiàn)程可以是進(jìn)程,比如輕量級進(jìn)程,這樣多線(xiàn)程的本質(zhì)還是多進(jìn)程,當線(xiàn)程不再是進(jìn)程時(shí),問(wèn)題會(huì )變成另外一個(gè)形式,此時(shí),存在著(zhù)二種任務(wù),即進(jìn)程任務(wù),和線(xiàn)程任務(wù),線(xiàn)程任務(wù)只需要CPU時(shí)間,而沒(méi)有虛存空間。
典型的用戶(hù)層線(xiàn)程是用協(xié)程建立起來(lái)的
解決了如何表示多任務(wù)的問(wèn)題之后,下一步就是解決如何同步它們了。
于是多進(jìn)程就有內存間互不干擾的假像,但實(shí)際上他們正是靠正面協(xié)作來(lái)達到這個(gè)假像的,線(xiàn)程的真正意義是“使一份執行流(程序的一部分)”獨享CPU.當然,于是多線(xiàn)程就有了多CPU的假像,這二者都是模擬的.
并發(fā)問(wèn)題源于圖靈模型與需要開(kāi)發(fā)處理的現實(shí)問(wèn)題之間的矛盾,圖靈模式是控制主導數據(機器的底層問(wèn)題都是IO問(wèn)題),這使得這種IO動(dòng)作必須被協(xié)調.又因為用于開(kāi)發(fā)系統的語(yǔ)言一般是C語(yǔ)言,C語(yǔ)言本身并非某種并發(fā)和線(xiàn)程安全語(yǔ)言,所以必須在內核層提供一套同步機制.
解決多線(xiàn)程的問(wèn)題是多解的,,源于解決方法的高層模式各有不同4,有不同的相關(guān)概念,,比如鎖,,,就不需要用到信號量.
不要把線(xiàn)程想像為:它是進(jìn)程依賴(lài)的,其實(shí),它跟任何一個(gè)進(jìn)程一樣,是直接面向整個(gè)VM和運行環(huán)境的,只有VM才負責為它可供訪(fǎng)問(wèn)的資源和這種提供同步機制.進(jìn)程不能. 線(xiàn)程首先是作為OS的任務(wù)機制,應首先討論它的這層意義,再討論它用于并發(fā)的那些意義。即線(xiàn)程先是任務(wù)里面的概念,然后才是并發(fā)里面的概念。
多線(xiàn)程中的quene,用設置一個(gè)“單行道”的方式來(lái)避免并發(fā)帶來(lái)的矛盾. 阻塞式同步,也就是基于調度的并發(fā),,跟基于忙等待和鎖的并發(fā)(蠻干算法)對應..
多CPU要協(xié)調好共享資源的處理,多線(xiàn)程也要做一樣的同步工作(雖然它也可以完全不做).
在順序語(yǔ)言里,一般用共享存儲(就是用某個(gè)存儲在公共區的值作為條件,判斷通過(guò)就不用再等待)或消息傳遞的方式進(jìn)行線(xiàn)程間的通信(最終是希望得到某種同步和要達到的并行性能的折中,即不能同步過(guò)度,必要的同步)
多進(jìn)程需要被調度,多線(xiàn)程也一樣,要注意三個(gè)東西,
參與并發(fā)的各個(gè)主體,線(xiàn)程,或進(jìn)程, 并發(fā)的數據結構,比如鎖,互斥體,等, 調度機制與調度條件.
可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于調度的同步,線(xiàn)程間自愿讓出CPU)完成.記住這個(gè)說(shuō)法,被阻塞是為了同步,阻塞不是出了問(wèn)題,只有發(fā)生deadlock的時(shí)候,才是出了問(wèn)題.互斥是為了同步,是同步的一種機制,跟同步不是矛盾的概念(同步是為了解決多進(jìn)程不同步問(wèn)題的大概念大方向,互斥只是一種同步機制和解決問(wèn)題的方法之一). (自愿阻塞的調度方式下)阻塞可能是一個(gè)線(xiàn)程自動(dòng)讓出同步數據結構,比如鎖(比如在這個(gè)線(xiàn)程中調用了sleep,或input等待輸入),而此時(shí),它還在運行(沒(méi)被終止,甚至沒(méi)被中止),一個(gè)進(jìn)程被陰塞時(shí)不是指它沒(méi)被運行(它只是因自愿或某種調度被迫而放棄了同步設施而掛起,掛起的意思僅指它不再受到并發(fā)保護的影響,其實(shí),因等待輸入等條件引起的掛起是很自然的原因),只是指它不受到并發(fā)的保護,只要有機會(huì ),它可以由別的進(jìn)程喚醒(因調度獲得同步設施),
正在運行的線(xiàn)程可能是前一秒運行過(guò),現在(測試時(shí))發(fā)現剛剛就被阻塞了的線(xiàn)程
什么是阻塞,阻塞即線(xiàn)程因得不到而等待資源的過(guò)程.是OS的調度里面的概念 阻塞就是以線(xiàn)程為單位獨占用CPU時(shí)間引用的事情(sleep函數就是根據這個(gè)原理來(lái)的,此時(shí)它要等到時(shí)間過(guò)了這個(gè)事件被發(fā)生,才會(huì )停止sleep),比如一個(gè)read()線(xiàn)程在程序中等待輸入,而這個(gè)輸入因為網(wǎng)絡(luò )遲沒(méi)有及時(shí)到達,這個(gè)線(xiàn)程就一直占用著(zhù)CPU時(shí)間(因為線(xiàn)程所處在的系統,本質(zhì)上只有一個(gè)CPU),使得其它線(xiàn)程也一并被卡掉(比如界面上一個(gè)關(guān)閉按鈕無(wú)法響應使用戶(hù)認為這個(gè)程序死了).
阻塞,怎么會(huì )跟線(xiàn)程有關(guān)呢?因為有 鎖機制在做怪,它在協(xié)調活動(dòng)的線(xiàn)程.如果沒(méi)有用線(xiàn)程實(shí)現的并發(fā)(此種并發(fā)在單CPU上并非為了加速,而是為了分流協(xié)調),就不需要用到鎖,因此,就不需要靠阻塞一方的方式來(lái)協(xié)調.因此,在獲得鎖方面,就有主動(dòng)獲得鎖和主動(dòng)讓步鎖的情形存在.
信號量,事件,旗語(yǔ),都是用于進(jìn)程間同步和通信的設施(在用c實(shí)現的windows,這些東西都被稱(chēng)為對象,實(shí)際上,是一系列結構和函數的統稱(chēng))。進(jìn)程間會(huì )在彼此的空間里交互這些對象,以實(shí)現同步和通信。比如互斥量,它鎖定了共享資源,得到互斥量的當前進(jìn)程除非釋放它,否則另外的進(jìn)程不能獲得它,進(jìn)而獲得對共享資源的訪(fǎng)問(wèn).
OS對于解決多任務(wù)和解決多任務(wù)之間的同步是一前一后的。并發(fā)問(wèn)題是隨著(zhù)計算機制造和計算機軟件系統制造而產(chǎn)生的那類(lèi)問(wèn)題(為了分時(shí)就必須協(xié)調同步),所以,它產(chǎn)生了一整個(gè)系統編程的流派
所謂同步,其實(shí)并不是什么大不了的概念,它不過(guò)就是解決可能會(huì )出現“不同步,影響通信”的諸多矛盾的一切手段的統稱(chēng),在OS中,這些手段就表現為軟件上的抽象,被實(shí)現在OS kernel中。
既然馮氏機本來(lái)就是一臺順序確定執行指令的機器,為什么要搞得那么復雜呢?這是因為人們需要更復雜的東西(而軟件級可以通過(guò)擴展硬件做到),那又為什么在提供了并發(fā)之后,還會(huì )涉及到同步問(wèn)題呢? ,這是因為簡(jiǎn)單的事情弄復雜了,就肯定要付出相關(guān)的代價(jià),比如同步(有了多線(xiàn)程就要同步),這就跟說(shuō)謊一樣,需要謊謊相圓。
在代碼中,可以將代碼的一塊用一個(gè)線(xiàn)程包裝起來(lái),這樣,它就擁有一個(gè)自己的“CPU“,比如,程序有一個(gè)GUI界面,它有一個(gè)背后邏輯,在界面上又要響應用戶(hù)輸入,實(shí)際上,多線(xiàn)程的一個(gè)實(shí)用之處就是使這樣的界面更反應靈敏一點(diǎn). 并發(fā)并不是什么新鮮的事
在操作系統和應用程序的邏輯中都會(huì )涉及到并發(fā)邏輯(特別是數據庫系統中),并發(fā)邏輯可以多線(xiàn)程也可多進(jìn)程,甚至多線(xiàn)程多進(jìn)程的方式進(jìn)行,當然,單核環(huán)境下的并發(fā)永遠是一種對并發(fā)的模擬機制.
當然,有時(shí)你用的語(yǔ)言提供了并發(fā)的支持,,而且有時(shí)候,操作系統的并發(fā)邏輯會(huì )影響到你選用一種更有效的相容于操作系統的并發(fā)模型
并發(fā)5首先發(fā)生的大背景是PC6,假設我們是對單處理器的PC編程,因此每個(gè)時(shí)刻,都只有一個(gè)活動(dòng)執行上文行存在(CPU在任何時(shí)候,當前只有一個(gè)活動(dòng)的執行路徑-肯定是某個(gè)進(jìn)程7,在被CPU執行并處在這個(gè)執行路徑中,Windows可以允許多用戶(hù)多進(jìn)程,但是因為所謂多進(jìn)程,其實(shí)正是CPU輪流給每個(gè)進(jìn)程分配了CPU時(shí)間所以在單CPU的環(huán)境下,不真正存在多任務(wù),多進(jìn)程和多線(xiàn)程都不能真正給程序提速,它只能達到一種“分流”的效果,使得界面響應快捷(這主要依賴(lài)調度,它能迅速地把不需要CPU時(shí)間的當前線(xiàn)程 – 比如一個(gè)等待用戶(hù)輸入的線(xiàn)程,阻塞掉,復活另外一個(gè)需要CPU時(shí)間的線(xiàn)程,然后調度再在其中監視新情況的出現并不斷地作此類(lèi)分流性質(zhì)的調度,以使不需要CPU時(shí)間的線(xiàn)程讓步CPU時(shí)間給需要CPU的線(xiàn)程 – 可見(jiàn),并發(fā)并不是什么高高在上的東西,而是隨著(zhù)可見(jiàn)的那一類(lèi)問(wèn)題的需求而出現的,當然,這需要為每個(gè)工作流設置一個(gè)控制,即一個(gè)“控制線(xiàn)程”,thread of control=thread,而這,正是并發(fā)要被提出和它要解決的問(wèn)題),或其它一些效果.
保護模式下的分段分頁(yè)機制解決了地址映射與轉換方面的事情,完成了“轉換地址,從邏輯到線(xiàn)性,從線(xiàn)性到物理”,“形成線(xiàn)性任務(wù)空間”這樣的諸如此類(lèi)的任務(wù),這就是說(shuō),它完成的是建造一個(gè)個(gè)“隔離了的任務(wù)空間”的任務(wù),然而(這主要指CPU的功能和策略), 并沒(méi)有上升到完成負責建造具體任務(wù)的事的層次.因為此時(shí)我們還沒(méi)有談到任務(wù),還沒(méi)有談到任何關(guān)于它在軟件上的意義(任務(wù)是OS的概念,而OS代表軟件平臺).比如,什么是任務(wù)空間,以及任務(wù)怎么樣利用這些隔離了的空間。
也即,線(xiàn)性空間并非指任務(wù)空間,而是指CPU的一種機制,它使保護模式下的可用空間達到4g(CPU在保護模式的引導下,可以看到4g的內存,為形成一個(gè)soft pc成為可能),——- 只不過(guò)是索引的4g .而具體的內存分配與管理與“形成進(jìn)程空間”,其實(shí)是另外一回事.(這些必須要在腦海里明白)
呆會(huì )我們將會(huì )看到它們是在OS中完成的,這一切,就是操作系統技術(shù)中的進(jìn)程技術(shù)要解決的事情。并實(shí)現在OS kernel中。
進(jìn)程實(shí)現在os kernel中。是支持OS作為軟件上的機器的意義首先要解決的事。即虛擬硬件為軟件上可用的東西。
這可以從虛擬硬件執行環(huán)境中的內存和寄存器開(kāi)始。本書(shū)正是按這個(gè)順序來(lái)講解整個(gè)OS原理的。
由于保護模式的CPU已經(jīng)支持受保護了的任務(wù)空間和跳轉機制了,所以這并不同于普通的會(huì )編環(huán)境中的硬件執行環(huán)境,如果在其上展開(kāi)會(huì )編,將會(huì )是一種高級的會(huì )編。
進(jìn)程是一套實(shí)現操作系統任務(wù),多任務(wù)的軟件技術(shù)的統稱(chēng)。簡(jiǎn)言之,任務(wù)是一種使代表soft machine意義的os kernel首先完成的visual machine的整套機制。其形態(tài)有普通進(jìn)程和線(xiàn)程二種。
首先,對于任務(wù),在硬件級是分段分頁(yè)機制和門(mén)的跳轉保護機制,在os core級,可以封裝它們,最終表現出一個(gè)個(gè)“隔離了的線(xiàn)性任務(wù)空間”和受保護的代碼執行環(huán)境和IO環(huán)境。。
進(jìn)程和線(xiàn)程作為任務(wù),模擬了內存和CPU時(shí)間這二者(沒(méi)有CPU或沒(méi)有內存都不足于構成一個(gè)軟件的任務(wù),線(xiàn)程要偏向于CPU時(shí)間一點(diǎn)),是人們分裂一臺計算機的處理能力,為多臺計算機的手段.,故稱(chēng)VM。進(jìn)程“使一個(gè)程序獨享內存1
這里有必要再次提到4g空間作為線(xiàn)性空間與任務(wù)空間的區別,前者主要是指CPU的機制,這里是指進(jìn)程的機制(而進(jìn)程已經(jīng)有軟件的意義了),4G的虛存空間只是映射,這里有alu和mmu的作用(即頁(yè)式內存管理),如果可以,還可以加上段式的作用,其實(shí),進(jìn)程空間是不存在的,更真正的稱(chēng)法是“進(jìn)程空間”,它是個(gè)概念上的映射,故內核內間,用戶(hù)空間,只是4G的“進(jìn)程空間”(這里稱(chēng)為進(jìn)程空間似乎不妥,任務(wù)空間,應稱(chēng)為工作空間,“可供映射空間”)
將進(jìn)程空間分為系統空間與用戶(hù)空間,它主要是強調:CPU從系統空間進(jìn)入用戶(hù)空間(此時(shí),CPU正在一個(gè)受限的局域活動(dòng))時(shí)易,用戶(hù)空間進(jìn)入系統空間時(shí)(此時(shí),CPU可執行作何特權指令)難,必須要通過(guò)OS提供的自陷或中斷,方可進(jìn)入os kernel,進(jìn)入OS kernel所在代碼(在那里,可以執行特權代碼,os kernel本身就是優(yōu)于用戶(hù)進(jìn)程代碼的特權代碼)
先映射系統所在頁(yè)面(通過(guò)內存管理作用),這些頁(yè)面和這個(gè)概念上的空間是不被置換的,用戶(hù)空間會(huì )被進(jìn)程切換刷新其(對于物理頁(yè)面的)映射。
進(jìn)程使計算機成為vm,它有自己的寄存器環(huán)境(這絕不僅僅是一句空話(huà),這句話(huà)是指,計算機成為一臺VM,所有VM共享PC整個(gè)執行硬件,以它為基礎形成保護模式,并形成任務(wù))和內存(用線(xiàn)性空間成就的任務(wù)空間)
進(jìn)程不光有一套自己的虛存空間,也有自己的一套reg環(huán)境,這里涉及到大量的保護模式下的段式轉換等知識,需要講解
前提是,我們是在一個(gè)4G里討論問(wèn)題。有一個(gè)正統的稱(chēng)法叫線(xiàn)性空間 這里介紹一下堆棧機,內核棧,用戶(hù)棧,
進(jìn)程調度不僅是為了多任務(wù)而準備的,單任務(wù)內部也需要調度。這就是門(mén)所規范的任務(wù)代碼跳轉機制。
程序能不能訪(fǎng)問(wèn)硬件,這要視開(kāi)發(fā)該程序所有的語(yǔ)言和程序運行的環(huán)境而定,相比高級語(yǔ)言,會(huì )編是可以控制計算機做任何事情的語(yǔ)言,可是假如計算機booting,init進(jìn)入os,比如windows或linux,那么該程序可能導致錯誤(而它可能在DOS這樣的環(huán)境下或者沒(méi)有DOS的環(huán)境下就不會(huì ))
比如,多任務(wù)環(huán)境下,這么多程序共用一套寄存器,硬件資源是它們的公用設施,這會(huì )不會(huì )造成寄存器混亂呢,不會(huì ),因為每個(gè)程序的進(jìn)程都可以為它們保存副本(每個(gè)進(jìn)程都是四GB,有自己的內核棧).而進(jìn)程調度,即那些保證進(jìn)程對硬件資源訪(fǎng)問(wèn)的邏輯,是由系統核心來(lái)保障的.
內核中的進(jìn)程
內核管理進(jìn)程,進(jìn)程管理線(xiàn)程,線(xiàn)程是時(shí)間單位的一個(gè)函數(由進(jìn)程調度來(lái)協(xié)調產(chǎn)生或同步) 內核線(xiàn)程不可中斷,內核所在頁(yè)面也不可置換
用戶(hù)線(xiàn)程與內核線(xiàn)程是二個(gè)不一樣的東西,如果用戶(hù)進(jìn)程用了內核線(xiàn)程,那么它就是內核線(xiàn)程,反之,如果一個(gè)用戶(hù)進(jìn)程的實(shí)現,沒(méi)有用到任何內核線(xiàn)程的支持,那么,它就是posix兼容的用戶(hù)線(xiàn)程.
虛存管理與調度
虛擬內存不僅指頁(yè)面文件(不是每個(gè)系統都有MMU單元),它其實(shí)是一個(gè)很大的基礎概念,是PC分解它自身只有一個(gè)CPU和主存而產(chǎn)生的“虛擬化CPU時(shí)間”,和“虛擬化主存空間”的二者之一,它作為底層服務(wù)于caching,mm,內存保護,等上層建筑.(是典型的C/S結構,所以,在OS的設計中,windows大量采用管理器之類(lèi)的概念,而這,也導致了微內核的產(chǎn)生),理解虛擬內存的關(guān)鍵是理解“存儲器抽象”和“mm”這二種概念實(shí)際上是一上一下的二大抽象體系.即解決硬件抽象層的問(wèn)題,和關(guān)于任務(wù)中對于內存,的初級系統邏輯.
其次,軟件平臺要作為一個(gè)能運行多任務(wù)的soft vm,進(jìn)程就需要被調度,故是實(shí)現多任務(wù)(此時(shí)不能說(shuō)成多進(jìn)程2,多線(xiàn)程什么的)的基礎.它首先完成任務(wù)調度(此時(shí)它并不一定跟多線(xiàn)程多進(jìn)程同時(shí)運行有關(guān)3,大凡內核,總要處理任務(wù)間的切換,對CPU,IO的使用,此時(shí),就需要調度),再完成并發(fā)調度(基于調度的并發(fā)),線(xiàn)程原來(lái)也叫進(jìn)程.調度是OS的靈魂,它是將“一個(gè)CPU”以“進(jìn)程”為單位分成“多個(gè)CPU”的手段(是一種時(shí)間上的劃分,由定時(shí)設備發(fā)出有規則劃分的信號).
因為進(jìn)程環(huán)境由虛存空間和寄存環(huán)境CPU(它們代表一臺進(jìn)程VM的時(shí)間和空間二方面)組成,因此OS要在內核實(shí)現中提供對它們的管理。
在OS級,CPU與內存如何發(fā)生聯(lián)系被稱(chēng)為CPU的存儲管理機制 – 這個(gè)存儲,專(zhuān)指主存,頁(yè)如何被實(shí)際分配,并形成一個(gè)進(jìn)程空間.即,就是“進(jìn)程地址空間的形成”, 這才是指OS的事。
就是“具體的內存分配與管理”,即頁(yè)式內存分配邏輯(這主要指CPU對內存的策略),這二者都是存諸管理機的二個(gè)階段.
進(jìn)程管理和調度實(shí)際上是os kenerl的應用層,進(jìn)程間通信,才是進(jìn)程管理的server,進(jìn)程管理使用它。進(jìn)程通信是os kernel中的kernel,進(jìn)程管理是os kernel中的application,因此微內核主張,只有進(jìn)程通信才配進(jìn)入os kenel,其它如進(jìn)程管理,使用到進(jìn)程通信的還有文件系統,設備驅動(dòng)等,這些,應做到os kernel的下一層次,比如進(jìn)程的非os kenerl的非kernel層次。
進(jìn)程是OS Kernel的,它維護一個(gè)就緒表和一個(gè)關(guān)于進(jìn)程的條件隊列,在有了系統的原生并發(fā)的支持下,在應用程序層,編程可以通過(guò)共享存儲器或消息傳遞機制實(shí)現某種并發(fā), 對于共享存儲,大約可以分為忙等待和基于調度的方式,又可與“互斥機制”和“條件同步”組合分類(lèi),,于是有四種并發(fā)機制.
從這里開(kāi)始,出現了關(guān)于進(jìn)程的很多很多子問(wèn)題. 比如進(jìn)程的用戶(hù) 進(jìn)程的IO位圖 進(jìn)程上下文 任務(wù)狀態(tài).任務(wù)切換.優(yōu)先級 內核同步 內存映射和mmap(),malloc() – malloc的背后是一個(gè)內存沲,是由C運行時(shí)提供的,都會(huì )擴展一個(gè)進(jìn)程的線(xiàn)性空間,,這些屬于存儲管理的內容,而不是進(jìn)程及進(jìn)程調度的.
伙伴系統,是動(dòng)態(tài)內存的手段,還有一個(gè)slab,,是關(guān)于對內核數據結構的內存分配的..
解決了這二個(gè)問(wèn)題,即解決了任務(wù)問(wèn)題,然后是解決外部子組件
這些問(wèn)題跟任務(wù)機制也有交集,這產(chǎn)生了其它問(wèn)題內核同步進(jìn)程的IO位圖,等等,
在內核中的每一大小問(wèn)題的解決,都有其相似性(就跟解決任務(wù)問(wèn)題中所看到的那樣),比如,用相關(guān)的數據結構表示和算法支持,有相關(guān)的系統
前面分別介紹了os kernel和進(jìn)程(由于cpu和進(jìn)程間的聯(lián)系),但沒(méi)有介紹二者之間的關(guān)系,進(jìn)程管理是OS kenel對進(jìn)程的作用,進(jìn)程間通信是必要的,它需要“進(jìn)程間同步”機制,以保證通信的正?;?有一種是報文小消息的傳遞),進(jìn)程間同步也是進(jìn)程間通信,但它又是低級的進(jìn)程間通信,因此一般把它跟進(jìn)程間通信分開(kāi)來(lái)說(shuō)。
首先,一個(gè)現代的OS必定是需要支持多任務(wù)的,對多任務(wù)的管理,被實(shí)現在OS內核中。
在單CPU上采取多線(xiàn)程策略的情況下,不會(huì )提高程序的真實(shí)速度,因為CPU只是采取時(shí)間片輪分的方法.但是可以得到“界面高速反應”這樣的效果,這跟提不提高速度,是二回事并不矛盾.
計算機運行并完全計算的基本單位是靠一個(gè)個(gè)的“進(jìn)程”來(lái)組織的,由是多任務(wù)要么是多進(jìn)程,要么是多線(xiàn)程。
線(xiàn)程可以是進(jìn)程,比如輕量級進(jìn)程,這樣多線(xiàn)程的本質(zhì)還是多進(jìn)程,當線(xiàn)程不再是進(jìn)程時(shí),問(wèn)題會(huì )變成另外一個(gè)形式,此時(shí),存在著(zhù)二種任務(wù),即進(jìn)程任務(wù),和線(xiàn)程任務(wù),線(xiàn)程任務(wù)只需要CPU時(shí)間,而沒(méi)有虛存空間。
典型的用戶(hù)層線(xiàn)程是用協(xié)程建立起來(lái)的
解決了如何表示多任務(wù)的問(wèn)題之后,下一步就是解決如何同步它們了。
于是多進(jìn)程就有內存間互不干擾的假像,但實(shí)際上他們正是靠正面協(xié)作來(lái)達到這個(gè)假像的,線(xiàn)程的真正意義是“使一份執行流(程序的一部分)”獨享CPU.當然,于是多線(xiàn)程就有了多CPU的假像,這二者都是模擬的.
并發(fā)問(wèn)題源于圖靈模型與需要開(kāi)發(fā)處理的現實(shí)問(wèn)題之間的矛盾,圖靈模式是控制主導數據(機器的底層問(wèn)題都是IO問(wèn)題),這使得這種IO動(dòng)作必須被協(xié)調.又因為用于開(kāi)發(fā)系統的語(yǔ)言一般是C語(yǔ)言,C語(yǔ)言本身并非某種并發(fā)和線(xiàn)程安全語(yǔ)言,所以必須在內核層提供一套同步機制.
解決多線(xiàn)程的問(wèn)題是多解的,,源于解決方法的高層模式各有不同4,有不同的相關(guān)概念,,比如鎖,,,就不需要用到信號量.
不要把線(xiàn)程想像為:它是進(jìn)程依賴(lài)的,其實(shí),它跟任何一個(gè)進(jìn)程一樣,是直接面向整個(gè)VM和運行環(huán)境的,只有VM才負責為它可供訪(fǎng)問(wèn)的資源和這種提供同步機制.進(jìn)程不能. 線(xiàn)程首先是作為OS的任務(wù)機制,應首先討論它的這層意義,再討論它用于并發(fā)的那些意義。即線(xiàn)程先是任務(wù)里面的概念,然后才是并發(fā)里面的概念。
多線(xiàn)程中的quene,用設置一個(gè)“單行道”的方式來(lái)避免并發(fā)帶來(lái)的矛盾. 阻塞式同步,也就是基于調度的并發(fā),,跟基于忙等待和鎖的并發(fā)(蠻干算法)對應..
多CPU要協(xié)調好共享資源的處理,多線(xiàn)程也要做一樣的同步工作(雖然它也可以完全不做).
在順序語(yǔ)言里,一般用共享存儲(就是用某個(gè)存儲在公共區的值作為條件,判斷通過(guò)就不用再等待)或消息傳遞的方式進(jìn)行線(xiàn)程間的通信(最終是希望得到某種同步和要達到的并行性能的折中,即不能同步過(guò)度,必要的同步)
多進(jìn)程需要被調度,多線(xiàn)程也一樣,要注意三個(gè)東西,
參與并發(fā)的各個(gè)主體,線(xiàn)程,或進(jìn)程, 并發(fā)的數據結構,比如鎖,互斥體,等, 調度機制與調度條件.
可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于調度的同步,線(xiàn)程間自愿讓出CPU)完成.記住這個(gè)說(shuō)法,被阻塞是為了同步,阻塞不是出了問(wèn)題,只有發(fā)生deadlock的時(shí)候,才是出了問(wèn)題.互斥是為了同步,是同步的一種機制,跟同步不是矛盾的概念(同步是為了解決多進(jìn)程不同步問(wèn)題的大概念大方向,互斥只是一種同步機制和解決問(wèn)題的方法之一). (自愿阻塞的調度方式下)阻塞可能是一個(gè)線(xiàn)程自動(dòng)讓出同步數據結構,比如鎖(比如在這個(gè)線(xiàn)程中調用了sleep,或input等待輸入),而此時(shí),它還在運行(沒(méi)被終止,甚至沒(méi)被中止),一個(gè)進(jìn)程被陰塞時(shí)不是指它沒(méi)被運行(它只是因自愿或某種調度被迫而放棄了同步設施而掛起,掛起的意思僅指它不再受到并發(fā)保護的影響,其實(shí),因等待輸入等條件引起的掛起是很自然的原因),只是指它不受到并發(fā)的保護,只要有機會(huì ),它可以由別的進(jìn)程喚醒(因調度獲得同步設施),
正在運行的線(xiàn)程可能是前一秒運行過(guò),現在(測試時(shí))發(fā)現剛剛就被阻塞了的線(xiàn)程
什么是阻塞,阻塞即線(xiàn)程因得不到而等待資源的過(guò)程.是OS的調度里面的概念 阻塞就是以線(xiàn)程為單位獨占用CPU時(shí)間引用的事情(sleep函數就是根據這個(gè)原理來(lái)的,此時(shí)它要等到時(shí)間過(guò)了這個(gè)事件被發(fā)生,才會(huì )停止sleep),比如一個(gè)read()線(xiàn)程在程序中等待輸入,而這個(gè)輸入因為網(wǎng)絡(luò )遲沒(méi)有及時(shí)到達,這個(gè)線(xiàn)程就一直占用著(zhù)CPU時(shí)間(因為線(xiàn)程所處在的系統,本質(zhì)上只有一個(gè)CPU),使得其它線(xiàn)程也一并被卡掉(比如界面上一個(gè)關(guān)閉按鈕無(wú)法響應使用戶(hù)認為這個(gè)程序死了).
阻塞,怎么會(huì )跟線(xiàn)程有關(guān)呢?因為有 鎖機制在做怪,它在協(xié)調活動(dòng)的線(xiàn)程.如果沒(méi)有用線(xiàn)程實(shí)現的并發(fā)(此種并發(fā)在單CPU上并非為了加速,而是為了分流協(xié)調),就不需要用到鎖,因此,就不需要靠阻塞一方的方式來(lái)協(xié)調.因此,在獲得鎖方面,就有主動(dòng)獲得鎖和主動(dòng)讓步鎖的情形存在.
信號量,事件,旗語(yǔ),都是用于進(jìn)程間同步和通信的設施(在用c實(shí)現的windows,這些東西都被稱(chēng)為對象,實(shí)際上,是一系列結構和函數的統稱(chēng))。進(jìn)程間會(huì )在彼此的空間里交互這些對象,以實(shí)現同步和通信。比如互斥量,它鎖定了共享資源,得到互斥量的當前進(jìn)程除非釋放它,否則另外的進(jìn)程不能獲得它,進(jìn)而獲得對共享資源的訪(fǎng)問(wèn).
OS對于解決多任務(wù)和解決多任務(wù)之間的同步是一前一后的。并發(fā)問(wèn)題是隨著(zhù)計算機制造和計算機軟件系統制造而產(chǎn)生的那類(lèi)問(wèn)題(為了分時(shí)就必須協(xié)調同步),所以,它產(chǎn)生了一整個(gè)系統編程的流派
所謂同步,其實(shí)并不是什么大不了的概念,它不過(guò)就是解決可能會(huì )出現“不同步,影響通信”的諸多矛盾的一切手段的統稱(chēng),在OS中,這些手段就表現為軟件上的抽象,被實(shí)現在OS kernel中。
既然馮氏機本來(lái)就是一臺順序確定執行指令的機器,為什么要搞得那么復雜呢?這是因為人們需要更復雜的東西(而軟件級可以通過(guò)擴展硬件做到),那又為什么在提供了并發(fā)之后,還會(huì )涉及到同步問(wèn)題呢? ,這是因為簡(jiǎn)單的事情弄復雜了,就肯定要付出相關(guān)的代價(jià),比如同步(有了多線(xiàn)程就要同步),這就跟說(shuō)謊一樣,需要謊謊相圓。
在代碼中,可以將代碼的一塊用一個(gè)線(xiàn)程包裝起來(lái),這樣,它就擁有一個(gè)自己的“CPU“,比如,程序有一個(gè)GUI界面,它有一個(gè)背后邏輯,在界面上又要響應用戶(hù)輸入,實(shí)際上,多線(xiàn)程的一個(gè)實(shí)用之處就是使這樣的界面更反應靈敏一點(diǎn). 并發(fā)并不是什么新鮮的事
在操作系統和應用程序的邏輯中都會(huì )涉及到并發(fā)邏輯(特別是數據庫系統中),并發(fā)邏輯可以多線(xiàn)程也可多進(jìn)程,甚至多線(xiàn)程多進(jìn)程的方式進(jìn)行,當然,單核環(huán)境下的并發(fā)永遠是一種對并發(fā)的模擬機制.
當然,有時(shí)你用的語(yǔ)言提供了并發(fā)的支持,,而且有時(shí)候,操作系統的并發(fā)邏輯會(huì )影響到你選用一種更有效的相容于操作系統的并發(fā)模型
并發(fā)5首先發(fā)生的大背景是PC6,假設我們是對單處理器的PC編程,因此每個(gè)時(shí)刻,都只有一個(gè)活動(dòng)執行上文行存在(CPU在任何時(shí)候,當前只有一個(gè)活動(dòng)的執行路徑-肯定是某個(gè)進(jìn)程7,在被CPU執行并處在這個(gè)執行路徑中,Windows可以允許多用戶(hù)多進(jìn)程,但是因為所謂多進(jìn)程,其實(shí)正是CPU輪流給每個(gè)進(jìn)程分配了CPU時(shí)間所以在單CPU的環(huán)境下,不真正存在多任務(wù),多進(jìn)程和多線(xiàn)程都不能真正給程序提速,它只能達到一種“分流”的效果,使得界面響應快捷(這主要依賴(lài)調度,它能迅速地把不需要CPU時(shí)間的當前線(xiàn)程 – 比如一個(gè)等待用戶(hù)輸入的線(xiàn)程,阻塞掉,復活另外一個(gè)需要CPU時(shí)間的線(xiàn)程,然后調度再在其中監視新情況的出現并不斷地作此類(lèi)分流性質(zhì)的調度,以使不需要CPU時(shí)間的線(xiàn)程讓步CPU時(shí)間給需要CPU的線(xiàn)程 – 可見(jiàn),并發(fā)并不是什么高高在上的東西,而是隨著(zhù)可見(jiàn)的那一類(lèi)問(wèn)題的需求而出現的,當然,這需要為每個(gè)工作流設置一個(gè)控制,即一個(gè)“控制線(xiàn)程”,thread of control=thread,而這,正是并發(fā)要被提出和它要解決的問(wèn)題),或其它一些效果.
保護模式下的分段分頁(yè)機制解決了地址映射與轉換方面的事情,完成了“轉換地址,從邏輯到線(xiàn)性,從線(xiàn)性到物理”,“形成線(xiàn)性任務(wù)空間”這樣的諸如此類(lèi)的任務(wù),這就是說(shuō),它完成的是建造一個(gè)個(gè)“隔離了的任務(wù)空間”的任務(wù),然而(這主要指CPU的功能和策略), 并沒(méi)有上升到完成負責建造具體任務(wù)的事的層次.因為此時(shí)我們還沒(méi)有談到任務(wù),還沒(méi)有談到任何關(guān)于它在軟件上的意義(任務(wù)是OS的概念,而OS代表軟件平臺).比如,什么是任務(wù)空間,以及任務(wù)怎么樣利用這些隔離了的空間。
也即,線(xiàn)性空間并非指任務(wù)空間,而是指CPU的一種機制,它使保護模式下的可用空間達到4g(CPU在保護模式的引導下,可以看到4g的內存,為形成一個(gè)soft pc成為可能),——- 只不過(guò)是索引的4g .而具體的內存分配與管理與“形成進(jìn)程空間”,其實(shí)是另外一回事.(這些必須要在腦海里明白)
呆會(huì )我們將會(huì )看到它們是在OS中完成的,這一切,就是操作系統技術(shù)中的進(jìn)程技術(shù)要解決的事情。并實(shí)現在OS kernel中。
進(jìn)程實(shí)現在os kernel中。是支持OS作為軟件上的機器的意義首先要解決的事。即虛擬硬件為軟件上可用的東西。
這可以從虛擬硬件執行環(huán)境中的內存和寄存器開(kāi)始。本書(shū)正是按這個(gè)順序來(lái)講解整個(gè)OS原理的。
由于保護模式的CPU已經(jīng)支持受保護了的任務(wù)空間和跳轉機制了,所以這并不同于普通的會(huì )編環(huán)境中的硬件執行環(huán)境,如果在其上展開(kāi)會(huì )編,將會(huì )是一種高級的會(huì )編。
進(jìn)程是一套實(shí)現操作系統任務(wù),多任務(wù)的軟件技術(shù)的統稱(chēng)。簡(jiǎn)言之,任務(wù)是一種使代表soft machine意義的os kernel首先完成的visual machine的整套機制。其形態(tài)有普通進(jìn)程和線(xiàn)程二種。
首先,對于任務(wù),在硬件級是分段分頁(yè)機制和門(mén)的跳轉保護機制,在os core級,可以封裝它們,最終表現出一個(gè)個(gè)“隔離了的線(xiàn)性任務(wù)空間”和受保護的代碼執行環(huán)境和IO環(huán)境。。
進(jìn)程和線(xiàn)程作為任務(wù),模擬了內存和CPU時(shí)間這二者(沒(méi)有CPU或沒(méi)有內存都不足于構成一個(gè)軟件的任務(wù),線(xiàn)程要偏向于CPU時(shí)間一點(diǎn)),是人們分裂一臺計算機的處理能力,為多臺計算機的手段.,故稱(chēng)VM。進(jìn)程“使一個(gè)程序獨享內存1
這里有必要再次提到4g空間作為線(xiàn)性空間與任務(wù)空間的區別,前者主要是指CPU的機制,這里是指進(jìn)程的機制(而進(jìn)程已經(jīng)有軟件的意義了),4G的虛存空間只是映射,這里有alu和mmu的作用(即頁(yè)式內存管理),如果可以,還可以加上段式的作用,其實(shí),進(jìn)程空間是不存在的,更真正的稱(chēng)法是“進(jìn)程空間”,它是個(gè)概念上的映射,故內核內間,用戶(hù)空間,只是4G的“進(jìn)程空間”(這里稱(chēng)為進(jìn)程空間似乎不妥,任務(wù)空間,應稱(chēng)為工作空間,“可供映射空間”)
將進(jìn)程空間分為系統空間與用戶(hù)空間,它主要是強調:CPU從系統空間進(jìn)入用戶(hù)空間(此時(shí),CPU正在一個(gè)受限的局域活動(dòng))時(shí)易,用戶(hù)空間進(jìn)入系統空間時(shí)(此時(shí),CPU可執行作何特權指令)難,必須要通過(guò)OS提供的自陷或中斷,方可進(jìn)入os kernel,進(jìn)入OS kernel所在代碼(在那里,可以執行特權代碼,os kernel本身就是優(yōu)于用戶(hù)進(jìn)程代碼的特權代碼)
先映射系統所在頁(yè)面(通過(guò)內存管理作用),這些頁(yè)面和這個(gè)概念上的空間是不被置換的,用戶(hù)空間會(huì )被進(jìn)程切換刷新其(對于物理頁(yè)面的)映射。
進(jìn)程使計算機成為vm,它有自己的寄存器環(huán)境(這絕不僅僅是一句空話(huà),這句話(huà)是指,計算機成為一臺VM,所有VM共享PC整個(gè)執行硬件,以它為基礎形成保護模式,并形成任務(wù))和內存(用線(xiàn)性空間成就的任務(wù)空間)
進(jìn)程不光有一套自己的虛存空間,也有自己的一套reg環(huán)境,這里涉及到大量的保護模式下的段式轉換等知識,需要講解
前提是,我們是在一個(gè)4G里討論問(wèn)題。有一個(gè)正統的稱(chēng)法叫線(xiàn)性空間 這里介紹一下堆棧機,內核棧,用戶(hù)棧,
進(jìn)程調度不僅是為了多任務(wù)而準備的,單任務(wù)內部也需要調度。這就是門(mén)所規范的任務(wù)代碼跳轉機制。
程序能不能訪(fǎng)問(wèn)硬件,這要視開(kāi)發(fā)該程序所有的語(yǔ)言和程序運行的環(huán)境而定,相比高級語(yǔ)言,會(huì )編是可以控制計算機做任何事情的語(yǔ)言,可是假如計算機booting,init進(jìn)入os,比如windows或linux,那么該程序可能導致錯誤(而它可能在DOS這樣的環(huán)境下或者沒(méi)有DOS的環(huán)境下就不會(huì ))
比如,多任務(wù)環(huán)境下,這么多程序共用一套寄存器,硬件資源是它們的公用設施,這會(huì )不會(huì )造成寄存器混亂呢,不會(huì ),因為每個(gè)程序的進(jìn)程都可以為它們保存副本(每個(gè)進(jìn)程都是四GB,有自己的內核棧).而進(jìn)程調度,即那些保證進(jìn)程對硬件資源訪(fǎng)問(wèn)的邏輯,是由系統核心來(lái)保障的.
內核中的進(jìn)程
內核管理進(jìn)程,進(jìn)程管理線(xiàn)程,線(xiàn)程是時(shí)間單位的一個(gè)函數(由進(jìn)程調度來(lái)協(xié)調產(chǎn)生或同步) 內核線(xiàn)程不可中斷,內核所在頁(yè)面也不可置換
用戶(hù)線(xiàn)程與內核線(xiàn)程是二個(gè)不一樣的東西,如果用戶(hù)進(jìn)程用了內核線(xiàn)程,那么它就是內核線(xiàn)程,反之,如果一個(gè)用戶(hù)進(jìn)程的實(shí)現,沒(méi)有用到任何內核線(xiàn)程的支持,那么,它就是posix兼容的用戶(hù)線(xiàn)程.
虛存管理與調度
虛擬內存不僅指頁(yè)面文件(不是每個(gè)系統都有MMU單元),它其實(shí)是一個(gè)很大的基礎概念,是PC分解它自身只有一個(gè)CPU和主存而產(chǎn)生的“虛擬化CPU時(shí)間”,和“虛擬化主存空間”的二者之一,它作為底層服務(wù)于caching,mm,內存保護,等上層建筑.(是典型的C/S結構,所以,在OS的設計中,windows大量采用管理器之類(lèi)的概念,而這,也導致了微內核的產(chǎn)生),理解虛擬內存的關(guān)鍵是理解“存儲器抽象”和“mm”這二種概念實(shí)際上是一上一下的二大抽象體系.即解決硬件抽象層的問(wèn)題,和關(guān)于任務(wù)中對于內存,的初級系統邏輯.
其次,軟件平臺要作為一個(gè)能運行多任務(wù)的soft vm,進(jìn)程就需要被調度,故是實(shí)現多任務(wù)(此時(shí)不能說(shuō)成多進(jìn)程2,多線(xiàn)程什么的)的基礎.它首先完成任務(wù)調度(此時(shí)它并不一定跟多線(xiàn)程多進(jìn)程同時(shí)運行有關(guān)3,大凡內核,總要處理任務(wù)間的切換,對CPU,IO的使用,此時(shí),就需要調度),再完成并發(fā)調度(基于調度的并發(fā)),線(xiàn)程原來(lái)也叫進(jìn)程.調度是OS的靈魂,它是將“一個(gè)CPU”以“進(jìn)程”為單位分成“多個(gè)CPU”的手段(是一種時(shí)間上的劃分,由定時(shí)設備發(fā)出有規則劃分的信號).
因為進(jìn)程環(huán)境由虛存空間和寄存環(huán)境CPU(它們代表一臺進(jìn)程VM的時(shí)間和空間二方面)組成,因此OS要在內核實(shí)現中提供對它們的管理。
在OS級,CPU與內存如何發(fā)生聯(lián)系被稱(chēng)為CPU的存儲管理機制 – 這個(gè)存儲,專(zhuān)指主存,頁(yè)如何被實(shí)際分配,并形成一個(gè)進(jìn)程空間.即,就是“進(jìn)程地址空間的形成”, 這才是指OS的事。
就是“具體的內存分配與管理”,即頁(yè)式內存分配邏輯(這主要指CPU對內存的策略),這二者都是存諸管理機的二個(gè)階段.
進(jìn)程管理和調度實(shí)際上是os kenerl的應用層,進(jìn)程間通信,才是進(jìn)程管理的server,進(jìn)程管理使用它。進(jìn)程通信是os kernel中的kernel,進(jìn)程管理是os kernel中的application,因此微內核主張,只有進(jìn)程通信才配進(jìn)入os kenel,其它如進(jìn)程管理,使用到進(jìn)程通信的還有文件系統,設備驅動(dòng)等,這些,應做到os kernel的下一層次,比如進(jìn)程的非os kenerl的非kernel層次。
進(jìn)程是OS Kernel的,它維護一個(gè)就緒表和一個(gè)關(guān)于進(jìn)程的條件隊列,在有了系統的原生并發(fā)的支持下,在應用程序層,編程可以通過(guò)共享存儲器或消息傳遞機制實(shí)現某種并發(fā), 對于共享存儲,大約可以分為忙等待和基于調度的方式,又可與“互斥機制”和“條件同步”組合分類(lèi),,于是有四種并發(fā)機制.
從這里開(kāi)始,出現了關(guān)于進(jìn)程的很多很多子問(wèn)題. 比如進(jìn)程的用戶(hù) 進(jìn)程的IO位圖 進(jìn)程上下文 任務(wù)狀態(tài).任務(wù)切換.優(yōu)先級 內核同步 內存映射和mmap(),malloc() – malloc的背后是一個(gè)內存沲,是由C運行時(shí)提供的,都會(huì )擴展一個(gè)進(jìn)程的線(xiàn)性空間,,這些屬于存儲管理的內容,而不是進(jìn)程及進(jìn)程調度的.
伙伴系統,是動(dòng)態(tài)內存的手段,還有一個(gè)slab,,是關(guān)于對內核數據結構的內存分配的..
解決了這二個(gè)問(wèn)題,即解決了任務(wù)問(wèn)題,然后是解決外部子組件
這些問(wèn)題跟任務(wù)機制也有交集,這產(chǎn)生了其它問(wèn)題內核同步進(jìn)程的IO位圖,等等,
在內核中的每一大小問(wèn)題的解決,都有其相似性(就跟解決任務(wù)問(wèn)題中所看到的那樣),比如,用相關(guān)的數據結構表示和算法支持,有相關(guān)的系統
前面分別介紹了os kernel和進(jìn)程(由于cpu和進(jìn)程間的聯(lián)系),但沒(méi)有介紹二者之間的關(guān)系,進(jìn)程管理是OS kenel對進(jìn)程的作用,進(jìn)程間通信是必要的,它需要“進(jìn)程間同步”機制,以保證通信的正?;?有一種是報文小消息的傳遞),進(jìn)程間同步也是進(jìn)程間通信,但它又是低級的進(jìn)程間通信,因此一般把它跟進(jìn)程間通信分開(kāi)來(lái)說(shuō)。
首先,一個(gè)現代的OS必定是需要支持多任務(wù)的,對多任務(wù)的管理,被實(shí)現在OS內核中。
在單CPU上采取多線(xiàn)程策略的情況下,不會(huì )提高程序的真實(shí)速度,因為CPU只是采取時(shí)間片輪分的方法.但是可以得到“界面高速反應”這樣的效果,這跟提不提高速度,是二回事并不矛盾.
計算機運行并完全計算的基本單位是靠一個(gè)個(gè)的“進(jìn)程”來(lái)組織的,由是多任務(wù)要么是多進(jìn)程,要么是多線(xiàn)程。
線(xiàn)程可以是進(jìn)程,比如輕量級進(jìn)程,這樣多線(xiàn)程的本質(zhì)還是多進(jìn)程,當線(xiàn)程不再是進(jìn)程時(shí),問(wèn)題會(huì )變成另外一個(gè)形式,此時(shí),存在著(zhù)二種任務(wù),即進(jìn)程任務(wù),和線(xiàn)程任務(wù),線(xiàn)程任務(wù)只需要CPU時(shí)間,而沒(méi)有虛存空間。
典型的用戶(hù)層線(xiàn)程是用協(xié)程建立起來(lái)的
解決了如何表示多任務(wù)的問(wèn)題之后,下一步就是解決如何同步它們了。
于是多進(jìn)程就有內存間互不干擾的假像,但實(shí)際上他們正是靠正面協(xié)作來(lái)達到這個(gè)假像的,線(xiàn)程的真正意義是“使一份執行流(程序的一部分)”獨享CPU.當然,于是多線(xiàn)程就有了多CPU的假像,這二者都是模擬的.
并發(fā)問(wèn)題源于圖靈模型與需要開(kāi)發(fā)處理的現實(shí)問(wèn)題之間的矛盾,圖靈模式是控制主導數據(機器的底層問(wèn)題都是IO問(wèn)題),這使得這種IO動(dòng)作必須被協(xié)調.又因為用于開(kāi)發(fā)系統的語(yǔ)言一般是C語(yǔ)言,C語(yǔ)言本身并非某種并發(fā)和線(xiàn)程安全語(yǔ)言,所以必須在內核層提供一套同步機制.
解決多線(xiàn)程的問(wèn)題是多解的,,源于解決方法的高層模式各有不同4,有不同的相關(guān)概念,,比如鎖,,,就不需要用到信號量.
不要把線(xiàn)程想像為:它是進(jìn)程依賴(lài)的,其實(shí),它跟任何一個(gè)進(jìn)程一樣,是直接面向整個(gè)VM和運行環(huán)境的,只有VM才負責為它可供訪(fǎng)問(wèn)的資源和這種提供同步機制.進(jìn)程不能. 線(xiàn)程首先是作為OS的任務(wù)機制,應首先討論它的這層意義,再討論它用于并發(fā)的那些意義。即線(xiàn)程先是任務(wù)里面的概念,然后才是并發(fā)里面的概念。
多線(xiàn)程中的quene,用設置一個(gè)“單行道”的方式來(lái)避免并發(fā)帶來(lái)的矛盾. 阻塞式同步,也就是基于調度的并發(fā),,跟基于忙等待和鎖的并發(fā)(蠻干算法)對應..
多CPU要協(xié)調好共享資源的處理,多線(xiàn)程也要做一樣的同步工作(雖然它也可以完全不做).
在順序語(yǔ)言里,一般用共享存儲(就是用某個(gè)存儲在公共區的值作為條件,判斷通過(guò)就不用再等待)或消息傳遞的方式進(jìn)行線(xiàn)程間的通信(最終是希望得到某種同步和要達到的并行性能的折中,即不能同步過(guò)度,必要的同步)
多進(jìn)程需要被調度,多線(xiàn)程也一樣,要注意三個(gè)東西,
參與并發(fā)的各個(gè)主體,線(xiàn)程,或進(jìn)程, 并發(fā)的數據結構,比如鎖,互斥體,等, 調度機制與調度條件.
可用忙等待(一直等待的意思)的spin lock或阻塞式同步(基于調度的同步,線(xiàn)程間自愿讓出CPU)完成.記住這個(gè)說(shuō)法,被阻塞是為了同步,阻塞不是出了問(wèn)題,只有發(fā)生deadlock的時(shí)候,才是出了問(wèn)題.互斥是為了同步,是同步的一種機制,跟同步不是矛盾的概念(同步是為了解決多進(jìn)程不同步問(wèn)題的大概念大方向,互斥只是一種同步機制和解決問(wèn)題的方法之一). (自愿阻塞的調度方式下)阻塞可能是一個(gè)線(xiàn)程自動(dòng)讓出同步數據結構,比如鎖(比如在這個(gè)線(xiàn)程中調用了sleep,或input等待輸入),而此時(shí),它還在運行(沒(méi)被終止,甚至沒(méi)被中止),一個(gè)進(jìn)程被陰塞時(shí)不是指它沒(méi)被運行(它只是因自愿或某種調度被迫而放棄了同步設施而掛起,掛起的意思僅指它不再受到并發(fā)保護的影響,其實(shí),因等待輸入等條件引起的掛起是很自然的原因),只是指它不受到并發(fā)的保護,只要有機會(huì ),它可以由別的進(jìn)程喚醒(因調度獲得同步設施),
正在運行的線(xiàn)程可能是前一秒運行過(guò),現在(測試時(shí))發(fā)現剛剛就被阻塞了的線(xiàn)程
什么是阻塞,阻塞即線(xiàn)程因得不到而等待資源的過(guò)程.是OS的調度里面的概念 阻塞就是以線(xiàn)程為單位獨占用CPU時(shí)間引用的事情(sleep函數就是根據這個(gè)原理來(lái)的,此時(shí)它要等到時(shí)間過(guò)了這個(gè)事件被發(fā)生,才會(huì )停止sleep),比如一個(gè)read()線(xiàn)程在程序中等待輸入,而這個(gè)輸入因為網(wǎng)絡(luò )遲沒(méi)有及時(shí)到達,這個(gè)線(xiàn)程就一直占用著(zhù)CPU時(shí)間(因為線(xiàn)程所處在的系統,本質(zhì)上只有一個(gè)CPU),使得其它線(xiàn)程也一并被卡掉(比如界面上一個(gè)關(guān)閉按鈕無(wú)法響應使用戶(hù)認為這個(gè)程序死了).
阻塞,怎么會(huì )跟線(xiàn)程有關(guān)呢?因為有 鎖機制在做怪,它在協(xié)調活動(dòng)的線(xiàn)程.如果沒(méi)有用線(xiàn)程實(shí)現的并發(fā)(此種并發(fā)在單CPU上并非為了加速,而是為了分流協(xié)調),就不需要用到鎖,因此,就不需要靠阻塞一方的方式來(lái)協(xié)調.因此,在獲得鎖方面,就有主動(dòng)獲得鎖和主動(dòng)讓步鎖的情形存在.
信號量,事件,旗語(yǔ),都是用于進(jìn)程間同步和通信的設施(在用c實(shí)現的windows,這些東西都被稱(chēng)為對象,實(shí)際上,是一系列結構和函數的統稱(chēng))。進(jìn)程間會(huì )在彼此的空間里交互這些對象,以實(shí)現同步和通信。比如互斥量,它鎖定了共享資源,得到互斥量的當前進(jìn)程除非釋放它,否則另外的進(jìn)程不能獲得它,進(jìn)而獲得對共享資源的訪(fǎng)問(wèn).
OS對于解決多任務(wù)和解決多任務(wù)之間的同步是一前一后的。并發(fā)問(wèn)題是隨著(zhù)計算機制造和計算機軟件系統制造而產(chǎn)生的那類(lèi)問(wèn)題(為了分時(shí)就必須協(xié)調同步),所以,它產(chǎn)生了一整個(gè)系統編程的流派
所謂同步,其實(shí)并不是什么大不了的概念,它不過(guò)就是解決可能會(huì )出現“不同步,影響通信”的諸多矛盾的一切手段的統稱(chēng),在OS中,這些手段就表現為軟件上的抽象,被實(shí)現在OS kernel中。
既然馮氏機本來(lái)就是一臺順序確定執行指令的機器,為什么要搞得那么復雜呢?這是因為人們需要更復雜的東西(而軟件級可以通過(guò)擴展硬件做到),那又為什么在提供了并發(fā)之后,還會(huì )涉及到同步問(wèn)題呢? ,這是因為簡(jiǎn)單的事情弄復雜了,就肯定要付出相關(guān)的代價(jià),比如同步(有了多線(xiàn)程就要同步),這就跟說(shuō)謊一樣,需要謊謊相圓。
在代碼中,可以將代碼的一塊用一個(gè)線(xiàn)程包裝起來(lái),這樣,它就擁有一個(gè)自己的“CPU“,比如,程序有一個(gè)GUI界面,它有一個(gè)背后邏輯,在界面上又要響應用戶(hù)輸入,實(shí)際上,多線(xiàn)程的一個(gè)實(shí)用之處就是使這樣的界面更反應靈敏一點(diǎn). 并發(fā)并不是什么新鮮的事
在操作系統和應用程序的邏輯中都會(huì )涉及到并發(fā)邏輯(特別是數據庫系統中),并發(fā)邏輯可以多線(xiàn)程也可多進(jìn)程,甚至多線(xiàn)程多進(jìn)程的方式進(jìn)行,當然,單核環(huán)境下的并發(fā)永遠是一種對并發(fā)的模擬機制.
當然,有時(shí)你用的語(yǔ)言提供了并發(fā)的支持,,而且有時(shí)候,操作系統的并發(fā)邏輯會(huì )影響到你選用一種更有效的相容于操作系統的并發(fā)模型
并發(fā)5首先發(fā)生的大背景是PC6,假設我們是對單處理器的PC編程,因此每個(gè)時(shí)刻,都只有一個(gè)活動(dòng)執行上文行存在(CPU在任何時(shí)候,當前只有一個(gè)活動(dòng)的執行路徑-肯定是某個(gè)進(jìn)程7,在被CPU執行并處在這個(gè)執行路徑中,Windows可以允許多用戶(hù)多進(jìn)程,但是因為所謂多進(jìn)程,其實(shí)正是CPU輪流給每個(gè)進(jìn)程分配了CPU時(shí)間所以在單CPU的環(huán)境下,不真正存在多任務(wù),多進(jìn)程和多線(xiàn)程都不能真正給程序提速,它只能達到一種“分流”的效果,使得界面響應快捷(這主要依賴(lài)調度,它能迅速地把不需要CPU時(shí)間的當前線(xiàn)程 – 比如一個(gè)等待用戶(hù)輸入的線(xiàn)程,阻塞掉,復活另外一個(gè)需要CPU時(shí)間的線(xiàn)程,然后調度再在其中監視新情況的出現并不斷地作此類(lèi)分流性質(zhì)的調度,以使不需要CPU時(shí)間的線(xiàn)程讓步CPU時(shí)間給需要CPU的線(xiàn)程 – 可見(jiàn),并發(fā)并不是什么高高在上的東西,而是隨著(zhù)可見(jiàn)的那一類(lèi)問(wèn)題的需求而出現的,當然,這需要為每個(gè)工作流設置一個(gè)控制,即一個(gè)“控制線(xiàn)程”,thread of control=thread,而這,正是并發(fā)要被提出和它要解決的問(wèn)題),或其它一些效果.
聯(lián)系客服