進程是計算機科學中最成功,最深入的概念之一。併發
在咱們運行一個程序時,一般會有這樣一個假象,就好像咱們的程序是當前惟一運行的程序同樣,它是獨佔 CPU 和內存的,程序的指令在處理器上一條一條地執行,最後,咱們的程序就好像內存中惟一一個對象,這些假象都是進程的概念給咱們提供的。函數
邏輯控制流 操作系統
![]()
處理器的一個物理控制流被分爲三個邏輯流,每一個進程一個。每一個豎直的條表示邏輯流的一部分。三個邏輯流的執行是交錯的。關鍵在於進程是輪流使用處理器的,每一個進程執行它的流的一部分,而後被搶佔 [暫時掛起] 。unix
一個邏輯流在執行的時間上與另外一個發生重疊,就稱爲併發流。多個流併發的執行稱爲併發。一個進程和多個進程輪流地運行稱爲多任務。一個進程執行它的部分邏輯流的每一時間段稱爲時間片。cdn
進程爲每一個程序提供一個假象,好像它單獨地佔用系統地址空間。進程爲每一個程序提供它本身私有的地址空間。 每一個地址空間的底部是保留給用戶的,一般包括棧,堆,數據和代碼。地址空間的頂部是保留給內核的。對象
一個運行在內核模式的進程能夠執行指令中的任何指令,訪問系統中的任何內存空間。沒有設置模式時,進程就處在用戶模式,此時的進程不容許執行帶有特權的指令,如中止處理器,發起一個 I/O 操做等。也不容許訪問內核區的代碼和數據。blog
操做系統的內核使用一種上下文切換的形式的控制流來實現多任務。內核會爲每個進程維持一個上下文,上下文就是內核從新啓動一個被強佔的進程說須要的狀態。在進程執行的某些時刻,內核能夠決定搶佔當前進程,並從新開啓一個先前被搶佔了的進程,這種行爲叫作調度,這個時候就會發生上下文切換。若是系統由於某個調用而發生阻塞,那麼內核可讓這個進程休眠,切換到另外一個進程。好比,一個 read 系統調用訪問磁盤,內核能夠選擇上下文切換,運行另外一個進程,而不是等待數據從磁盤到達。進程
進程通常有三種狀態內存
在 unix 系統中,建立一個子進程是 fork 函數。新建立的子進程與父進程幾乎但不徹底相同,子進程能夠獲得與父進程用戶虛擬地址空間相同的一份副本(獨立地),包括代碼、數據、棧和堆。子進程還能讀寫父進程打開的文件,他們之間最大的區別就是有不一樣的 PID。it
child 2