進程管理,進程調度,進程間通訊機制,內存管理,中斷異常處理,文件系統,I/O系統,網網絡部分。
管理硬件設備,為上層應用程序提供良好的執行環境。
廣義上,所有的進程信息被放在一一個叫做進程控制塊的數據結構中,可以理解為進程屬性的集合。linux 下該結構偽task_struct
其中包含的基本信息
標示符 : 描述本進程的唯一一標示示符,用用來區別其他進程。
狀態 :任務狀態,退出代碼,退出信號等。
優先級 :相對於其他進程的優先級。
程序計數器:程序中即將被執行行的下一一條指令的地址。
內存指針:包括程序代碼和進程相關數據的指針,還有和其他進程共享的內存塊的指針。
上下文文數據:進程執行行時處理器的寄存器中的數據。
I/O狀態信息:包括顯示示的I/O請求,分配給進程的I/O設備和被進程使用用的文文件列表。
記賬信息:可能包括處理器時間總和,使用用的時鐘數總和,時間限制,記賬號等
保存進程信息的數據結構叫做 task_struct,並且可以在 include/linux/sched.h 裡裡找到它。所有運行行在系統裡裡的進程都以 task_struct 鏈表的形式存在內核裡裡。
進程的信息可以通過 /proc 系統文文件夾查看。要獲取PID為400的進程信息,你需要查看 /proc/400 這個文文件夾。大大多數進程信息同樣可以使用用top和ps這些用用戶級工具來獲取。
測試
這裡:setenv第三個參數為0時,如果環境變量存在,則不修改,直接返回。為非0 時,則如果存在,那麼修改
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
其中的S 是可中斷睡眠狀態(interruptible sleep),可以被喚醒的,而D狀態是不可終端睡眠(uninterruptible sleep),只有自己醒來或者關機動作終止睡眠。
僵死狀態(Zombies)是一一個比比較特殊的狀態。當進程退出並且父父進程(使用用wait()系統調
用用)沒有讀取到子子進程退出的返回代碼時就會產生生僵死進程。僵死進程會以終止止狀態保持
在進程表中,並且會一一直在等待父父進程讀取退出狀態代碼。
命令 kill,killall
kill -l 獲取具體的命令編號以及信息
具體用法請自行man kill
另外查看進程狀態的幾個命令是 ps pstree top
在ps 的列中有
PRI :代表這個進程可被執行行的優先級,其值越小小越早被執行
NI :代表這個進程的nice值。
PRI也還是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行行的先後順序,此值越小小進程的優先級別越高。
nice值了,其表示進程可被執行的優先級的修正數值。
PRI(new)=PRI(old)+nice
注: 這裡的nice值是對於運行中程序優先級的修正,所以參考點都是pri的預設值。而非當前值。
進程內存布局分為四個不同的段:
• 文文本段,包含程序的源指令。
• 數據段,包含了靜態變量。
• 堆,動態內存分區區域。
• 棧,動態增長與收縮的段,保存本地變量。
僵屍進程:一個子進程在其父進程沒有調用wait()或waitpid()的情況下退出。這個子進程就是僵屍進程。如果其父進程還存在而一直不調用wait,則該僵屍進程將無法回收,等到其父
進程退出後該進程將被init回收。
孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成為孤兒進程。孤兒進程將被init進程(進程號為1)所收養,並由init進程對它們完成狀態收集工作。
進程終止止
進程終止止的方方式有8種,前5種為正常終止止,後三種為異常終止止:
1 從main函數返回;
2 調用用exit函數;
3 調用用_exit或_Exit;
4 最後一一個線程從啟動例程返回;
5 最後一一個線程調用用pthread_exit;
6 調用用abort函數;
7 接到一一個信號並終止止;
8 最後一一個線程對取消請求做出響應。
(1)exit函數
#include <stdlib.h>
void exit( int status );
void _Exit( int status );
#include <unistd.h>
void _exit( int status );
exit()做相應的資源清理工作而後返回內核。其他兩個直接返回內核。
exit()和return返回效果一樣
2)atexit函數
#include <stdlib.h>
int atexit( void (*fun)( void ) );
用於注冊程序結束時運行方法,類似與sethandler機制或者戲夠函數機。
且,注冊順序與執行順序相反。類似析構過程