亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

淺談Linux vfork與fork簡單對比分析

2024-09-05 23:04:23
字體:
來源:轉載
供稿:網友

本文分享了Linux vfork與fork簡單對比分析,分享給大家,具體如下:

fork相關問題:

一、fork基礎了解

fork作用為創建一個子進程,在使用了fork命令后,內核會分配新的內存塊和數據結構給子進程,并且將父進程的部分數據結構內容拷貝到子進程,最后再將子進程添加到系統進程列表中,添加完成后fork返回,開始調度。

頭文件:#include < unistd.h >

函數原型:pid_t fork( )

返回值:返回值大于0則當前進程為父進程,等于0代表為子進程,小于零代表創建子進程失敗。

通過一個例子來了解:

  #include <stdio.h>  #include <unistd.h>        int main()  {    int tmp = 5;    pid_t res = fork();    if(res < 0){     //fork失敗     perror("fork");   }else if(res == 0){     //該進程為子進程     printf("im child[%d],fasther is %d,tmp is %d./n",getpid(),getppid(),tmp++);   }else{     //該進程為父進程     printf("im father[%d],tmp is %d./n",getpid(),tmp++);   }   printf("tmp = %d/n",tmp);   return 0; }     

運行結果:

im father[3128],tmp is 5.
tmp = 6
im child[3129],fasther is 1,tmp is 5.
tmp = 6

相關問題小結:

通過結果很明顯的能看出本次調用中,先執行父進程,對應pid為3128,在父進程中tmp++,所以輸出為6;關鍵問題在于子進程,有兩個關鍵點。

①為什么結果中子進程父親pid為1:通過輸出我們能看出父進程先執行完成后才執行的子進程,也就是說當子進程執行時父進程已結束,此時該子進程相當于一個孤兒進程,被pid為1也就是Init進程所管理,所以子進程的ppid為1;

②為什么子進程最后輸出tmp值還為6: fork進程采用的是寫時拷貝,父子進程一開始共享一片內存區域,但是只有有一方要對數據進行修改,則再開辟一塊空間,防止相互修改影響。所以在上述代碼中,雖說是一個tmp,其實內存中各自保留了一份值。

二、關于fork過程中寫時拷貝:

Linux,vfork與fork,vfork,fork,區別

Linux,vfork與fork,vfork,fork,區別

這下就不難看出,父子進程數據段和代碼段開始時是共享一塊對應的內存,當一方嘗試寫入時,便產生了寫時拷貝。需要注意的是:fork之前,父進程獨立執行,fork之后,父子兩個執行流分別執行,至于誰先執行,由調度器決定。可通過下面例子很明顯的看出是從fork之后才分別執行。

  #include <stdio.h>  #include <unistd.h>      int main()  {    int tmp = 5;    printf("There is fork before/n");    pid_t res = fork();   if(res < 0){     //fork失敗     perror("fork");   }else if(res == 0){     //該進程為子進程     printf("im child[%d],tmp is %d./n",getpid(),tmp++);   }else{     //該進程為父進程     printf("im father[%d],tmp is %d./n",getpid(),tmp++);   }   printf("tmp = %d/n",tmp);   return 0; }

輸出結果:

There is fork before

im father[3625],tmp is 5.

tmp = 6

im child[3626],tmp is 5.

tmp = 6

三、fork調用失敗的原因:

①系統中已經存在太多進程,無法再創建新的進程??赏ㄟ^ulimit -a命令查看當前所有的資源限制。

②內存不足,由于開辟每個新的進程都要分配一個PCB,并為新進程分配資源,內存都不足也就別提還想著再創建進程了。

vfork相關問題:

一、vfork基礎了解

<1>vfork創建新進程的主要目的在于用exec函數執行另外的程序,實際上,在沒調用exec或_exit之前子進程與父進程共享數據段。在vfork調用中,子進程先運行,父進程掛起,直到子進程調用exec或_exit,在這以后,父子進程的執行順序不再有限制。

頭文件:#include < unistd.h >

函數原型:pid_t vfork( )

返回值:返回值大于0則當前進程為父進程,等于0代表為子進程,小于零代表創建子進程失敗。

