fork介紹,返回值問題,寫時拷貝,進程切換,子進程開始執行的位置,子進程的用途

目錄

fork

介紹

fork的返回值問題

介紹

fork()時,系統要做什么?

數據是否要獨立?

如果共享的話,就會出現問題!

寫時拷貝?

引入

介紹

舉例(fork返回值)

fork返回的值是什么?

創建失敗的原因

子進程執行位置從哪里開始

引入

進程切換

子進程執行的位置

子進程的用途


fork

介紹

  • fork()函數是一個系統調用,用于創建一個新的進程
  • 它會復制當前進程的內容,并在新進程中運行,當前進程是新進程的父進程,從而使父進程和子進程可以并行執行
  • 各自有自己的獨立地址空間,但它們可以共享一些資源,如文件描述符
  • 頭文件:<unistd.h>

fork的返回值問題

介紹

?

  • 當我們運行起來這個程序時,我們會發現,我們已經成功創建出了子進程(因為有兩個pid被打印出來,并且其中一個是另一個的父親)
  • 但是,我們仔細觀察觀察,似乎ret這個變量似乎有不同的值
  • 因為我們看到它可以同時執行if 和 else的內容,也就是說,在兩個進程中,實際上ret的值是不同的
  • 這是為什么呢?

?

fork()時,系統要做什么?

  • 首先明確: 進程 = 內核數據結構(os來分配) + 進程代碼和數據(一般從磁盤中來)

  • 執行fork,也就是創建了一個新的進程,只不過這個新進程有點特殊,數據幾乎全部都繼承自創建自己的父進程
  • 控制權轉移到內核中后(os會為子進程分配空間,提供初始值)
  • 從fork()函數的返回值開始,就開始并行執行兩個進程啦

數據是否要獨立?

  • 因為進程具有獨立性,所以子進程也得有自己的代碼和數據
  • 但是我們沒有加載內存的過程,它也就沒有自己的代碼和數據,就可以和父進程共享使用
  • 代碼共享沒有什么問題,因為不可更改,都是只讀
  • 但是!!數據可不能共享,它是可寫的!
  • 如果共享的話,就會出現問題!
  • 一般創建子進程就是為了和父進程執行不同的操作
  • 如果其中一個變量一修改,另一個進程也會受到影響的話,未免也太挫了,也不滿足獨立性
  • 所以!數據必須分離!!

寫時拷貝?

引入

雖然數據要分離,但是子進程用不到的那些數據還有必要再拷貝一份嗎?

  • 顯然是沒有的
  • 這樣的情況下,共享也是沒有問題的
  • (這樣的例子可以在c語言中看到,比如兩個指針指向同一個常量字符串,編譯器也不會傻到開辟兩份空間存儲內容一樣的字符串)
  • 因此,只有將來會被父/子進程寫入的數據,才值得被拷貝
介紹
  • 但是,其實os也無法知道哪些數據會被寫入,提前拷貝了也不會立馬使用(相當于占著茅坑不拉屎)
  • 所以,os選擇了寫時拷貝技術來將數據分離
舉例(fork返回值)
  • 所以前面的fork返回值問題,實際上返回值接收的這一過程就是寫入
  • 所以發生了寫時拷貝
  • 父子進程這一變量存在兩份,但虛擬地址并沒有改變,也就導致了我們看到的結果
  • 但是可以通過不同的頁表映射,從而找到實際的物理地址

fork返回的值是什么?

雖然我們已經知道了兩個進程中的ret不一樣,但為什么會不一樣呢?

  • 是因為fork()在不同進程中返回了不同的值
  • fork()在父進程中返回子進程的進程pid(該值一般大于0),而在子進程中返回0
  • fork的返回值由os控制
  • 它將子進程的pid返回給父進程,以便父進程可以管理子進程,然后繼續下面的代碼
  • 子進程返回0,用于區分子進程
  • 如果父進程收到-1,則代表進程創建失敗

創建失敗的原因

  • 創建內存是需要使用內存資源的
  • 如果當前系統有太多進程,內存資源不足時,os就可能不讓你繼續創建了
  • 而且作為一個用戶,可擁有的進程數是一定的

子進程執行位置從哪里開始

