程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 進程詳解

進程詳解

編輯:C++入門知識

以下內容為<<linux內核編程>>讀書筆記

進程與程序
1. 進程是程序執行的基本單位,程序是有若干函數組成的可執行文件,而進程指的是特定程序的一個實例

2. 程序包括:文本段,數據段,棧,堆,文本段存放CPU所致型的指令;數據段存放進程操作的所有數據變量;棧存放自動變量和函數數據;堆存放動態內存分配的數據;

當進程創建時,子進程收到父進程的數據副本,包括數據空間,堆,棧和進程描述符。

以下為創建進程的實例:


 

#include <sys/types.h>  
#include <stdio.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
 
int main(void) 
{ 
    int fd; 
    int pid; 
 
    pid = fork();   //創建進程  
    if(pid==0) 
    { 
        execle("/bin/ls", NULL); 
        exit(2); 
    } 
    if(waitpid(pid) < 0) 
        printf("wait error\n"); 
    pid = fork(); 
    if(pid==0) 
    { 
        fd=open("otc/otc.c", O_RDONLY); 
        close(fd); 
    } 
    if(waitpid(pid)<0) 
        printf("wait error\n"); 
    return 0; 
} 

#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
 int fd;
 int pid;

 pid = fork();   //創建進程
 if(pid==0)
 {
  execle("/bin/ls", NULL);
  exit(2);
 }
 if(waitpid(pid) < 0)
  printf("wait error\n");
 pid = fork();
 if(pid==0)
 {
  fd=open("otc/otc.c", O_RDONLY);
  close(fd);
 }
 if(waitpid(pid)<0)
  printf("wait error\n");
 return 0;
}

這個程序定義了一個執行上下文。進程的上下文由PSW,寄存器,內存和文件中存儲的值組成。而進程管理的特征存放在一個單獨的數據結構:進程描述符 中


進程描述符
進程描述符:task_struct,內核采用循環雙向鏈表task_list來采用存放所有進程描述符,並借助全局變量current來存放當前運行進程的task_struct的引用

以下是進程描述符必須記錄的信息:

進程的屬性,進程間的關系,進程的內存空間,文件管理,信號管理,進程的信任狀,資源限制,與調度相關的字段

與進程屬性相關的字段
1. state,用於記錄進程的狀態,在其執行生命周期內,其可能的值:TASK_RUNNING,TASK_INTERRUPTIBLE,TASK_UNINTERRUPTIBLE,TASK_ZOMBLE,TASK_STOPPED,TASK_DEAD
2. pid,每個進程都有一個唯一的進程標識符,類型為pid_t,其實為短整型
3. 標志,定義的是進程的特殊屬性
4. binfmt,exit_code等
與調度相關的字段
多個進程共享一個CPU,調度程序為每個進程分配一個時間片和優先級來實現公平,高效的調度。時間片定義了一個進程被切換掉,運行另一個進程之前二允許運行的時間長度。進程的優先級則是一個數值,它定義了相對其他就緒進程而言,進程被允許執行的相對順序。
prio,static_prio(nice值)
run_list:准備運行的進程隊列,policy等等


進程間相互關系的字段
每一個進程都有一個創建它的父進程p,而p也可能有兄弟進程
1. real_parent,指向當前進程的父進程的進程描述符
2.parent:指向其父進程描述符的指針
3.children:指向當前進程 的子進程列表的struct
4.sibling:指向當ianjincheng的兄弟進程列表的struct
5.greoup_leader:每個進程組的組長的類型


與進程信任狀相關的字段
1.uid和gid:uid存放創建改進成的用戶的ID,gid是該進程所在進程組的組ID
2. euid和egid suid和sgid 等


與文件系統及地址空間相關的字段
進程總是通過執行打開,關閉,讀,寫文件按這樣的任務與文件密切相關;
fs 字段保存一個指向文件系統信息的指針
files 保存一個指向進程的文件描述符表的指針                                
mm 指向與地址空間及內存管理相關的信息


進程的創建:系統調用fork(),vfork,clone()
fork函數
fork函數返回2次,一次是在父進程,一次是在子進程,如果在子進程中返回,將返回0,如果在父進程中返回,將返回子進程的PID。當fork函數調用時,該函數把包括該系統調用表索引表在內的一些必要信息放入適當的寄存器,系統調用表中存放系統調用的指針有處理器來決定將這些信息放入哪個寄存器中
fork函數調用的是do_fork函數


vfork函數
vfork的父進程已知阻塞,知道子進程調用exit()或exec()為止
clone函數把一個指向函數的指針和該函數的參數作為自己的參數


進程的生命周期
進程所處的第一個狀態是TASK_INTERRUPTIBLE,這是在由do_fork()調用的copy_process()歷程中創建進程時設置的,進程的第二個狀態是TASK_RUNNING,這是在退出do_fork之前的設置的,最後一個狀態是TASK_ZOMBIE,這是在do_exit期間被設置的
就緒態 -> 運行態    被調度程序選中
運行態 -> 就緒態    時間片用完,進程讓出CPU
阻塞態 ->  就緒態   信號到來,或等待的資源變為可用的
運行態 -> 就緒態    進程睡眠或等待事件


進程的終止
主動終止進程:從main函數返回,調用exit
被動終止進程:進程可能收到自己不能處理的一個信號
當今成在內核態執行時可能產生一個異常
進程可能和搜到了SIGABRT信號或其他終止信號


當子進程先於父進程終止,則子進程編程一個僵屍進程,直到父進程調用wait或waitpid為止
當子進程在父進程之後終止,則該子進程將成為孤兒進程,知道init進程收養該子進程


wait函數的作用:獲知進程消亡的信息,消除進程的所有痕跡

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved