歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux進程(一)概述和進程描述符

linux進程(一)概述和進程描述符

日期:2017/3/1 13:53:32   编辑:關於Linux
linux進程(一)概述和進程描述符 一 進程概述: (1)進程和線程區別: *進程是資源分配的基本單位,也是調度運行的基本單位;線程是調度的基本單位。 *進程有獨立的虛擬地址空間。父子進程共享文件表,但不共享用戶地址空間。 *優點:一個進程崩潰後不會對其他進程產生影響。 *缺點:進程間共享數據變得困難,必須使用顯式的IPC機制。 *進程虛擬地址空間包括:代碼段、堆棧段(臨時數據:如函數參數、返回地址和局部變量)、數據段(包括全局變量)、堆(動態分配的內存)等等。 *線程運行在進程的上下文中,所有運行在一個進程內的線程共享該進程的整個虛擬地址空間:代碼、數據、堆、共享庫和打開文件。 *每個線程有自己的線程上下文:一個線程ID、棧、棧指針、程序計數器、通用目的的寄存器和條件嗎。 *創建、切換和終止開銷小:線程的上下文比進程的上下文小很多,所以線程的創建、上下文切換和終止要比進程快很多。 *線程間共享數據容易,因為多個線程共享進程地址空間,但需要同步。 (2)進程和程序區別: *程序本身不是進程,程序只是被動實體,如存儲在磁盤上的一系列指令的文件內容(常被成為可執行文件)。 *進程是活動實體,它有一個程序計數器來表示下一個要執行的命令和相關資源集合。 *當一個可執行文件被裝入內存時,一個程序才成為進程。 *雖然多個進程可以與統一程序相關,但是它們被當做兩個獨立的執行序列,都是獨立的進程,雖然文本段相同,但是數據段、堆、堆棧段都不同。 (3)進程組成部分: *進程控制塊:由os創建和管理,包含os需要的所有關於進程的信息,主要包含:進程標識信息、處理器狀態信息和進程控制信息。 *程序段:即文本段,是進程的組成部分之一。 *數據段:和程序段相關的數據集。 (4)進程的虛擬地址空間:進程的地址空間被分成為各種內存區或叫做段。 *text:代碼段,存放程序的可執行命令。 *data:存放已初始化數據。 *BSS:存放未初始化數據。 *堆:用於擴展進程的線性地址空間。 *棧:包含所有已分配內存的局部變量,用作函數調用。 (5)和進程上下文(context)和上下文切換: *進程上下文:包括程序計數器、寄存器(狀態寄存器等)、用戶棧、內核棧和各種內核數據結構。 *上下文切換:保存當前進程上下文,恢復新進程上下文,然後將控制權交給新進程。 (6)內核態和用戶態: *進程在生命周期內,或者執行自己的代碼或者執行內核代碼。內核代碼是在系統調用被執行時、異常發生時或者中斷到來時(中斷執行程序中)執行的代碼。 *進程執行的不是內核代碼,則進程正運行在用戶態;如果進程執行內核代碼,則進程處於內核態。 *處理器通常使用某個控制器中的一個模式位來提供這種功能,該寄存器描述了當前進程享有的特權。當設置了模式位時,進程就運行在內核模式中。 *內核態的進程可以執行指令集中的任何指令,並且訪問系統中任何存儲器的位置;用戶態的進程不允許執行特權指令,比如:停止處理器、改變模式位、或者發起一個IO操作,也不允許用戶態進程直接引用地址空間中內核區的代碼和數據,用戶程序必須通過系統調用接口間接的訪問內核代碼和數據。 (7)用戶棧和內核棧: *內核在創建進程時,在創建task_struct的同時為進程創建相應堆棧,每個進程會有兩個棧,一個用戶棧存在於用戶空間;一個內核棧存在於內核空間。 二 進程描述符: (1)綜述: *在內核中,進程描述符是一個名為task_struct的結構體,該結構體定義於/usr/src/linux/include/linux/sched.h中,用於存放進程的屬性和信息,與進程相關的所有內核信息都存儲在這個結構體中。 *內核采用循環雙向鏈表task_list來存放所有進程描述符,並借助全局變量current來存放當前運行進程的task_struct的引用。 *進程可能由一個或多個線程組成,每個線程都對應於一個task_struct,在一般進程,線程共享相同的內存地址空間。 (3)進程屬性相關字段: *state:記錄進程的狀態,可能值為TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE、TASK_ZOMBIE、TASK_STOPPED和TASK_DEAD. *pid:每個進程都有唯一的進程標識符pid。pid_t類型是short int,pid默認最大值為32768。
Copyright © Linux教程網 All Rights Reserved