引入

我們其實還會發現,在fork之前的語句,子進程并沒有執行:

我們會發現,在fork之前的那句打印只出現了一次,說明子進程是沒有執行那個語句的

可以說明 -- 子進程并不是從頭開始執行程序的

那子進程從哪里開始執行呢?

進程切換

  • cpu使用進程切換的策略執行語句
  • 并且要保證每個進程下次來的時候,必須從之前的位置繼續運行(而不是重新來過,不然前面就白執行了)
  • 所以cpu必須要有對應的寄存器數據(EIP? ,??程序計數器(pc指針)),來記錄當前運行進程的執行位置
  • cpu執行指令靠的就是EIP中的地址 (地址+指令長度=下一條指令地址)
  • 每個進程走的時候,帶走這份數據,下次來的時候再給寄存器,就可以實現想要的效果啦
  • (寄存器數據也就是進程的上下文數據)

子進程執行的位置

  • 子進程成功創建的時候,恰好為fork該執行return指令的時候
  • 因為當執行到return時,就說明它的主要功能已經實現,也就是子進程已經創建出來了
  • 它里面的pc也就繼承自父進程的進度(return的那里),他就認為自己的EIP起始值就是return指令的地址
  • 所以子進程就從return開始執行
  • 也可以通過這個理論,修改子進程的pc值

子進程的用途

就 -- 要么子承父業,要么自己獨自發展

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164285.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164285.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

燙傷事件屢有發生,覓光推脫責任,稱是用戶操作失誤

提及“雙十一”“直播間”等關鍵詞&#xff0c;人們常常將其與“低價”“薅羊毛”等字眼掛鉤。而在近日&#xff0c;科技美容品牌AMIRO覓光&#xff08;下稱“覓光”&#xff09;卻上演了一出“反向薅羊毛”的戲碼&#xff0c;因線上線下渠道相差超千元的價格差飽受爭議。 自橫…

camera-caps:Jetson設備上的一種實用的V4L2可視化界面

camera-caps&#xff1a;Jetson設備上的一種實用的V4L2可視化界面 github地址是&#xff1a; https://github.com/jetsonhacks/camera-caps 注意&#xff1a;Jetpack5.x需要選擇tag 5.x版本

走迷宮(BFS寬度優先搜索)

給定一個 nm 的二維整數數組&#xff0c;用來表示一個迷宮&#xff0c;數組中只包含 0 或 1&#xff0c;其中 0 表示可以走的路&#xff0c;1 表示不可通過的墻壁。 最初&#xff0c;有一個人位于左上角 (1,1)處&#xff0c;已知該人每次可以向上、下、左、右任意一個方向移動…

MySQL數據庫約束你真的懂嗎?

??????今天給各位帶來的是關于數據庫約束方面的知識 清風的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能對你有所幫助&#xff0c;有不足的地方還請各位看官多多指教&#xff0c;大家一起學習交流&#xff01; 動動你們發財的小手&#xff0c;點點關…

JMeter接口測試之文件上傳

最近用JMeter做接口測試&#xff0c;頻繁遇到了文件上傳的接口&#xff0c;與其他一般接口的處理方式不一樣&#xff0c;想著分享下&#xff0c;希望能給測試同學一點啟發。 文章將圍繞三個部分進行展開&#xff1a; 一、用戶場景 二、接口請求參數 三、JMeter腳本編寫步驟…

C語言每日一題(36)隊列實現棧功能

力扣 225 用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出&#xff08;LIFO&#xff09;的棧&#xff0c;并支持普通棧的全部四種操作&#xff08;push、top、pop 和 empty&#xff09;。 實現 MyStack 類&#xff1a; void push(int x) 將元素 x 壓入棧頂。int…

vue2系列 — 自定義指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定義指令的鉤子 bind&#xff1a; 當 v-XXX 指令綁定到節點上時 觸發inserted&#xff1a;被綁定元素插入父節點時調用update&#xff1a;所在組件的 VNode 更新…

使用nprogress實現請求進度條

一、安裝nprogress npm i nprogress 二、 在axios的請求攔截器中使用nprogress 如果對于axios的請求和響應攔截器的使用不了解的&#xff0c;可以看這篇文章&#xff1a; axios二次封裝配置請求攔截器和響應攔截器-CSDN博客 nprogress上有兩個有用的方法&#xff1a; star(…

OpenStack云計算平臺-Dashboard(圖形化)

目錄 一、安裝和配置 1、安全并配置組件 2、完成安裝 ?二、驗證操作 一、安裝和配置 1、安全并配置組件 安裝軟件包&#xff1a; yum install openstack-dashboard 編輯文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全國高校數據?

前言 Python是一門強大的編程語言&#xff0c;它可以用于爬取互聯網上的各種數據。在這篇文章中&#xff0c;我們將學習如何使用Python爬取全國高校數據&#xff0c;并使用代理IP進行爬取。 本文主要分為以下幾個部分&#xff1a; 數據來源及需求安裝依賴包及導入模塊爬取全…

關于禪道的安裝配置以及項目管理、團隊協同工作

目錄 一、禪道是什么&#xff1f; 二、特點和功能 三、安裝禪道 3.1 下載官網 3.2 版本考慮 3.3 禪道使用手冊參考 3.4 Windows端安裝禪道 四、啟動禪道 4.1 訪問禪道 四、禪道部分功能的使用 4.1 添加項目集 4.2 啟動/關閉項目 4.3 項目計劃儀表盤/階段目標/研發…

頭歌——操作系統實訓總結

死鎖 1、系統出現死鎖時一定同時保持了四個必要條件&#xff0c;對資源采用按序分配算法后可破壞的條件是&#xff08;A&#xff09;。 A、循環等待條件B、互斥條件C、占有并等待條件D、不可搶占條件 2、資源的靜態分配算法在解決死鎖問題中是用于&#xff08;B&#xff09;。 …

【圖論】關鍵路徑求法c++

代碼結構如下圖&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用來遞歸求解拓撲排序&#xff0c;topologicalSort(float**, int*&, int, int, int)傳參圖的鄰接矩陣mat與結點個數n&#xff0c;與一個引用變量數組topo&#xff0c;返回一個布爾值…

代碼隨想錄-刷題第五天

鏈表題目總結 鏈表基本操作 對鏈表進行增刪改查等基本操作。注意&#xff0c;很多鏈表的題目使用虛擬頭結點操作起來會更加方便。每次對應頭結點的情況都要單獨處理&#xff0c;所以使用虛擬頭結點的技巧&#xff0c;就可以解決這個問題。 反轉鏈表 可以使用頭插法&#xf…

Shopee本土號封號幾率大嗎?如何避免封號?被封號了怎么辦?

Shopee是近幾年熱門的電商平臺之一&#xff0c;即使越來越多的跨境電商涌現&#xff0c;他的地位在東南亞市場依然占據一席之地&#xff0c;也依舊吸引著需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被關停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 學習筆記 map的使用

原題 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境電商必須要海外代理IP嗎?盤點五大海外代理IP

相信跨境電商人近日都為了2023的跨境黑五旺季奮戰&#xff0c;而2024也即將來臨&#xff0c;對于跨境人的考驗一波接著一波&#xff0c;根據Adobe Analytics的數據&#xff0c;2022年黑色星期五的銷售額創下91.2億美元新高&#xff0c;網絡星期的銷售額同樣達到創紀錄的113億美…

『 C++類與對象 』多態之單繼承與多繼承的虛函數表

文章目錄 &#x1fae7; 前言&#x1fae7; 查看虛表&#x1fae7; 單繼承下的虛函數表&#x1fae7; 多繼承下的虛函數表 &#x1fae7; 前言 多態是一種基于繼承關系的語法,既然涉及到繼承,而繼承的方式有多種: 單繼承多繼承棱形繼承棱形虛擬繼承 不同的繼承方式其虛表的形…

ToDesk提示通道限制 - 解決方案

問題 使用ToDesk進行遠程控制時&#xff0c;免費個人賬號最多支持1個設備同時發起遠控&#xff0c;若使用此賬號同時在2個設備發起遠控&#xff0c;則會提示通道限制&#xff0c;如下圖&#xff1a; 解決方案 方案1&#xff1a;斷開其它遠控 出現通道限制彈窗時&#xff0…