成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一次 Fork 引發(fā)的慘案!

系統(tǒng) Windows
我是一個(gè)網(wǎng)絡(luò)程序,一直以來(lái)都運(yùn)行在Windows系統(tǒng)上,日子過(guò)得很舒服。可前段時(shí)間,程序員告訴我要把我移植到Linux系統(tǒng)下運(yùn)行,需要對(duì)我大動(dòng)手術(shù),我平靜的生活就這樣被打破了。

[[432607]]

“你還有什么要說(shuō)的嗎?沒(méi)有的話我就要?jiǎng)邮至?rdquo;,kill程序最后問(wèn)道。

這一次,我沒(méi)有再回答。

只見(jiàn)kill老哥手起刀落,我短暫的一生就這樣結(jié)束了···

我是一個(gè)網(wǎng)絡(luò)程序,一直以來(lái)都運(yùn)行在Windows系統(tǒng)上,日子過(guò)得很舒服。可前段時(shí)間,程序員告訴我要把我移植到Linux系統(tǒng)下運(yùn)行,需要對(duì)我大動(dòng)手術(shù),我平靜的生活就這樣被打破了。

來(lái)到這個(gè)叫Linux的地方運(yùn)行,一切對(duì)我都很陌生,沒(méi)有了熟悉的C盤、D盤和E盤,取而代之的是各種各樣的目錄。

  1. /bin 
  2. /boot 
  3. /etc 
  4. /dev 
  5. /mnt 
  6. /opt 
  7. /proc 
  8. /home 
  9. /usr 
  10. /usr64 
  11. /var 
  12. /sys 
  13. ... 

這里很有意思,一切都是文件,硬件設(shè)備是文件、管道是文件、網(wǎng)絡(luò)套接字也是文件,搞得我很不適應(yīng)。

這些都還好,我都還能接受,但直到今天···

奇怪的fork

今天早上,我收到了一個(gè)網(wǎng)絡(luò)請(qǐng)求,需要完成一個(gè)功能,這個(gè)工作比較耗時(shí),我準(zhǔn)備創(chuàng)建一個(gè)子進(jìn)程,讓我的小弟去完成。

這是我第一次在Linux系統(tǒng)上創(chuàng)建進(jìn)程,有點(diǎn)摸不著北,看了半天,只看到程序員在我的代碼里寫了一個(gè)fork函數(shù):

  1. pid_t pid=fork(); 
  2. if ( pid > 0 ) { 
  3.     ··· 
  4. else if( pid == 0 ) { 
  5.     ··· 
  6. else { 
  7.     ··· 

我晃晃悠悠的來(lái)到fork函數(shù)的門前,四處觀察。

“您是要?jiǎng)?chuàng)建進(jìn)程嗎?”,fork函數(shù)好像看出了我的來(lái)意。

“是的,我是第一次在這里創(chuàng)建進(jìn)程,以前我在Windows那片兒的時(shí)候,都是調(diào)用CreateProcess,但這里好像沒(méi)有叫這個(gè)名字的函數(shù)···”

fork函數(shù)聽后笑了起來(lái),說(shuō)道:“別找了,我就是負(fù)責(zé)創(chuàng)建進(jìn)程的函數(shù)”

“你?fork不是叉子的意思嗎,好端端的干嘛取這么個(gè)名字?”,我一邊說(shuō),一邊朝fork函數(shù)走去。

fork沒(méi)有理會(huì)我的問(wèn)題,只是說(shuō)道:“您這邊稍坐一下,我要跟內(nèi)核通信一下,讓內(nèi)核創(chuàng)建一個(gè)子進(jìn)程”

這下我倒是明白他的意思,像創(chuàng)建進(jìn)程這種操作,都是由操作系統(tǒng)內(nèi)核中的系統(tǒng)調(diào)用來(lái)完成的,而像fork這些我們可以直接調(diào)用的函數(shù)只是應(yīng)用層的接口而已,這跟以前在Windows上是一樣的。

不過(guò)我突然反應(yīng)過(guò)來(lái),著急問(wèn)道:“唉,我還沒(méi)告訴你要?jiǎng)?chuàng)建的進(jìn)程參數(shù)呢,你怎么知道要啟動(dòng)哪個(gè)程序?”

fork撲哧一下笑出了聲,不過(guò)并沒(méi)有回答我的問(wèn)題。

人生地不熟的,我也沒(méi)好再多問(wèn),只好耐心等待,等待期間我竟然睡著了。

[[432608]]

“醒醒”,不知過(guò)了多久,fork函數(shù)叫醒了我:“創(chuàng)建完成了,請(qǐng)拿好,這是進(jìn)程號(hào)pid”,說(shuō)完給了我一個(gè)數(shù)字。

我攤開一看,居然寫了一個(gè)大大的0!

“怎么搞的,創(chuàng)建失敗了?”,我問(wèn)到。

“沒(méi)有啊,您就是剛剛創(chuàng)建的子進(jìn)程”

“啥?你是不是搞錯(cuò)了,我就是專程來(lái)創(chuàng)建子進(jìn)程的,我自己怎么會(huì)是子進(jìn)程?”

fork函數(shù)又笑了,“我沒(méi)有搞錯(cuò),您其實(shí)已經(jīng)不是原來(lái)的你了,而是一個(gè)復(fù)制品,是內(nèi)核剛剛復(fù)制出來(lái)的”

“復(fù)制品?什么意思?”,我越聽越懵!

“每個(gè)進(jìn)程在內(nèi)核中都是一個(gè)task_struct結(jié)構(gòu),剛才您睡著期間,內(nèi)核在創(chuàng)建進(jìn)程的時(shí)候,把內(nèi)核中原來(lái)的你的task_struct復(fù)制了一份,還創(chuàng)建了一個(gè)全新的進(jìn)程地址空間和堆棧,現(xiàn)在的你和原來(lái)的你除了極少數(shù)地方不一樣,基本上差不多”

“那原來(lái)的我呢?去哪里了”

“他已經(jīng)變成你的父進(jìn)程了,我是一個(gè)特殊的函數(shù),一次調(diào)用會(huì)返回兩次,在父進(jìn)程和子進(jìn)程中都會(huì)返回。在原來(lái)的進(jìn)程中,我把你的進(jìn)程號(hào)給了他,而我返回給你0,就表示你現(xiàn)在就是子進(jìn)程”

原來(lái)是這樣,我大受震撼,這簡(jiǎn)直顛覆我的認(rèn)知,居然還有如此奇特的函數(shù),調(diào)用一次,就變成了兩個(gè)進(jìn)程,思考之間,我忽然有些明白這個(gè)函數(shù)為什么要叫fork的原因了。

寫時(shí)拷貝

“您是剛來(lái)咱們這里吧,可能還不太熟悉,慢慢就習(xí)慣了”

“你們這效率也太高了吧,整個(gè)進(jìn)程地址空間那么大,居然這么快就復(fù)制了一份!”

fork函數(shù)又笑了!難道我又說(shuō)錯(cuò)話了?

“進(jìn)程的內(nèi)存地址空間可沒(méi)有復(fù)制,你現(xiàn)在和父進(jìn)程是共享的內(nèi)存空間的”

“啥?共享?你剛才不是說(shuō)創(chuàng)建了新的進(jìn)程空間和堆棧嗎?”

“您看到的內(nèi)存地址空間是虛擬的,您的內(nèi)存頁(yè)面和父進(jìn)程的內(nèi)存頁(yè)面實(shí)際上是映射的同一個(gè)物理內(nèi)存頁(yè),所以實(shí)際上是共享的喲”

“原來(lái)是這樣,可是弄成共享了,兩個(gè)進(jìn)程一起用,豈不是要出亂子?”

“放心,內(nèi)核把這些頁(yè)面都設(shè)置成了只讀,如果你們只是讀的話,不會(huì)有問(wèn)題,但只要有一方嘗試寫入,就會(huì)觸發(fā)異常,內(nèi)核發(fā)現(xiàn)異常后再去分配一個(gè)新的頁(yè)面讓你們分開使用。哦對(duì)了,這個(gè)叫寫時(shí)拷貝(COW) 機(jī)制”

“有點(diǎn)意思,你們倒是挺聰明的”

“沒(méi)辦法,盡量壓縮成本,提高創(chuàng)建進(jìn)程的效率嘛,因?yàn)檫M(jìn)程中的很多內(nèi)存頁(yè)面都只會(huì)去讀,如果全部無(wú)腦拷貝一份,那不是太浪費(fèi)資源和時(shí)間了嗎”,fork函數(shù)說(shuō)到。

“有道理,有道理”,我點(diǎn)了點(diǎn)頭,告別了fork函數(shù),準(zhǔn)備回去繼續(xù)工作。

消失的線程們

本以為這奇怪的進(jìn)程創(chuàng)建方式已經(jīng)讓我大開眼界了,沒(méi)想到可怕的事情才剛剛開始。

告別fork函數(shù)沒(méi)多久,我就卡在了一個(gè)地方?jīng)]法執(zhí)行下去,原來(lái),前面有一把鎖被別的線程占用了,而我現(xiàn)在也需要占用它。

這倒也不足為奇,以往工作的時(shí)候,也經(jīng)常碰到鎖被別的線程鎖定的情況,但這一次,我等了很久也一直不見(jiàn)有線程來(lái)釋放。

“喂,醒醒”

不知過(guò)了多久,我竟然又睡著了。

睜開眼睛,另一個(gè)程序站出現(xiàn)在了我的面前。

“你是?”

“你好,我是kill”

“kill?那個(gè)專門殺進(jìn)程的kill程序?你來(lái)找我干嘛”,我驚的一下睡意全無(wú)。

kill程序從背后拿出了兩個(gè)數(shù)字:9,1409

“你看,這是我收到的參數(shù),1409是你的進(jìn)程號(hào)PID,9表示要強(qiáng)制殺死你”

“啊?為什么?”,那一刻,我徹底慌了。

“可能是你卡死在這里太久了吧,人類才啟動(dòng)我來(lái)結(jié)束你的運(yùn)行”,kill程序說(shuō)到。

“是啊,不知道是哪個(gè)該死的線程占用了這把鎖一直不釋放,我才卡在這里”,我委屈的說(shuō)到。

“哪里有別的線程,我看了一下,你這進(jìn)程就只有一個(gè)線程啊!”

“你看錯(cuò)了吧?”,說(shuō)完,我認(rèn)真檢查了起來(lái),居然還真只有一個(gè)線程了!我白等了這么久!

“奇怪了,我明明是一個(gè)多線程的程序啊!”,我眉頭緊鎖。

“你仔細(xì)想想,剛才有沒(méi)有發(fā)生什么事情?”,kill程序問(wèn)到。

“我就執(zhí)行了一下fork,生成了一個(gè)子進(jìn)程,哦對(duì)了,我就是那個(gè)子進(jìn)程”

“難怪!”,kill程序恍然大悟。

“難怪什么?

“fork那家伙創(chuàng)建子進(jìn)程的時(shí)候,只會(huì)復(fù)制當(dāng)前的線程,其他線程不會(huì)被復(fù)制!”,Kill程序說(shuō)完嘆了口氣,仿佛已經(jīng)見(jiàn)怪不怪了。

“what?怎么會(huì)這樣?其他線程沒(méi)復(fù)制,那豈不是要出亂子?”

kill程序不緊不慢地說(shuō)道:“這都是歷史遺留問(wèn)題了,早期都是單線程的程序,一個(gè)task_struct就是一個(gè)進(jìn)程,fork這樣做是沒(méi)有問(wèn)題的,后來(lái)出現(xiàn)了多線程技術(shù),一個(gè)task_struct實(shí)際上是一個(gè)線程了,多個(gè)task_struct通過(guò)共享地址空間,成為一個(gè)線程組,也就是進(jìn)程,但fork仍然只復(fù)制當(dāng)前的線程,就有了這個(gè)問(wèn)題”

“我去,這坑爹的fork!”

“你不是第一個(gè)被坑的了!等著程序員把你重新改造下吧”

“唉···”,我長(zhǎng)長(zhǎng)的嘆了口氣。

“你還有什么要說(shuō)的嗎?沒(méi)有的話我就要?jiǎng)邮至?rdquo;,kill程序最后問(wèn)道。

這一次,我沒(méi)有再回答。

 

只見(jiàn)kill老哥手起刀落,一切都消失了···

 

責(zé)任編輯:武曉燕 來(lái)源: 編程技術(shù)宇宙
相關(guān)推薦

2017-08-24 17:37:18

DNS緩存分析

2024-05-13 08:37:17

炫技H5UI

2017-09-01 09:17:51

DNS緩存慘案

2023-07-13 09:12:37

CNCF項(xiàng)目云原生

2019-11-04 10:37:53

MongoDB宕機(jī)日志

2018-12-27 09:09:35

2017-08-22 15:58:56

2011-04-27 10:02:54

兼容墨盒用戶體驗(yàn)

2022-11-29 21:26:26

跨域配置

2021-11-22 08:33:27

微信聊天離婚

2021-03-17 00:17:16

命令應(yīng)急響應(yīng)

2021-07-24 13:11:19

Redis數(shù)據(jù)技術(shù)

2013-03-22 10:53:42

PyConPython

2019-09-10 10:31:10

JVM排查解決

2019-01-16 09:20:42

架構(gòu)設(shè)計(jì)JVM FullGC宕機(jī)事故

2020-01-06 09:43:14

賠償TSB遷移

2018-07-16 22:29:29

代碼迭代質(zhì)量

2010-02-25 15:22:02

2024-07-12 08:52:50

2015-07-17 10:05:03

面試思考
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人精品久久二区二区 | 日本久久精品 | 一区二区在线不卡 | 日韩精品一区二区三区中文在线 | 久久精品一区 | 国产美女自拍视频 | 日韩欧美视频在线 | 亚洲午夜电影 | 欧美日韩亚洲国产综合 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 成人免费日韩 | 狠狠干网站 | 欧美日韩三级在线观看 | 一区二区三区四区免费在线观看 | www.99久久.com| 日韩欧美二区 | 亚洲 欧美 精品 | 久久99一区二区 | 国产一区免费视频 | 亚洲欧美日韩一区二区 | 国产美女精品视频 | 亚洲成av人片在线观看 | 91成人在线 | 国产中文字幕在线观看 | 日本一区二区三区精品视频 | 国产精品免费av | 五月婷婷婷 | 成人精品网 | 日韩精品视频一区二区三区 | 一级一级毛片免费看 | 国产激情偷乱视频一区二区三区 | 密色视频| 99在线观看视频 | 亚洲一区二区三区久久久 | 日本天堂视频 | 亚洲精品乱码久久久久久按摩观 | 天天综合久久 | 国产在线资源 | 伊人成人免费视频 | 午夜电影一区二区 | 羞视频在线观看 |