進程之間是如何獨立運行的

        我們都知道計算機的主要資源是 cpu與存儲器還有I/O設備,他們都是有限的,比如cpu一秒鐘只能處理多少條指令,內存只能存儲多少GB數據,無論我們如何使用,資源總是這麼多。而我們肯定希望我們的計算機資源能充分的發揮他自己的作用,所以我們要去挖掘我們的計算機的潛力。

         目前我們常用的一些pc機,智能手機 一般採用的的多核處理器來實現提高計算機的運行效率,多核處理器這種模式的誕生 是由於人們在製造cpu的工藝方面已經達到了物理極限,目前我們的cpu最高頻率只能達到4GHZ。所以cpu的資源是非常寶貴的,如果一個cpu只能運行一個程序,那麼當程序在讀寫磁盤時,cpu就會空閒下來,這對於我們寶貴的cpu資源沒有充分利用,對於我們來說是一種奢侈的浪費。所以就出現了一種多道程序的方法來解決這個問題 ,它就是通過一個監控程序,當某個程序無需使用的cpu的時候,監控程序就把正在等待cpu資源的其他程序啓動。這樣就可以讓我們cpu不斷的工作,充分的挖掘了cpu的資源供我們使用。那麼問題來了 假如我們某一個程序運行完需要10分鐘,那豈不是我們其他程序 需要等待10分鐘,假如這段時間我鼠標點擊了一下,我那就得十分鐘之後才能看到我鼠標點擊後的效果?

         所以人們通過改進,稱之爲一種叫協作模式的方法來解決這個問題,協作模式是 每一個程序運行一段時間後,主動的把cpu讓給塔器程序。使得每一個程序在一段時間內都能用到cpu,這種模式叫做分時系統,後來演變成我們現在的操作系統,但是這種模式也有很大的缺陷啊,假如我的某一個程序出現了死循環,那其他程序根本沒有獲得cpu的機會啊。那就只能關機重啓,以後再也不去碰這個程序?

        爲了解決這一問題,我們通過操作系統,來管理我們的計算機的硬件資源,所有的應用程序都以進程的方式運行,它的權限比操作系統低,每一個進程獲得的cpu資源均是由操作系統統一分配的,操作系統是可以強制剝奪cpu資源並且分配給他認爲最需要的進程,操作系統在短時間內讓cpu在多個進程間進行切換,就可以造成多個進程同時運行的假象。操作系統通過對進程間的地址進行隔離,使得每個進程都有自己獨立的地址空間,那麼如果我們的內存空間不夠,而cpu的資源有剩餘的,我們是不是還得想辦法讓,cpu的資源進一步得到利用呢?

         進程的總體目標是希望每一個進程從邏輯上來看都可以獨佔計算機資源,上面我們也解決了進程間的cpu資源如何共享的問題,那麼我們何不也讓進程之間 內存也共享?但是好像又有點矛盾,前面明明說了 每一個進程他們享有獨立的內存空間,從而來實現進程間的獨立,那麼我們該如何不影響進程間的獨立運行 並且又能實現共享內存呢?將我們有限的內存空間分配給更多的進程呢?

         解決這個問題的方法就是增加中間層,就是使用一種間接的的地址訪問方式,我們將程序給出的地址看作是一種虛擬地址,然後通過某種映射的方法,將虛擬地址轉換爲實際的物理地址,這樣就可以保證任意一個程序所有能夠訪問的物理內存區域跟另外的程序不出現交集,來達到隔離的效果。那麼虛擬地址與物理地址之間是怎麼映射的呢,又是以多大的內存空間爲一個粒度呢?

          我們可能會想我們通過計算得出我們每一個進程需要的最大內存,把每一個進程需要的最大內存作爲一個單位進行映射,這樣來提高我們對內存的利用率,而程序運行的時候,在某一個時間段內,它只是在頻繁的使用一小部分內存,所以採用這樣那個的方式和我們在物理內存上直接訪問沒有什麼區別,並沒有提高我們對內存的利用率,所以人們很自然的想到了更小的粒度的內存分割和映射方法,這種方法叫分頁。

          我們目前用的處理器一般採用的粒度是4kb大小爲一頁,那麼當我們把進程的虛擬地址空間按頁分割,把常用的數據和代碼頁放在內存中,把不常用的放在磁盤中,當我們需要的時候再從磁盤中提取出來即可,我們以下圖爲例:我們假設有兩個進程分別是process1和process2 ,他們進程的虛擬頁面被映射到了物理頁面,比如process1進程的VP2與VP3和process2進程的VP0和VP1,另外的還有些頁面可能尚未到使用到,它們暫時處於未使用狀態比如process2 VP3,而process1 的VP0與VP1不在內存中但是在需要這兩個頁的時候,操作系統會將其 讀出來 放在內存中。虛擬內存是不是和我們使用的內存池很相似?

     虛擬存儲的實現需要依靠硬件的支持,對於不同的cpu來說是不同的。但是幾乎所有的硬件都是採用MMU這個部件來映射的。總結一下進程與進程之間獨立運行 還是因爲他們使用內存時沒有出現交集。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章