linux下多進(jìn)程是如何實(shí)現(xiàn)的 linux進(jìn)程調(diào)度詳解?
linux進(jìn)程調(diào)度詳解?Linux進(jìn)程調(diào)度:無(wú)論在批處理系統(tǒng)還是分時(shí)系統(tǒng)中,用戶進(jìn)程的數(shù)量一般都多于處理器的數(shù)量,這會(huì)導(dǎo)致它們爭(zhēng)奪處理器。此外,系統(tǒng)進(jìn)程也需要使用處理器。這就要求進(jìn)程調(diào)度器根據(jù)一定的策
linux進(jìn)程調(diào)度詳解?
Linux進(jìn)程調(diào)度:
無(wú)論在批處理系統(tǒng)還是分時(shí)系統(tǒng)中,用戶進(jìn)程的數(shù)量一般都多于處理器的數(shù)量,這會(huì)導(dǎo)致它們爭(zhēng)奪處理器。
此外,系統(tǒng)進(jìn)程也需要使用處理器。
這就要求進(jìn)程調(diào)度器根據(jù)一定的策略將處理器動(dòng)態(tài)地分配給就緒隊(duì)列中的一個(gè)進(jìn)程來(lái)執(zhí)行。
linux進(jìn)程調(diào)度:的基本屬性
1.從出生、操作到滅絕的多態(tài)性。
2.多個(gè)不同的進(jìn)程可以包含同一個(gè)程序。
3.三種基本狀態(tài)可以在它們之間轉(zhuǎn)換。
4.并發(fā)的并發(fā)進(jìn)程輪流占用處理器。
Linux進(jìn)程調(diào)度原理:
當(dāng)調(diào)度程序運(yùn)行時(shí),需要從所有可以運(yùn)行的進(jìn)程中選擇最值得運(yùn)行的進(jìn)程并投入運(yùn)行。
每個(gè)進(jìn)程的task_struct結(jié)構(gòu)中有四項(xiàng):policy、priority、count
linux一個(gè)端口可以運(yùn)行幾個(gè)進(jìn)程,比如我同時(shí)打開2個(gè)瀏覽器,那屬于幾個(gè)端口呢?
每個(gè)端口上可以運(yùn)行很多進(jìn)程,每個(gè)進(jìn)程都可以調(diào)用同一個(gè)端口,但是當(dāng)一個(gè)進(jìn)程占用了端口,其他進(jìn)程就會(huì)等到上一個(gè)進(jìn)程釋放了端口,才被下一個(gè)進(jìn)程調(diào)用。
Linux是如何記錄進(jìn)程資源的?你能從C語(yǔ)言源代碼層面分析下嗎?
謝謝邀請(qǐng)我。
其實(shí)簡(jiǎn)單來(lái)說(shuō),一個(gè)進(jìn)程無(wú)非就是正在運(yùn)行的程序及其相關(guān)資源的總和。讀者應(yīng)該注意單詞 "相關(guān)資源 "給你。Linux如何在內(nèi)核中記錄進(jìn)程的資源?
Linux內(nèi)核如何記錄一個(gè)進(jìn)程的資源?首先我們要明白,Linux內(nèi)核大部分都是用C語(yǔ)言編寫的,所以要搞清楚內(nèi)核是如何記錄進(jìn)程資源的,我們只需要看看相關(guān)的C語(yǔ)言代碼就可以了。事實(shí)上,Linux內(nèi)核使用task_struct結(jié)構(gòu)來(lái)描述進(jìn)程的資源。它的C語(yǔ)言代碼如下。請(qǐng)看:
Task_struct結(jié)構(gòu)很長(zhǎng),占了我手里L(fēng)inux內(nèi)核C語(yǔ)言源代碼的280行。當(dāng)然還有很多條件編譯部分,在32位。在機(jī)器上,task_struct占用了大約1.7kB的內(nèi)存空間,但考慮到可以管理整個(gè)進(jìn)程,1.7 KB并不算大。
鑒于task_struct的結(jié)構(gòu)比較長(zhǎng),這里不可能把它的成員介紹清楚。如果讀者和我一樣好奇,粗略瀏覽一下task_struct結(jié)構(gòu),應(yīng)該能找到一些熟悉的成員,比如:
通過(guò)C語(yǔ)言中的注釋和成員的變量名可以看到,task_struct結(jié)構(gòu)中包含了文件系統(tǒng)、線程結(jié)構(gòu)、進(jìn)程打開的文件等信息,與上一篇文章的內(nèi)容相對(duì)應(yīng)。其他成員會(huì)在我后面的文章中涉及,所以我贏了 這里暫時(shí)不細(xì)說(shuō)。
Linux在創(chuàng)建進(jìn)程時(shí),通過(guò)slab分配器分配task_struct結(jié)構(gòu),可以避免動(dòng)態(tài)分配和釋放帶來(lái)的開銷,提高內(nèi)存使用效率。
那么在task_struct結(jié)構(gòu)創(chuàng)建之后,內(nèi)核是如何訪問(wèn)它的呢?根據(jù)我手里的內(nèi)核C語(yǔ)言源代碼,Linux中還有一個(gè)結(jié)構(gòu)thread_info,它的一個(gè)成員任務(wù)指針正好適合索引task_struct結(jié)構(gòu)。在X86_64平臺(tái)上,thread_info的相關(guān)C語(yǔ)言代碼如下。請(qǐng)看:Linux通常把thread_info結(jié)構(gòu)放在內(nèi)核棧的底部或頂部,內(nèi)核棧的大小通常是已知的,所以每個(gè)進(jìn)程都可以很容易地從自己的棧中找到thread_info結(jié)構(gòu),然后找到task_struct結(jié)構(gòu)。
要找到當(dāng)前進(jìn)程的thread_info結(jié)構(gòu),可以調(diào)用current_thread_info()函數(shù)。它的C語(yǔ)言代碼如下。請(qǐng)看:
可以看出,current_thread_info()函數(shù)實(shí)際上是通過(guò)進(jìn)程棧來(lái)計(jì)算的,所以它的實(shí)現(xiàn)與平臺(tái)架構(gòu)有關(guān)。上面的C語(yǔ)言代碼其實(shí)只是arm平臺(tái)的實(shí)現(xiàn)方法,讀者可以自己查看其他平臺(tái)的實(shí)現(xiàn)方法。
此時(shí),要獲取當(dāng)前進(jìn)程的資源,可以使用current_thread_info()-gttask索引。
歡迎在評(píng)論區(qū)一起討論提問(wèn)。這些文章都是手工原創(chuàng)的。每天都有最簡(jiǎn)單的C語(yǔ)言、linux等嵌入式開發(fā)介紹。如果你喜歡我的文章,請(qǐng)關(guān)注一波。你可以看到最新的更新和以前的文章。