關于進程的理解,首先得知道進程和程序有什么區別!其實程序大家并不陌生,前面也寫過很多程序,那什么是程序?程序是指令和數據的有序集合,本身沒有任何運行的含義,是一個靜態的概念。那什么又是進程呢?程序是保存在磁盤上的,要想程序實現一定的功能,需要有執行的過程,是一個動態的概念,而對于程序是靜態的概念,無法描述程序在內存中的執行情況,所以才引入了進程的概念,進程是一個程序的一次執行過程,是是程序執行和資源管理的小單位。
對于進程,在同一時間CPU只能處理一個事件,實際上是串行的,但是CPU執行的速度非常快,所以我們感覺像是并行一樣。進程是一個實體,進程不僅包括程序的指令和數據,而且包括程序計數器值、CPU的所有寄存器值以及存儲臨時數據的進程堆棧。它包括三部分:程序、數據、進程控制塊PCB,對于進程可以分成三部分:代碼段、數據段、堆棧段。
代碼段:存放程序的可執行代碼。
數據段:存放程序的全局變量、常量、靜態變量。
堆棧段:堆用于存放動態分配的內存變量,棧用于函數調用,它存放著函數的參數、
函數內部定義的局部變量。
而程序分成了兩部分:只有代碼段和數據段(.bss:未初始化的全局變量或靜態局部變量,.data:已初始化的全局變量或靜態局部變量)
每一個進程都有獨立的4g的虛擬空間,而0-3g是用戶可用空間,3g-4g是內核空間,每一個進程都擁有相同的內核空間,所以3g-4g是每一個進程的共享空間。物理內存是實際存在的空間,這個空間是根據你電腦的內存條大小來確定的,對于每一個擁有獨立4g虛擬空間的進程,都會在內存條上分配一定的空間大小(所以為什么說內存越大電腦的速度越快?比如10個進程在2g內存上運行,需要為每個進程分配200兆的空間來運行,如果10個進程在4g內存上運行,需要為每個進程分配400兆的空間)
對于獨立4g虛擬空間的進程,怎么加載到物理內存上的呢?
進程中的每一條指令,比如a+b這條指令會被加載到物理內存中,等下一次進程再次被調度時,系統就會知道再次從什么地方開始執行。
上圖中的雙向循環鏈表是保存在3g-4g的內核空間的。
對于進程控制塊PCB(process control block),系統通過PCB對進程進行管理和調度。PCB包括創建進程、執行程序、退出進程以及改變進程的優先級等。而進程中的PCB用一個名為task_struct的結構體來表示,定義在linux內核代碼include/linux/sched.h中,每當創建一新進程時,便在內存中申請一個空的task_struct結構,填入所需信息,同時,指向該結構的指針也被加入到task數組中,所有進程控制塊都存儲在task[]數組中。存放進程的信息的PCB是存放在內存中。在這里需要重點去看的是,在PCB結構體中有兩項重點來看一下,PID(進程號)和status(進程狀態),PID、PPID分別代表的是進程號和父進程號,通過進程號來唯一的表示一個進程;這兩個值都是非零正整數。
Linux中進程的類型也有這樣幾種:
1) 交互進程:該類進程是由shell控制和運行的。交互進程既可以在前臺運行,也可以
在后臺運行。該類進程經常與用戶進行交互,需要等待用戶的輸入,當接收到用戶的輸入后,該類進程會立刻響應,典型的交互式進程有:shell命令進程、文本編輯器等
2)批處理進程:該類進程不必與用戶進行交互,通常在后臺運行,不必很快地響應,它會被提交到一個隊列中進行順序執行。典型的批處理進程有:編譯器的編譯操作、數據庫搜索引擎。
3)守護進程:該類進程在后臺運行。它一般在Linux啟動時開始執行,系統關閉時才結
束。很多系統進程都是以守護進程的形式存在。
舉例:電腦的網線口,不插網線會有小嘆號,當插上網線設置好ip后就能上網,這是因為網口驅動程序是守護進程,當系統啟動時,此進程就已經被創建,此守護進程后會不停的去詢問有沒有網線…
同時根據進程在不同時刻存在的不同狀態,分成了這樣幾類:
1)運行態:此時進程或者正在運行,或者準備運行。R
2)等待態:此時進程在等待一個事件的發生或某種系統資源。
a)可中斷: 處在這種狀態下的進程可以被信號中斷,接收到信號或被顯示地喚醒呼叫,喚醒之后,進程將轉變為運行態。S
b)不可中斷:它不會處理信號,只有在它所等待的事件發生時,進程才被顯示的
喚醒 D
3)停止態:此時進程被暫停,當收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信號,會進入暫停狀態。T
4)僵尸態:這是一個已終止的進程,但還在進程向量數組中占有一個task_struct結構。Z
僵尸有什么特性?
占空間、不起作用,每一個進程都有PCB,描述進程的信息,進程退出時PCB還存在,存放著進程的狀態,死亡的狀態等,所以程序結束之后PCB還存在,內核棧也存在(內核棧:大小為4k-8k,保存在3g-4g的空間,系統調用函數是需要棧的,而這個棧就是是內核棧)內核棧是占空間的,所以如果僵尸態的進程多了的話,是要消耗資源的,
僵尸進程是怎么產生的?
子進程先退出,父進程沒有收尸,那子進程就是僵尸進程
父進程退出后,子進程存在,那子進程就是孤兒進程, 那子進程的父進程就是init進程,
init是系統啟動后的用戶進程,其中還有一個0號進程,它是系統上電后,由0號進程產生init進程
5)死亡態: 這是終狀態,父進程調用wait函數將子進程回收。瞬間發生,程序員不
可見 X
狀態的顯示可以使用man ps查看到
< high-priority (not nice to other users) 高優先級
N low-priority (nice to other users) 低優先級
L has pages locked into memory (for real-time and custom IO) 頁面鎖定在內存(實時或定制的IO)
s is a session leader會話組的組長
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) 進程中包含線程
+ is in the foreground process group. 前臺進程
以上便是我對進程相關內容的一些理解,現在分享給大家,如果存在質疑的地方請主動提出。