父子进程与fork函数
一.父進程與子進程
進程id (PID)
父進程id(PPID)
二.系統調用創建進程-fork函數
fork創建子進程,fork之前的代碼被父進程執行,fork之后的代碼,默認情況下被父子進程都可以執行;fork之后,父子進程代碼共享,數據各自開辟空間,私有一份(采用寫時拷貝)
fork( )創建子進程操作系統做了什么?系統內存多了一個進程,先描述再組織;子進程執行的數據和代碼來源是父進程
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函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友nc很慢跟java_大家觉得用友NC
- 下一篇: Linux中关于API函数与系统调用