深刻理解計算機系統(二)

進程


進程是計算機科學中最成功,最深入的概念之一。併發

在咱們運行一個程序時,一般會有這樣一個假象,就好像咱們的程序是當前惟一運行的程序同樣,它是獨佔 CPU 和內存的,程序的指令在處理器上一條一條地執行,最後,咱們的程序就好像內存中惟一一個對象,這些假象都是進程的概念給咱們提供的。函數

  • 一個獨立的邏輯控制流,它提供一種假象,就好像咱們的程序獨立地使用處理器。
  • 一個獨立的私有地址空間,它提供一種假象,好像咱們的程序獨立地使用內存系統

邏輯控制流 操作系統

處理器的一個物理控制流被分爲三個邏輯流,每一個進程一個。每一個豎直的條表示邏輯流的一部分。三個邏輯流的執行是交錯的。關鍵在於進程是輪流使用處理器的,每一個進程執行它的流的一部分,而後被搶佔 [暫時掛起] 。unix


併發

一個邏輯流在執行的時間上與另外一個發生重疊,就稱爲併發流。多個流併發的執行稱爲併發。一個進程和多個進程輪流地運行稱爲多任務。一個進程執行它的部分邏輯流的每一時間段稱爲時間片cdn


私有地址空間

進程爲每一個程序提供一個假象,好像它單獨地佔用系統地址空間。進程爲每一個程序提供它本身私有的地址空間。 每一個地址空間的底部是保留給用戶的,一般包括棧,堆,數據和代碼。地址空間的頂部是保留給內核的。對象


內核模式和用戶模式

一個運行在內核模式的進程能夠執行指令中的任何指令,訪問系統中的任何內存空間。沒有設置模式時,進程就處在用戶模式,此時的進程不容許執行帶有特權的指令,如中止處理器,發起一個 I/O 操做等。也不容許訪問內核區的代碼和數據。blog


上下文切換

操做系統的內核使用一種上下文切換的形式的控制流來實現多任務。內核會爲每個進程維持一個上下文,上下文就是內核從新啓動一個被強佔的進程說須要的狀態。在進程執行的某些時刻,內核能夠決定搶佔當前進程,並從新開啓一個先前被搶佔了的進程,這種行爲叫作調度,這個時候就會發生上下文切換。若是系統由於某個調用而發生阻塞,那麼內核可讓這個進程休眠,切換到另外一個進程。好比,一個 read 系統調用訪問磁盤,內核能夠選擇上下文切換,運行另外一個進程,而不是等待數據從磁盤到達。進程


建立和終止進程

進程通常有三種狀態內存

  • 運行。要麼在 CPU 上運行,要麼被等待執行且最終會被內核調度。
  • 中止。進程的執行被掛起,且不會被調度。當收到某種信號時,纔會被從新調度,而後再次運行。
  • 終止。進程永遠的中止了,通常進程中止有三個緣由
  1. 收到一個信號,該信號終止進程
  2. 從主程序中返回
  3. 調用 exit 函數

在 unix 系統中,建立一個子進程是 fork 函數。新建立的子進程與父進程幾乎但不徹底相同,子進程能夠獲得與父進程用戶虛擬地址空間相同的一份副本(獨立地),包括代碼、數據、棧和堆。子進程還能讀寫父進程打開的文件,他們之間最大的區別就是有不一樣的 PID。it

parent 0

child 2

  • 相同可是獨立的地址空間 父進程和子進程的地址空間都是相同的,他們的用戶棧、堆、全局變量、代碼都是同樣的。因此,在第 6 行fork函數返回時,x在兩個進程的值都是 1。然而,他們卻都有獨立的地址空間。後面,父進程與子進程對 x 的操做也都是獨立的,這就是後面兩個 x 的值不一樣。
相關文章
相關標籤/搜索