我是如何學習寫一個操做系統(五):故事的高潮之進程和線程1

前言

爲何取這個標題呢?一是進程和線程是做爲操做系統裏最重要最核心的一部分。二是確實吃冰棍拉冰棍,沒話,強行湊標題和以前的標題差很少字數。html

前一章寫了系統調用的過程,算是一個小插曲,這個部分無論在哪裏應該都是能夠的。git

如今的這個系列已經和以前的標題漸行漸遠了,本來是想以以前寫的一個玩具型操做系統FragileOS爲主線,可是在看書學習的過程當中稍微改了一下方向,已經不是特別關注一個操做系統的實現的完整流程和內部的聯繫,更多的是想系統的學習操做系統的各個模塊而後輔以一些代碼,可是無論怎麼樣,都是屬於本身在學習操做系統的過程的一個記錄github

<!--more-->小程序

進入正題服務器

進程

進程的出現最最主要的緣由就是想要提升CPU的利用率網絡

進程的定義數據結構

  • 正在執行的程序
  • 正在計算機上執行的程序實例
  • 可以分配給處理器並由處理器執行的實體
  • 一組指令的執行、一個當前狀態和相關的系統資源的集合

多進程的組織

單核CPU在同一時刻只能運行一條指令,所謂的多進程只是指令來回切換的假象,可是由於速度太快,就能夠當作是同時進行的。因此在進程切換的時就須要去組織進程的切換併發

進程控制塊(process control block)

控制進程的切換一個重要的數據結構就是進程控制塊(process control block),是與每一個進程相關的還有操做系統用於控制進程的許多屬性的集合性能

進程控制塊的做用,是使一個在多道程序環境下不能獨立進行的程序(含數據),成爲一個能獨立運行的基本單位,一個能與其餘進程併發執行的進程。或者說,操做系統是根據PCB來對併發執行的進程進行控制和管理。學習

通常狀況下,PCB中包含如下內容:

  • 進程標識符(內部,外部)
  • 處理機的信息(通用寄存器,指令計數器,PSW,用戶的棧指針)。
  • 進程調度信息(進程狀態,進程的優先級,進程調度所需的其它信息,事件)
  • 進程控制信息(程序的數據的地址,資源清單,進程同步和通訊機制,連接指針)

進程的五狀態模型

進程的調度

通常來講,可能讓進程發生切換有這幾種事件:

可是隨着PC的發展,這種從兩方面狀況發生了變化。第一,大多數時間都只有一個活躍的進程。畢竟通常來講,你在使用Word編輯文件時,不太可能還同時讓系統在後臺編譯程序。這樣的狀況下,調度器其實不須要作不少工做來決定到底運行哪一個進程——Word幾乎就是惟一的選擇。第二,計算機的速度愈來愈快,以致於CPU可能已經再也不那麼稀缺了。對於不少PC的程序來講,其限制主要在於用戶能進行輸入的比例,而不是CPU可以處理的比例。甚至就算是兩個程序真的同時進行,其實先調度哪一個運行也無傷大雅,例如,一個Word和一個Excel同時在運行,先調度哪一個都行,由於用戶可能同時在等待這兩個程序的輸出。

可是對於網絡服務器來講,這種狀況又不同了。很是多的程序競爭CPU資源,所以,調度又變得很是重要了。舉例來講,調度器須要決定究竟是讓平常統計進程運行仍是讓響應用戶請求的進程運行。

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

參考連接

進程的同步和合做

內存管理

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

因此就須要一個機制來把進程之間的地址空間隔離開

進程的同步

不一樣進程間存在着不一樣的相互制約關係。爲了協調進程之間的相互制約關係,達到資源共享和進程協做,避免進程之間的衝突,就須要進程同步的概念。

多個進程能夠共享系統中的各類資源,但其中許多資源一次只能爲一個進程所使用,咱們把一次只容許一個進程使用的資源成爲臨界資源。 對臨界資源的訪問,必須互斥的進行。每一個進程中,訪問臨界資源的那段代碼成爲臨界區。 爲了保證臨界資源的正確使用,能夠把臨界資源的訪問過程分爲四個部分。

  • 進入區。爲了進入臨界區使用臨界資源,在進入去要檢查能否進入臨界區。
  • 臨界區。進程中訪問臨界資源的那段代碼。
  • 退出區。將正在訪問臨界區的標誌清除。
  • 剩餘區。代碼中的其他部分。

通常實現進程的同步有這幾種方法:

  • 提過硬件提供的實現
  • 信號量
  • 管程

線程

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

在進程的切換時還須要對內存資源的一個切換,可是線程則不須要對資源的切換,因此引入是爲了減少程序在併發執行時所付出的時空開銷,提升操做系統的併發性能。

用戶級線程和內核級線程

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

內核級線程創建和銷燬都是由操做系統負責、經過系統調用完成的。在內核的支持下運行,不管是用戶進程的線程,或者是系統進程的線程,他們的建立、撤銷、切換都是依靠內核實現的。

  • 試想一下若是沒有內核級線程,當用戶級的一個線程進行到I/O阻塞時,將會致使全部的線程都堵塞,由於以操做系統的層面來看,它們都屬於用一個進程,因此會直接切換進程,其它的線程就得不到執行

  • 在多處理器系統中,內核級線程可以真正的實現並行,可以執行同一進程內的多個線程

小結

這一篇主要是簡略的總結書上的一些概念,沒有乾貨,在後面進行代碼實現的時候會再深刻的去看。下一篇可能會去看Linux0.12在進程上面的實現。

原文出處:https://www.cnblogs.com/secoding/p/11417547.html

相關文章
相關標籤/搜索