通過一個例子來了解:

 #include <stdio.h>  #include <unistd.h>    int tmp = 3;    int main()  {    pid_t res = vfork();    if(res < 0){     perror("vfork");     _exit();   }else if(res == 0){    tmp = 10; printf("child res = %d/n",tmp);     _exit(0);   }else{     printf("father res = %d/n",tmp);   }    return 0; }

輸出結果:

child res = 10

father res = 10

結果分析:正如上面所說的,子進程直接公用父進程的頁表,改變子進程的數據也會影響到父進程。

Linux,vfork與fork,vfork,fork,區別

<2>vfork用處:

vfork()跟fork()類似,都是創建一個子進程,這兩個函數的的返回值也具有相同的含義。但是vfork()創建的子進程基本上只能做一件事,那就是立即調用_exit()函數或者exec函數族成員,調用任何其它函數(包括exit())、修改任何數據(除了保存vfork()返回值的那個變量)、執行任何其它語句(包括return)都是不應該的。更需要注意的是:調用vfork()之后,父進程會一直阻塞,直到子進程調用_exit()終止,或者調用exec函數族成員。

<3>為什么只能用_exit退出:

exit()是對_exit()的封裝,它自己在調用_exit()前會做很多清理工作,其中包括刷新并關閉當前進程使用的流緩沖(比如stdio.h里面的printf等),由于vfork()的子進程完全共享了父進程地址空間,子進程里面的流也是共享的父進程的流,所以子進程里面是不能做這些事的。直接return就更不行了,子進程return以后,會從當前函數的外部調用點后面繼續執行,這后面子進程可能將會執行很多語句,結果就沒法預料了。在man手冊中也強調了這一點,必須使用_exit退出。

fork與vfork的區別

1.vfork保證子進程先運行,在它調用exec或exit之后父進程才可能被調度運行。如果在調用這兩個函數之前子進程依賴于父進程的進一步動作,則會導致死鎖。

2.fork要拷貝父進程的進程環境;而vfork則不需要完全拷貝父進程的進程環境,在子進程沒有調用exec和exit之前,子進程與父進程共享進程環境,相當于線程的概念,此時父進程阻塞等待。

為什么會有vfork呢?

因為以前的fork當它創建一個子進程時,將會創建一個新的地址空間,并且拷貝父進程的資源,然后將會有兩種行為:

1.執行從父進程那里拷貝過來的代碼段

2.調用一個exec執行一個新的代碼段

當進程調用exec函數時,一個新程序替換了當前進程的正文,數據,堆和棧段。這樣,前面的拷貝工作就是白費力氣了,這種情況下,聰明的人就想出了vfork。vfork并不復制父進程的進程環境,子進程在父進程的地址空間中運行,所以子進程不能進行寫操作,并且在兒子“霸占”著老子的房子時候,要委屈老子一下了,讓他在外面歇著(阻塞),一旦兒子執行了exec或者exit后,相當于兒子買了自己的房子了,這時候就相當于分家了。

