一、程序辨別
OS會為每個程序配置設定一個唯一的整型ID,做為程序的辨別号(pid)。程序除了自身的ID外,還有父程序ID(ppid),所有程序的祖先程序是同一個程序,它叫做init程序,ID為1,init程序是核心自舉後的一個啟動的程序。init程序負責引導系統、啟動守護(背景)程序并且運作必要的程式。
雖然程序ID是唯一的,但是程序ID是可複用的。當一個程序終止後,其程序ID就成為複用的候選者。
系統中有一些專用程序,但具體細節随實作而不同。ID為0的程序通常是排程程序,常常被稱為交換程序。該程序是核心的一部分,它并不執行任何磁盤上的程式,是以也被稱為系統程序。
程序的辨別号(pid)和父程序ID(ppid)可以分别通過函數getpid()和getppid()獲得(傳回值都是整型的)。
二、程序的使用者ID與組ID(程序的運作身份)
程序在運作過程中,必須具有一類似于使用者的身份,以便進行程序的權限控制,預設情況下,哪個登入使用者運作程式,該程式程序就具有該使用者的身份。例如,假設目前登入使用者為gotter,他運作了ls程式,則ls在運作過程中就具有gotter的身份,該ls程序的使用者ID群組ID分别為gotter和gotter所屬的組。這類型的ID叫做程序的真實使用者ID和真實組ID。真實使用者ID和真實組ID可以通過函數getuid()和getgid()獲得(傳回值都是整型的)。
與真實ID對應,程序還具有有效使用者ID和有效組ID的屬性,核心對程序的通路權限檢查時,它檢查的是程序的有效使用者ID和有效組ID,而不是真實使用者ID和真實組ID。預設情況下(系統預設情況),使用者的(有效使用者ID和有效組ID)與(真實使用者ID和真實組ID)是相同的。有效使用者id和有效組id通過函數geteuid()和getegid()獲得(傳回值都是整型的)。
#include <unistd.h>
pid_t getpid() //傳回值:調用程序的程序ID
pid_t getppid() //傳回值:調用程序的父程序ID
uid_t getuid() //傳回值:調用程序的實際使用者ID
uid_t geteuid() //傳回值:調用程序的有效使用者ID
gid_t getgid() //傳回值:調用程序的實際組ID
gid_t getegid() //傳回值:調用程序的有效組ID
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
printf("pid:%d ppid:%d\n",getpid(),getppid());
printf("uid:%d euid:%d\n",getuid(),geteuid());
printf("gid:%d egid:%d\n",getgid(),getegid());
return 0;
}
PS:用ps -elf可以檢視現有程序
ps -elf | grep pidname 檢視程序pid
kill -9 pidname 殺掉程序
将編譯後的可執行檔案的權限改為“s”(s的含義:将可執行程式的權限上升到root,比如密碼的修改。在賦予s權限的時候,必須確定程式有x權限,是可執行程式,否則s權限不能生效,顯示為大寫的S)
三、程序狀态
程序是程式的執行過程,根據它的生命周期可以劃分成3種狀态: 1、執行态:該程序正在運作,即程序正在占用CPU。 2、就緒态:程序已經具備執行的一切條件,正在等待配置設定CPU的處理時間片 3、等待态:程序不能使用CPU,若等待事件未發生(等待的資源配置設定到)則可将其喚醒。
排程政策:(具體請參考作業系統) OTHER :普通排程政策 實時排程政策: FIFO:先進先出 RR:時間片輪轉
四、Linux下的程序結構
Linux系統是一個多程序的系統,他的程序之間具有并行性、互不幹擾等特點。也就是說,程序之間是分離的任務,擁有各自的權利和責任。其中,每個程序都運作在各自獨立的虛拟位址空間是以,即使一個程序發生了異常,它也不會影響到系統的其他程序。 Linux中的程序包含3個段,分别為“資料段”、“代碼段”和“堆棧段”。 1、“資料段”放全局變量、常數以及動态資料配置設定的資料空間。資料段分成普通資料段(包括可讀可寫/隻讀資料段,存放靜态初始化的全局變量或常量)、BSS資料段(存放未初始化的全局變量)以及堆(存放動态配置設定的資料)。 2、“代碼段”存放的是程式代碼的資料(不可改寫)。 3、“堆棧段”存放的是子程式的傳回位址、子程式的參數以及程式的局部變量等。(每執行一個函數就配置設定一個棧,函數結束,棧就消失)
系統運作的核心線程都在核心程序(硬體),平時寫的程式都運作在使用者态,使用者要想進入核心态必須通過系統調用接口。
五、Linux下的程序管理
備注: 程序process是os的最小單元,os會為每個程序配置設定大小為4G的虛拟記憶體空間,其中1G給核心空間,3G給使用者空間(代碼區,資料區,堆棧區) ps檢視活動程序,ps -aux檢視所有的程序 ps -aux|grep aa 查找指定(aa)程序 ps -ef可以顯示父子程序關系 top顯示前20條程序,動态的改變 ps -aux看%cpu(cpu使用量)%mem(記憶體使用量) stat(狀态)(S睡眠 T暫停(和S一起在等待隊列裡) R運作 Z僵屍) 程序進入死循環時,按Ctrl+z可以把程式暫停(向程序發送一個SIGSTOP暫停信号,kill -l檢視信号),再執行[bg 作業ID]可以将該程序帶入背景。利用jobs可以檢視背景任務,fg 1把背景任務帶到前台,這裡的1辨別作業ID。
指令:
對應的狀态