<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      前言

      為什么取這個標題呢?一是進程和線程是作為操作系統(tǒng)里最重要最核心的一部分。二是確實吃冰棍拉冰棍,沒話,強行湊標題和之前的標題差不多字數(shù)。

      前一章寫了系統(tǒng)調用的過程,算是一個小插曲,這個部分不管在哪里應該都是可以的。

      現(xiàn)在的這個系列已經(jīng)和之前的標題漸行漸遠了,原本是想以之前寫的一個玩具型操作系統(tǒng)FragileOS
      <https://github.com/dejavudwh/FragileOS>
      為主線,但是在看書學習的過程中稍微改了一下方向,已經(jīng)不是特別關注一個操作系統(tǒng)的實現(xiàn)的完整流程和內部的聯(lián)系,更多的是想系統(tǒng)的學習操作系統(tǒng)的各個模塊然后輔以一些代碼,但是不管怎么樣,都是屬于自己在學習操作系統(tǒng)的過程的一個記錄

      進入正題

      進程

      進程的出現(xiàn)最最主要的原因就是想要提高CPU的利用率

      進程的定義

      * 正在執(zhí)行的程序
      * 正在計算機上執(zhí)行的程序實例
      * 能夠分配給處理器并由處理器執(zhí)行的實體
      * 一組指令的執(zhí)行、一個當前狀態(tài)和相關的系統(tǒng)資源的集合
      多進程的組織

      單核CPU在同一時刻只能運行一條指令,所謂的多進程只是指令來回切換的假象,但是因為速度太快,就可以看成是同時進行的。所以在進程切換的時就需要去組織進程的切換

      進程控制塊(process control block)

      控制進程的切換一個重要的數(shù)據(jù)結構就是進程控制塊(process control block),是與每個進程相關的還有操作系統(tǒng)用于控制進程的許多屬性的集合


      進程控制塊的作用,是使一個在多道程序環(huán)境下不能獨立進行的程序(含數(shù)據(jù)),成為一個能獨立運行的基本單位,一個能與其他進程并發(fā)執(zhí)行的進程?;蛘哒f,操作系統(tǒng)是根據(jù)PCB來對并發(fā)執(zhí)行的進程進行控制和管理。

      一般情況下,PCB中包含以下內容:

      * 進程標識符(內部,外部)
      * 處理機的信息(通用寄存器,指令計數(shù)器,PSW,用戶的棧指針)。
      * 進程調度信息(進程狀態(tài),進程的優(yōu)先級,進程調度所需的其它信息,事件)
      * 進程控制信息(程序的數(shù)據(jù)的地址,資源清單,進程同步和通信機制,鏈接指針)
      進程的五狀態(tài)模型



      進程的調度

      一般來說,可能讓進程發(fā)生切換有這幾種事件:




      但是隨著PC的發(fā)展,這種從兩方面情況發(fā)生了變化。第一,大多數(shù)時間都只有一個活躍的進程。畢竟一般來說,你在使用Word編輯文件時,不太可能還同時讓系統(tǒng)在后臺編譯程序。這樣的情況下,調度器其實不需要做很多工作來決定到底運行哪個進程——Word幾乎就是唯一的選擇。第二,計算機的速度越來越快,以至于CPU可能已經(jīng)不再那么稀缺了。對于很多PC的程序來說,其限制主要在于用戶能進行輸入的比例,而不是CPU能夠處理的比例。甚至就算是兩個程序真的同時進行,其實先調度哪個運行也無傷大雅,例如,一個Word和一個Excel同時在運行,先調度哪個都行,因為用戶可能同時在等待這兩個程序的輸出。


      但是對于網(wǎng)絡服務器來說,這種情況又不一樣了。非常多的程序競爭CPU資源,因此,調度又變得非常重要了。舉例來說,調度器需要決定到底是讓日常統(tǒng)計進程運行還是讓響應用戶請求的進程運行。

      調度器除了需要考慮選擇哪個進程運行,還需要考慮到系統(tǒng)的性能。畢竟,進程之間的切換是開銷很大的,這涉及到從用戶態(tài)到內核狀態(tài)的切換,進程狀態(tài)的保存、恢復等等操作。

      參考鏈接 <https://www.cnblogs.com/wawlian/archive/2012/02/17/2356398.html>

      進程的同步和合作

      內存管理

      在進程進行來回切換如何保證當前進程的運行不會影響其它進程的運行,比如對于一個內存進程的讀寫,就要保證不能越界

      所以就需要一個機制來把進程之間的地址空間隔離開



      進程的同步

      不同進程間存在著不同的相互制約關系。為了協(xié)調進程之間的相互制約關系,達到資源共享和進程協(xié)作,避免進程之間的沖突,就需要進程同步的概念。

      多個進程可以共享系統(tǒng)中的各種資源,但其中許多資源一次只能為一個進程所使用,我們把一次只允許一個進程使用的資源成為臨界資源。
      對臨界資源的訪問,必須互斥的進行。每個進程中,訪問臨界資源的那段代碼成為臨界區(qū)。
      為了保證臨界資源的正確使用,可以把臨界資源的訪問過程分為四個部分。

      * 進入?yún)^(qū)。為了進入臨界區(qū)使用臨界資源,在進入去要檢查可否進入臨界區(qū)。
      * 臨界區(qū)。進程中訪問臨界資源的那段代碼。
      * 退出區(qū)。將正在訪問臨界區(qū)的標志清除。
      * 剩余區(qū)。代碼中的其余部分。
      一般實現(xiàn)進程的同步有這幾種方法:

      * 提過硬件提供的實現(xiàn)
      * 信號量
      * 管程
      線程

      進程是資源分配的最小單位,線程是CPU調度的最小單位

      在進程的切換時還需要對內存資源的一個切換,但是線程則不需要對資源的切換,所以引入是為了減小程序在并發(fā)執(zhí)行時所付出的時空開銷,提高操作系統(tǒng)的并發(fā)性能。

      用戶級線程和內核級線程

      用戶級線程
      是指不需要內核支持而在用戶程序中實現(xiàn)的線程,內核對線程包一無所知。從內核角度考慮,就是按正常的方式管理,即單線程進程,但是它不能像內核級線程一樣更好的運用多核CPU。

      內核級線程
      建立和銷毀都是由操作系統(tǒng)負責、通過系統(tǒng)調用完成的。在內核的支持下運行,無論是用戶進程的線程,或者是系統(tǒng)進程的線程,他們的創(chuàng)建、撤銷、切換都是依靠內核實現(xiàn)的。

      *

      試想一下如果沒有內核級線程,當用戶級的一個線程進行到I/O阻塞時,將會導致所有的線程都堵塞,因為以操作系統(tǒng)的層面來看,它們都屬于用一個進程,所以會直接切換進程,其它的線程就得不到執(zhí)行

      *
      在多處理器系統(tǒng)中,內核級線程能夠真正的實現(xiàn)并行,能夠執(zhí)行同一進程內的多個線程





      小結

      這一篇主要是簡略的總結書上的一些概念,沒有干貨,在后面進行代碼實現(xiàn)的時候會再深入的去看。下一篇可能會去看Linux0.12在進程上面的實現(xiàn)。

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          五月丁香婷婷五月 | 国产精品久久久久久久天堂 | 全免费A级毛片免费看无码视频 | 成人A片无码专区亚洲 | 99这里| 空姐黄片| 日日夜夜青青草 | 亚洲精品一区二区三区早餐绿帽社 | 波多野结衣操逼视频 | 69免费视频 |