1.為什么計算機操作系統(tǒng)要引進(jìn)進(jìn)程 在操作系統(tǒng)中引入進(jìn)程的目的是為了使多個程序并發(fā)執(zhí)行 ,以改善資源利用率及提高系統(tǒng)吞吐量。
2.進(jìn)程的概念 進(jìn)程是程序的一次執(zhí)行,進(jìn)程是擁有資源的最小單位和調(diào)度單位(在引入線程的操作系統(tǒng)中,線程是最小的調(diào)度單位)
進(jìn)程又稱任務(wù),是一個動態(tài)的使用系統(tǒng)資源、處于活動狀態(tài)的應(yīng)用程序。
3.進(jìn)程由什么組成 進(jìn)程由進(jìn)程控制塊(PCB),數(shù)據(jù),程序3部分組成。其中PCB是進(jìn)程的靈魂。
進(jìn)程控制塊PCB中包含了進(jìn)程的所有信息,主要包括進(jìn)程PID、進(jìn)程所占有的內(nèi)存區(qū)域、文件描述符和進(jìn)程環(huán)境等信息。
4.進(jìn)程的狀態(tài) 進(jìn)程的三種最基本的狀態(tài)是:運行態(tài)(running),等待態(tài)(readying), 阻塞態(tài)(block)
#define TASK_RUNNING 0 //運行狀態(tài)
#define TASK_INTERRUPTIBLE 1 //等待狀態(tài)(可被中斷)
#define TASK_UNINTERRUPTIBLE 2 //等待狀態(tài)(不可被中斷)
#define TASK_STOPPED 4 //停止?fàn)顟B(tài)
#define TASK_ZOMBIE 8 //睡眠狀態(tài)
#define TASK_DEAD 16 //僵死狀態(tài)
5.進(jìn)程和程序的區(qū)別 進(jìn)程是動態(tài)的,程序是靜態(tài)的。
進(jìn)程時運行中的程序,程序是一些保存在硬盤上的可執(zhí)行的代碼。
6.進(jìn)程的優(yōu)缺點優(yōu)點
使多個程序并發(fā)執(zhí)行
缺點
程序并發(fā)執(zhí)行時付出了巨大的時空開銷,每個進(jìn)程在進(jìn)行切換時身上帶了過多的“累贅”導(dǎo)致系統(tǒng)效率降低。
于是人們?yōu)榱私鉀Q這個缺點想到讓進(jìn)程在并行時不擁有資源---從而引入了線程的概念:即線程本身不擁有資源或者是很少的資源,進(jìn)程只是擁有資源的基本單位,線程是調(diào)度的基本單位
引入線程減少程序并發(fā)執(zhí)行時所付出的時空開銷,使操作系統(tǒng)具有更好的并發(fā)性。
7.進(jìn)程的表示 在 Linux 內(nèi)核內(nèi),進(jìn)程是由相當(dāng)大的一個稱為 task_struct 的結(jié)構(gòu)表示的。此結(jié)構(gòu)包含所有表示此進(jìn)程所必需的數(shù)據(jù),此外,還包含了大量的其他數(shù)據(jù)用來統(tǒng)計(accounting)和維護與其他進(jìn)程的關(guān)系(父和子)。對 task_struct 的完整介紹超出了本文的范圍,以下代碼給出了 task_struct 的一小部分。這些代碼包含了本文所要探索的這些特定元素。task_struct 位于 ./linux/include/linux/sched.h。
task_struct 的一小部分
- struct task_struct {
- volatile long state;
- void *stack;
- unsigned int flags;
- int prio, static_prio;
- struct list_head tasks;
- struct mm_struct *mm, *active_mm;
- pid_t pid;
- pid_t tgid;
- struct task_struct *real_parent;
- char comm[TASK_COMM_LEN];
- struct thread_struct thread;
- struct files_struct *files;
- ...
- };
詳見《
Linux2.25進(jìn)程結(jié)構(gòu)task_struct 》
8.進(jìn)程分配 Linux 內(nèi)所有進(jìn)程的分配有兩種方式。第一種方式是通過一個哈希表,
由 PID 值進(jìn)行哈希計算得到;第二種方式是
通過雙鏈循環(huán)表。循環(huán)表非常適合于對任務(wù)列表進(jìn)行迭代。由于列表是循環(huán)的,沒有頭或尾;但是由于 init_task 總是存在,所以可以將其用作繼續(xù)向前迭代的一個錨點。讓我們來看一個遍歷當(dāng)前任務(wù)集的例子。
任務(wù)列表無法從用戶空間訪問,解決方法詳見《文獻(xiàn)3》。
9.程序轉(zhuǎn)化為進(jìn)程通常需要經(jīng)過以下步驟:
內(nèi)核將程序讀入內(nèi)存,為程序分配內(nèi)存空間
內(nèi)核為該進(jìn)程分配進(jìn)程標(biāo)識符(PID)和其他資源
內(nèi)核為該進(jìn)程保存PID及相應(yīng)的狀態(tài)信息,把進(jìn)程放到運行隊列中等待執(zhí)行。程序轉(zhuǎn)化為進(jìn)程后就可以 被操作系統(tǒng)的調(diào)度程序執(zhí)行了。
10.進(jìn)程的內(nèi)存映像 進(jìn)程的內(nèi)存映像是指內(nèi)核在內(nèi)存中如何存放可執(zhí)行程序文件 。在將程序轉(zhuǎn)化為進(jìn)程的過程中,操作系統(tǒng)將可執(zhí)行程序由硬盤復(fù)制到內(nèi)存中。
linux下程序映像的一般布局如下:(從低地址到高地址)
1>代碼段:代碼段是只讀的,可被多個進(jìn)程共享。
2>數(shù)據(jù)段: 存儲已被初始化的變量,包括全局變量和已被初始化的靜態(tài)變量。
3>未初始化數(shù)據(jù)段:存儲未被初始化的靜態(tài)變量,它也被稱為bss段
4>堆:用于存放程序運行中動態(tài)分配的變量
5>棧:用戶函數(shù)調(diào)用,保存函數(shù)的返回地址,函數(shù)的參數(shù),函數(shù)內(nèi)部定義的局部變量。
參考文獻(xiàn)1.Linux進(jìn)程學(xué)習(xí)總結(jié).http://www.linuxidc.com/Linux/2011-02/32125.htm
2.linux獲取進(jìn)程信息函數(shù).http://blog.csdn.net/jpcfei/article/details/6288467
3.Linux 進(jìn)程管理剖析.http://www.ibm.com/developerworks/cn/linux/l-linux-process-management/