1. 程式人生 > >Linux Guard Service - 守護進程再次分裂子進程

Linux Guard Service - 守護進程再次分裂子進程

inline attribute 兩個 丟失 close 入隊 變量 最大 linux

當系統區內存不能再申請新進程的時候申請會失敗

在512MB內存下最多分配的子進程數

3331

[root@localhost 05]# ./test5-1 50000
expect 50000 sub process
[root@localhost 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 3331 

[root@localhost 05]# pkill test5-1

在1024MB內存下最多分配的子進程數

7364

[root@localhost 05]# ./test5-1 50000
expect 50000 sub process
[root@localhost 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 7364 
pkill test5-1
[root@localhost 05]# 

在1024MB內存下最多分配的子進程數

14106

[root@localhost 05]# ./test5-1 50000
expect 50000 sub process
[root@localhost 05]# 1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
1000 sub process attributed
pid attribute failed!
Total sub process 14106 
    

由於子進程和父進程共享fork()之間的部分變量,所以在子進程中記錄最大pid能夠在父進程中讀取。

last_pid=getpid();
......
fprintf(pfile,"mainline staying\n");

讓小內存條件下的系統下分裂超量的子進程

使用排隊的方法,等待舊的進程等待完畢後使用

signal(SIGCHLD,SIG_IGN);

自動釋放,然後在父進程中

while(pid<0){
        sleep(1);
        printf("Waiting old process abort...\n");
        pid=fork();
}

保持等待,就能排隊申請完所有進程

如果進程是系統級的,排隊時可能導致-bash訪問困難,例如

[root@localhost 05]# pkill test5-2

這種多線程指令可能會出現短期內無法響應的情況(提示bash fork),但是指令會被保存在終端輸入隊列,操作系統會“伺機”完成這條指令

使用兩個變量記錄釋放子進程和回收子進程

如果要記錄釋放子進程的數量,則不能再使用信號通道函數,改用

pid_t waitpid(-1,NULL,WNOHANG);

在父進程的死循環內,反復設置這個函數用以回收僵屍進程

else{
        printf("Total sub process %d \n",att);
        printf("last pid is %d\n",pid);
        while(1){
                if(waitpid(-1,NULL,WNOHANG)>0) sub_abor++;
                printf("sub attr:%d, sub abor:%d\n",sub_attr,sub_abor);

                pfile=fopen("test5-1.log","a");
                fprintf(pfile,"mainline staying\n");
                fclose(pfile);
                sleep(1);
        }
}

在極限操作後,Linux系統還能正常工作嗎?

Redhat是可以正常工作的,只是相應的隊列操作的相應在內存不足的情況下所有輸入隊列需要排隊。在內存響應來不及的情況下,-bash進程會把操作放入隊列中,伺機把指令送入系統執行。送入失敗則等待下一次嘗試,嘗試多次之後可能出現資源無法使用的情況。因此可以說操作有可能丟失。(鍵盤上的非ANSI按鍵如方向鍵,Backspace等將不能正常顯示

Linux Guard Service - 守護進程再次分裂子進程