因此,如果創建子進程是為了調用exec執行一個新的程序的時候,就應該使用vfork

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产精品久久久久久久| 亚洲成人a**站| 91美女福利视频高清| 一区二区欧美激情| 久久精品国产精品亚洲| 欧美日韩国产色| 国产精品aaaa| 亚洲一区二区在线| 欧美日韩中国免费专区在线看| 精品福利一区二区| 日韩中文字幕在线视频播放| 国产偷国产偷亚洲清高网站| 国产精品伦子伦免费视频| 久久免费成人精品视频| 精品亚洲aⅴ在线观看| 91香蕉嫩草神马影院在线观看| 中文字幕欧美国内| 成人激情免费在线| 欧美二区在线播放| 亚洲综合中文字幕在线观看| 亚洲欧洲午夜一线一品| 亚洲free嫩bbb| 国产一区二区视频在线观看| 色偷偷偷综合中文字幕;dd| 中日韩午夜理伦电影免费| 亚洲精品国产免费| 欧美中在线观看| 日本久久久a级免费| 欧美wwwwww| 国产精品视频在线播放| 欧美日韩ab片| 97视频在线观看网址| 97在线视频一区| 国产精品大陆在线观看| 亚洲精品国产拍免费91在线| 久久久亚洲影院你懂的| 日韩av综合网| 欧美视频专区一二在线观看| 欧美黄色片视频| 这里只有精品久久| 久久久99久久精品女同性| 日韩精品极品视频免费观看| 亚洲第一男人天堂| 日韩大片免费观看视频播放| 91精品久久久久久久久久入口| 97在线视频免费| 亚洲国产日韩欧美在线99| 欧美激情手机在线视频| 日韩av在线播放资源| 亚洲欧美三级在线| 一区二区三区回区在观看免费视频| 亚洲娇小xxxx欧美娇小| 精品国产欧美成人夜夜嗨| 欲色天天网综合久久| 最近2019中文字幕大全第二页| 欧美中文字幕精品| 91国产中文字幕| 亚洲天堂色网站| 97在线精品国自产拍中文| 中文国产成人精品| 久久精品国产精品| 久久韩剧网电视剧| 欧美国产日韩一区| 亚洲国产精品嫩草影院久久| 欧美亚州一区二区三区| 欧美精品激情视频| 成人午夜在线观看| 亚洲女人天堂色在线7777| 日本三级韩国三级久久| 国产精品免费一区二区三区都可以| 欧美性极品xxxx做受| 亚洲最大成人网色| 欧美最顶级的aⅴ艳星| 欧美午夜片在线免费观看| 51色欧美片视频在线观看| 成人黄色av播放免费| 欧美一级成年大片在线观看| 国产香蕉97碰碰久久人人| 久久亚洲国产精品| 欧美床上激情在线观看| 日韩风俗一区 二区| 久久青草福利网站| 日韩一区在线视频| 亚洲欧美日韩图片| 亚洲人成欧美中文字幕| 国产成人一区二| 日本一区二区不卡| 日韩免费在线视频| 日韩av一区二区在线观看| 中文字幕亚洲天堂| 欧美性高潮床叫视频| 亚洲2020天天堂在线观看| 中文字幕精品www乱入免费视频| 18性欧美xxxⅹ性满足| 在线成人中文字幕| 欧美限制级电影在线观看| 国产精品久久久久久久9999| 免费97视频在线精品国自产拍| 伊人久久久久久久久久久| 欧美一区二粉嫩精品国产一线天| 亚洲片国产一区一级在线观看| 欧洲日本亚洲国产区| 亚洲精品白浆高清久久久久久| 国产精品国产三级国产专播精品人| 色无极影院亚洲| 久久99热这里只有精品国产| 亚洲精品综合久久中文字幕| 91色琪琪电影亚洲精品久久| 国产成人精品视频在线观看| 日韩精品在线第一页| 亚洲国产精品yw在线观看| 久久亚洲精品一区| 亚洲第一av网| 欧美成年人视频网站欧美| 欧洲亚洲妇女av| 国产日韩中文字幕| 欧美乱大交xxxxx另类电影| 欧美日韩在线视频观看| 国产精品极品美女在线观看免费| 欧美www视频在线观看| 国产精品久久99久久| 欧美又大又硬又粗bbbbb| 97精品视频在线观看| 国产精品久久久久久久久免费| 久久久久久久激情视频| 久久人人97超碰精品888| 国产激情视频一区| 亚洲高清久久久久久| 成人精品久久一区二区三区| 日韩欧美综合在线视频| 久久久久久久久久久人体| 亚洲成人精品av| 欧美中文字幕视频| 久久精品国产久精国产一老狼| 国产亚洲精品久久久久动| 精品国内产的精品视频在线观看| 综合欧美国产视频二区| 国产丝袜一区二区三区免费视频| 亚洲欧美在线一区二区| 国产精欧美一区二区三区| 国产性色av一区二区| 欧美最顶级丰满的aⅴ艳星| 欧美在线国产精品| 精品久久中文字幕久久av| 欧美激情一二区| 最近2019年手机中文字幕| 亚洲精品国产美女| 欧美日韩亚洲91| 国产精品一区二区三区成人| 久久久久久这里只有精品| 中文精品99久久国产香蕉| 日韩视频免费中文字幕| 搡老女人一区二区三区视频tv| 久久亚洲精品网站| 久久99国产精品自在自在app| 一本色道久久综合狠狠躁篇怎么玩| 97国产成人精品视频| 欧美日产国产成人免费图片| 国产成人97精品免费看片| 国产自产女人91一区在线观看| 欧美成人在线网站| 日韩中文综合网| 57pao成人永久免费视频| 国产精品久久久av|