資源描述:
《【6】linux中的進(jìn)程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、Linux中的進(jìn)程1?問(wèn)題?計(jì)算機(jī)中什么時(shí)候開(kāi)始有進(jìn)程的?計(jì)算機(jī)中的第一個(gè)進(jìn)程是誰(shuí)?用戶的第一個(gè)進(jìn)程是誰(shuí)?所有的進(jìn)程間有什么聯(lián)系?親屬、同步2主要內(nèi)容linux系統(tǒng)進(jìn)程啟動(dòng)過(guò)程1linux下的用戶進(jìn)程編程2linux信號(hào)量操作33一、linux系統(tǒng)進(jìn)程啟動(dòng)過(guò)程(了解)開(kāi)機(jī)系統(tǒng)啟動(dòng)(系統(tǒng)進(jìn)程初始化)用戶登陸(用戶進(jìn)程運(yùn)行)BIOS41.計(jì)算機(jī)出廠后已有的東西兩個(gè)重要芯片,一個(gè)空白硬盤(pán)1)BIOS(BasicInput/OutputSystem)一組程序(保存著計(jì)算機(jī)最重要的基本輸入輸出的程序、系統(tǒng)設(shè)置程序
2、、開(kāi)機(jī)后自檢程序和系統(tǒng)自啟動(dòng)程序。)固化到計(jì)算機(jī)內(nèi)主板上一個(gè)ROM芯片。2)CMOS:系統(tǒng)配置參數(shù)(計(jì)算機(jī)基本啟動(dòng)信息,如日期、時(shí)間、啟動(dòng)設(shè)置等)保存在主板上一塊可讀寫(xiě)的RAM芯片。生活中常將BIOS設(shè)置和CMOS設(shè)置混說(shuō),實(shí)際上都是指修改CMOS中存放的參數(shù)。正規(guī)的說(shuō)法應(yīng)該是“通過(guò)BIOS設(shè)置程序?qū)MOS參數(shù)進(jìn)行設(shè)置”。52.安裝操作系統(tǒng)到硬盤(pán)系統(tǒng)安裝過(guò)程會(huì)規(guī)劃硬盤(pán)(分區(qū)),寫(xiě)入數(shù)據(jù)(系統(tǒng)啟動(dòng)程序?qū)懭隡BR,操作系統(tǒng)程序?qū)懭胫鞣謪^(qū))。MBRDPTOS主引導(dǎo)扇區(qū):位于整個(gè)硬盤(pán)的0磁頭0柱面1扇區(qū),共5
3、12字節(jié),包括:①硬盤(pán)主引導(dǎo)記錄MBR(MasterBootRecord)446字節(jié)。檢查分區(qū)表是否正確以及確定哪個(gè)分區(qū)為引導(dǎo)分區(qū),并在程序結(jié)束時(shí)把該分區(qū)的啟動(dòng)程序(也就是操作系統(tǒng)引導(dǎo)扇區(qū))調(diào)入內(nèi)存加以執(zhí)行。②硬盤(pán)分區(qū)表DPT(DiskPartitionTable)64字節(jié)。一共64字節(jié),按每16個(gè)字節(jié)作為一個(gè)分區(qū)表項(xiàng),它最多只能容納4個(gè)分區(qū),DPT里進(jìn)行說(shuō)明的分區(qū)稱為主分區(qū)。+結(jié)束標(biāo)志“55,AA”(2字節(jié))主引導(dǎo)分區(qū)硬盤(pán)結(jié)構(gòu)相關(guān)閱讀63.啟動(dòng)并使用機(jī)器加電開(kāi)機(jī)BIOS(ROM中的BIOS讀CMOS中
4、的參數(shù),開(kāi)始硬件自檢,找引導(dǎo)程序啟動(dòng)系統(tǒng))存在硬盤(pán)主引導(dǎo)扇區(qū)MBR里的引導(dǎo)程序被啟動(dòng),裝載操作系統(tǒng)內(nèi)核程序內(nèi)核程序啟動(dòng)了解內(nèi)核啟動(dòng)過(guò)程需看linux源代碼,不同的內(nèi)核版本啟動(dòng)相關(guān)的文件不同,感興趣的同學(xué)可閱讀相關(guān)資料。詳細(xì)參閱本頁(yè)備注內(nèi)核啟動(dòng)相關(guān)閱讀7如何從系統(tǒng)進(jìn)程過(guò)渡到用戶使用總之,從源碼分析看,內(nèi)核經(jīng)歷關(guān)鍵的一些.s(匯編程序)和.c程序啟動(dòng)后,最后會(huì)開(kāi)始用戶進(jìn)程的祖先——init。init進(jìn)程在Linux操作系統(tǒng)中是一個(gè)具有特殊意義的進(jìn)程,它是由內(nèi)核啟動(dòng)并運(yùn)行的第一個(gè)用戶進(jìn)程,因此它不是運(yùn)行在內(nèi)核
5、態(tài),而是運(yùn)行在用戶態(tài)。它的代碼不是內(nèi)核本身的一部分,而是存放在硬盤(pán)上可執(zhí)行文件的映象中,和其他用戶進(jìn)程沒(méi)有什么兩樣。那么如何從內(nèi)核過(guò)渡到init進(jìn)程?見(jiàn)如下示意圖:8后面學(xué)習(xí)完fork等系統(tǒng)調(diào)用后再返回頭看這里你會(huì)理解更多0號(hào)進(jìn)程1號(hào)內(nèi)核線程調(diào)用kernel_thread調(diào)用init()利用execve()從文件/etc/inittab中裝入可執(zhí)行程序init1號(hào)用戶進(jìn)程init追根溯源:0號(hào)進(jìn)程——系統(tǒng)引導(dǎo)時(shí)自動(dòng)形成的一個(gè)進(jìn)程,也就是內(nèi)核本身,是系統(tǒng)中后來(lái)產(chǎn)生的所有進(jìn)程的祖先。所有進(jìn)程的祖先所有用戶進(jìn)
6、程的祖先0號(hào)進(jìn)程1號(hào)內(nèi)核進(jìn)程9當(dāng)用戶進(jìn)程init開(kāi)始運(yùn)行,就開(kāi)始扮演用戶進(jìn)程的祖先角色,永遠(yuǎn)不會(huì)被終止。所以:計(jì)算機(jī)上的所有進(jìn)程都是有上下親屬關(guān)系的,他們組成一個(gè)龐大的家族樹(shù)。觀察linux下的進(jìn)程間父子關(guān)系:pstree以樹(shù)狀結(jié)構(gòu)方式列出系統(tǒng)中正在運(yùn)行的各進(jìn)程間的父子關(guān)系。psax-opid,ppid,command1011二、linux下的用戶進(jìn)程編程進(jìn)程運(yùn)行與內(nèi)存密不可分,進(jìn)程:pcb+代碼段+數(shù)據(jù)段(數(shù)據(jù)+堆棧)系統(tǒng)確信init進(jìn)程總是存在的,用戶進(jìn)程如果出現(xiàn)父進(jìn)程結(jié)束而子進(jìn)程沒(méi)有終止的情況,那
7、么這些子進(jìn)程都會(huì)以init為父進(jìn)程,而init進(jìn)程會(huì)主動(dòng)回收所有其收養(yǎng)的僵尸進(jìn)程的內(nèi)存。12Linux進(jìn)程狀態(tài)及轉(zhuǎn)換fork()TASK_RUNNING就緒TASK_INTERRUPTIBLE淺度睡眠TASK_UNINTERRUPTIBLE深度睡眠TASK_STOPPED暫停TASK_ZOMBIE僵死占有CPU執(zhí)行do_exit()schedule()ptrace()schedule()當(dāng)前進(jìn)程時(shí)間片耗盡等待資源到位sleep_on()schedule()等待資源到位interruptible_slee
8、p_on()schedule()資源到位wake_up_interruptible()或收到信號(hào)wake_up()資源到位wake_up()收到信號(hào)SIGCONTwake_up()linux進(jìn)程狀態(tài)13進(jìn)程生命周期中的系統(tǒng)調(diào)用Fork()-父親克隆一個(gè)兒子。執(zhí)行fork()之后,兵分兩路,兩個(gè)進(jìn)程并發(fā)執(zhí)行。Exec()-新進(jìn)程脫胎換骨,離家獨(dú)立,開(kāi)始了獨(dú)立工作的職業(yè)生涯。Wait()-等待不僅僅是阻塞自己,還準(zhǔn)備對(duì)僵死的子進(jìn)程進(jìn)行善后處理。