linux下進(jìn)程管理機(jī)制的工作原理 linux按下ctrl c為什么會(huì)結(jié)束當(dāng)前進(jìn)程?
linux按下ctrl c為什么會(huì)結(jié)束當(dāng)前進(jìn)程?因?yàn)樵贚inux系統(tǒng)下按ctrl c相當(dāng)于當(dāng)前終端向進(jìn)程發(fā)送SIGINT信號(hào)。linux為什么一個(gè)進(jìn)程可以殺死另一個(gè)進(jìn)程?因?yàn)橄到y(tǒng)提供了kill命令,所
linux按下ctrl c為什么會(huì)結(jié)束當(dāng)前進(jìn)程?
因?yàn)樵贚inux系統(tǒng)下按ctrl c相當(dāng)于當(dāng)前終端向進(jìn)程發(fā)送SIGINT信號(hào)。
linux為什么一個(gè)進(jìn)程可以殺死另一個(gè)進(jìn)程?
因?yàn)橄到y(tǒng)提供了kill命令,所以您可以通過(guò)進(jìn)程號(hào)來(lái)終止另一個(gè)進(jìn)程。
linux線程同步和進(jìn)程同步的區(qū)別?
線程同步:解決多線程編程享資源的問(wèn)題;進(jìn)程同步:解決多進(jìn)程編程享資源的問(wèn)題,但有些學(xué)生還沒(méi)有 t對(duì)線程同步和進(jìn)程同步的研究不夠深入。比如互斥和條件變量是否可以同時(shí)用于線程同步和進(jìn)程同步,本質(zhì)上是不同的。首先,我們知道linux下的每個(gè)進(jìn)程都有自己獨(dú)立的進(jìn)程空間。假設(shè)進(jìn)程A和進(jìn)程B各有一個(gè)互斥體,并且這個(gè)鎖放在進(jìn)程的全局靜態(tài)區(qū)域,那么AB進(jìn)程就不能感知彼此 s互斥。
互斥鎖和條件變量來(lái)自Posix.1線程標(biāo)準(zhǔn),它們總是可以用來(lái)同步進(jìn)程中的線程。
如果互斥體或條件變量存儲(chǔ)在多個(gè)進(jìn)程共享的內(nèi)存區(qū)域中,Posix還允許它用于這些進(jìn)程之間的同步??吹竭@里,你有什么發(fā)現(xiàn)嗎?線程同步和進(jìn)程同步的本質(zhì)區(qū)別在于鎖放在哪里,私有進(jìn)程空間還是多個(gè)進(jìn)程共享的空間,鎖是否具有進(jìn)程共享的屬性。
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ǔ)言編寫(xiě)的,所以要搞清楚內(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)程打開(kāi)的文件等信息,和上一節(jié)類似。這一章的內(nèi)容是一致的。其他成員會(huì)在我后面的文章中涉及,所以我贏了 這里暫時(shí)不細(xì)說(shuō)。
Linux在創(chuàng)建進(jìn)程時(shí),通過(guò)slab分配器分配task_struct結(jié)構(gòu),可以避免動(dòng)態(tài)分配和釋放帶來(lái)的開(kā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等嵌入式開(kāi)發(fā)介紹。如果你喜歡我的文章,請(qǐng)關(guān)注一波。你可以看到最新的更新和以前的文章。