歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux基礎知識 >> linux進程概論

linux進程概論

日期:2017/3/2 17:14:06   编辑:Linux基礎知識

1操作系統幾大模塊

  進程管理,進程調度,進程間通訊機制,內存管理,中斷異常處理,文件系統,I/O系統,網網絡部分。

2操作系統的目的

  管理硬件設備,為上層應用程序提供良好的執行環境。

3linux系統基本結構

進程描述PCB

廣義上,所有的進程信息被放在一一個叫做進程控制塊的數據結構中,可以理解為進程屬性的集合。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機制或者戲夠函數機。

且,注冊順序與執行順序相反。類似析構過程

Copyright © Linux教程網 All Rights Reserved