日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

父子进程与fork函数

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 父子进程与fork函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.父進程與子進程

進程id (PID)
父進程id(PPID)

#include <stdio.h> #include <sys/types.h> #include <unistd.h>int main() {printf("pid: %d\n",getpid());printf("ppid: %d\n",getppid());return 0; }

二.系統調用創建進程-fork函數

fork創建子進程,fork之前的代碼被父進程執行,fork之后的代碼,默認情況下被父子進程都可以執行;fork之后,父子進程代碼共享,數據各自開辟空間,私有一份(采用寫時拷貝)
fork( )創建子進程操作系統做了什么?系統內存多了一個進程,先描述再組織;子進程執行的數據和代碼來源是父進程

#include <stdio,h> #inculde <sys/types.h> #include <unistd.h>int mian() {int ret=fork();printf("hello proc: %d!,ret: %d\n",getpid(),ret);sleep(1);return 0; }

fork之后就有2個進程,這兩個進程誰先被調度不確定,要看操作系統的調度算法

1.fork函數初識

進程調用fork函數,當控制轉移到內核中的fork代碼后,內核做:分配新的內存塊和內核數據結構給子進程,將父進程部分數據結構內容拷貝至子進程,添加子進程到系統進程列表當中,fork返回開始調度器調度

2.fork函數返回值

fork函數會有兩次返回值,給父進程返回子進程的pid(本質是用來區分子進程),給子進程返回0
父子進程立場:父進程不需要標識,子進程需要標識,子進程是要執行任務的,父進程需要區分子進程,子進程不需要
如何理解fork有兩個返回值的問題?
pid_t fork()
{
1.拷貝來自父進程,形成子進程對應的數據結構
task_struct,mm_struct,頁表,文件,其他信息
2.操作系統也要管理子進程,描述+組織
task_struct鏈接進入系統的進程列表中
add task_struct cpu_runqueue
3.走到這里操作系統能看到多了一個task_struct,多個進程從這里開始,子進程創建完成
return pid;
}

3.寫時拷貝

通常父子代碼共享,父子進程在不寫入時,數據也是共享的,當任意一方試圖寫入,便以寫時拷貝的方式各自一份副本(這里的共享指父子進程對應的頁表指向的是同一塊物理內存)

為什么要寫時拷貝?
1.進程具有獨立性,父子進程也如此
2.不在創建時就分開因為子進程不一定會使用父進程所有的數據寫入本質需要的時候:按需分配,延時分配(本質可以更高效使用任何內存空間)

4.fork常規用法

一個父進程希望復制自己,使父子進程同時執行不同的代碼段,比如父進程等待客戶端請求,生成子進程來處理請求。一個進程要執行一個不同的程序,例如子進程從fork返回后,調用exe函數

5.fork調用失敗的原因

系統中有太多的進程,實際用戶的進程數量超過了限制

總結

以上是生活随笔為你收集整理的父子进程与fork函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。