程序概念

程序概念

1,孤兒程序:
父程序已經執行結束,但是子程序依然在執行時,子程序被稱為孤兒程序。孤兒程序會被1號祖父程序接管。
程式示例:

   #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
if(pid==0)
{
int i =0;
for(i=0;i<10;i  )
{
printf("pid: %d,ppid: %d\n",getpid(),getppid());
}
}
else if(pid>0)
{
printf("pid: %d,ppid: %d\n",getpid(),getppid());                                                                                                                                                       
sleep(3);
exit(1);
}
else
{
printf("fork");
return 1;
}
return 0;
}
~          

執行結果:
這裡寫圖片描述

從執行結果我們可以看到,起初子程序5071的父程序為5070,在父程序退出後,其由1號程序接管,父程序變為1號程序。

2,殭屍程序
殭屍程序就是子程序已經退出,但是父程序依然在等待,並且沒有收到子程序的退出碼.
程式示例:

   #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid = fork();
if(pid<0)
{
printf("fork");
return 1;
}
else if(pid>0)
{
printf("pid:%d ppid:%d\n",getpid(),getppid());
sleep(30);
}
else
{
printf("pid:%d ppid:%d\n",getpid(),getppid());
sleep(5);
exit(1);                                                                                                                                                       
}
}

這裡寫圖片描述

我們可以看到,程序5561變為了z狀態 ,也就是殭屍狀態。

殭屍程序的危害:
殭屍程序會導致記憶體洩漏,
殭屍程序的父程序會一直等待其返回。
殭屍程序也有pcb,也需要資源和作業系統的維護,會導致電腦變卡。

虛擬記憶體機制:
子程序通過父程序fork()來建立。子程序以父程序有相同的程式碼。但是通過寫時拷貝的技術讓其擁有不同的資料空間。

程式碼示例:

  1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 
5 int g_val = 10;
6 int main()
7 {
8     pid_t pid = fork();
9 
10     if(pid<0)
11     {
12         printf("fork");
13         return 1;
14     }
15     else if(pid>0)
16     {
17         printf("pid:%d, ppid:%d, g_val:%d, &g_val:%p\n",getpid(),getppid(),g_val,&g_val);
18         sleep(3);
19     }
20     else
21     {
22         g_val = 23;
24         printf("pid:%d, ppid:%d, g_val:%d, &g_val:%p\n",getpid(),getppid(),g_val,&g_val);                                                                              
25         sleep(1);
27     }
28 }
~                                                                                                                                                                          

這裡寫圖片描述

我們可以看到,g_val的值在子程序中被修改為23,但是他的地址卻與父程序中g_val的地址相同,顯然與我們上面說的父子程序享有獨立的資料空間不同。這是為什麼呢?
在程序中,有一個虛擬記憶體機制,程序建立後是在虛擬記憶體上建立,然後虛擬記憶體通過頁表對映到實體記憶體。我們說的父子程序用的不同地址空間時指在屋裡記憶體上的不同,而列印出的是虛擬記憶體的地址,r如圖:
這裡寫圖片描述
從圖中我們可以看出,每個程序都會對應一個虛擬記憶體空間,而列印出的是虛擬記憶體空間的地址。實際儲存的是實體記憶體。