0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Linux進(jìn)程管理的詳細(xì)剖析

Q4MP_gh_c472c21 ? 2018-01-26 11:24 ? 次閱讀

上一篇嵌入式未來一段時間還是Linux天下,一位嵌入式er初探Linux kernel經(jīng)驗,我們講到了Linux內(nèi)核開發(fā)和應(yīng)用程序開發(fā),今天我們來講講Linux重點部分Linux的進(jìn)程管理。

OS是干啥的?處理提供對硬件層的抽象以外,還擔(dān)負(fù)著很多的硬件管理功能,而這些功能,用一句話來說,就是來處理各個部件的時空復(fù)用問題(時間和空間的重用問題,如cpu是分時重用的(當(dāng)然還有多核cpu的特例,而內(nèi)存是即分時又分空的……)。

往古至今,大牛們對OS的定義不下其數(shù),而本人認(rèn)為最有說服力的OS的定義就是:“所有軟件(特指應(yīng)用程序)的交集”,料想計算機誕生初期都是專用機,在一款機器上只能跑訂制的專用程序,而這個程序要自己做好所有硬件的協(xié)調(diào)且還要完成他應(yīng)有的本分工作,慢慢的計算機向通用型發(fā)展,為了提高系統(tǒng)利用率和避免盲目且重復(fù)的底層實現(xiàn),OS隨著需求一步步形成且不斷完善……

不知你發(fā)現(xiàn)沒有,好多東西都是在歷史舞臺上重復(fù)出現(xiàn)的,仿佛對應(yīng)著“20年后又是一條好漢”這句話,看現(xiàn)在的google的Chrome OS,其實最初的原型說白了就是把chrome瀏覽器必要的底層重新從OS中剝離,使其具有獨立運行的能力,這不是有點最早的專用機的味道,計算機這東西很是神奇,一個好的點子就可能改變整個市場,甚至一個世紀(jì)……

扯遠(yuǎn)了,重新回來,回到復(fù)用性說起吧,因為cpu要跑的程序很多,但是cup個數(shù)有限,這就牽扯到cpu的重用,也就是被多個進(jìn)程重用(進(jìn)程與程序的區(qū)別就不多說了,自己熟悉OS知識去吧,簡單的提一下程序運行的本質(zhì)就是從內(nèi)核申請個進(jìn)程,再把程序包中的代碼拷貝到對應(yīng)進(jìn)程的代碼域并設(shè)置好相關(guān)變量數(shù)據(jù)令進(jìn)程跑起來,所以程序只是靜態(tài)的代碼,而進(jìn)程是一個不斷從程序加載代碼的執(zhí)行過程),這是由于進(jìn)程間要復(fù)用cpu,所以就要求有人來負(fù)責(zé)他們有組織有紀(jì)律的復(fù)用,并協(xié)調(diào)進(jìn)程間的輕重緩急、切換規(guī)則、切換后的一些處理……

另外還有怎樣生產(chǎn)進(jìn)程、怎樣切換、怎樣銷毀……這些由誰完成?當(dāng)然是OS,對于linux,當(dāng)然是kernel了。畢竟OS就是用來跑程序的,而進(jìn)程就是程序的靈魂,可見進(jìn)程管理的重要性,咱就從進(jìn)程說起先。

雖然吧,進(jìn)程是處于執(zhí)行期的程序,但是要明白,進(jìn)程并不僅僅局限于一段可執(zhí)行的代碼,你想,要想跑進(jìn)程,你得知道是誰的進(jìn)程,要區(qū)別于其他進(jìn)程;還要保證當(dāng)前進(jìn)程不能隨意訪問其他進(jìn)程的地址空間,要是連這都不限制,那寫個黑客程序多隨意啊;還牽扯到多線程問題;另外,由于進(jìn)程間是復(fù)用cpu的,就是一會兒這個執(zhí)行,一會兒換另一個,那你還要保證它可以接著上次的執(zhí)行啊,要不不就亂了套了……如此說來,進(jìn)程需要的東西大概有:

打開的文件

掛起的信號 (linux一個事件的處發(fā)是基于信號機制的,就像windows的事件機制)

內(nèi)核內(nèi)部數(shù)據(jù) (這就是傳說中恢復(fù)現(xiàn)場用的,要還原到進(jìn)程切換前的狀態(tài)需要保存現(xiàn)場)

處理器狀態(tài) (沒理解錯的話,這也是現(xiàn)場保持的一部分,因為有些程序的執(zhí)行是)

地址空間

一個或多個執(zhí)行線程(Linux下的線程實現(xiàn)非常有趣,也非常簡單,本質(zhì)上也就是幾個共享進(jìn)程,沒有設(shè)置專門的線程數(shù)據(jù)結(jié)構(gòu))

以上是Linux下進(jìn)程的主要組成部分,當(dāng)然了,進(jìn)程管理么,有了進(jìn)程還要有管理,管理相關(guān)著進(jìn)程的策略和生命周期等一些東西,我們會慢慢講來。

話說很久很久以前,進(jìn)程自創(chuàng)建時刻起就開始存活了,活在Linux世界的進(jìn)程爹fork()系統(tǒng)調(diào)用一下,就會生個小進(jìn)程,比和女兒國的水來的還快。進(jìn)程這東西沒耳朵沒眼睛的,他爹咋知道啥時候生好了。既然fork()是生婆,那這是生婆最懂了。fork()系統(tǒng)調(diào)用會返回兩次:一次回到父進(jìn)程,一次回到子進(jìn)程。

新的進(jìn)程是為了立即執(zhí)行新的不同的程序,而接著調(diào)用exec*()這族函數(shù)就可以創(chuàng)建新的地址空間,并把新的程序載入。(fork()實際上是由clone()系統(tǒng)調(diào)用實現(xiàn)的。)

最終,程序會通過exit()系統(tǒng)調(diào)用退出執(zhí)行。這個函數(shù)會終結(jié)進(jìn)程并將其占用的資源釋放。父進(jìn)程會通過wait4()系統(tǒng)調(diào)用來查詢子進(jìn)程是否終結(jié),這就使得進(jìn)程擁有了等待特定進(jìn)程執(zhí)行的能力。進(jìn)程退出后被設(shè)置為僵死狀態(tài),直到父進(jìn)程調(diào)用wait()或waitpid()為止。

知道了進(jìn)程不僅僅是由一段執(zhí)行代碼組成的,咱們就說說linux下的進(jìn)程的大概過程。其實一個進(jìn)程就相當(dāng)于一個軟件的動態(tài)執(zhí)行(嚴(yán)格的說是某個軟件子系統(tǒng)的動態(tài)執(zhí)行,當(dāng)然我們可以把該子系統(tǒng)想象成一個子軟件,這樣會便于理解)。Linux中創(chuàng)建一個進(jìn)程要用到fork()系統(tǒng)調(diào)用,一個子進(jìn)程的生成是通過拷貝父進(jìn)程來實現(xiàn)的。fork以后,會返回兩次:一次回到父進(jìn)程,一次回到子進(jìn)程。為何要返回兩次,兩次又是如何區(qū)別的呢??剛開始我也在像這個問題,因為子進(jìn)程拷貝了父進(jìn)程的代碼,返回時處于fork()返回點的上下文是一樣的,但是返回的值不一樣,借此來區(qū)分是父進(jìn)程還是子進(jìn)程……

這不,新的子進(jìn)程創(chuàng)建好了,然后干什么?肯定是做不是當(dāng)前進(jìn)程的工作,要不創(chuàng)建他干什么?所以,這時候就接著調(diào)用exec*()這一族函數(shù),該族函數(shù)可以創(chuàng)建新的地址空間,并加載到當(dāng)前進(jìn)程執(zhí)行。

最后,程序通過exit() syscall(系統(tǒng)調(diào)用,以后都用這個代指了) 退出執(zhí)行。這個函數(shù)會終結(jié)進(jìn)程并將其占用的資源釋放掉。父進(jìn)程通過wait4() syscall來查詢子進(jìn)程是否終結(jié),這使得進(jìn)程擁有了等待特定進(jìn)程執(zhí)行完的能力(這不就是傳說中的同步么?有木有?有木有?哈哈)。進(jìn)程退出后被設(shè)置為僵死狀態(tài),知道父進(jìn)程調(diào)用wait()或waitpid()為止(其實他們貌似都是基于wait4()實現(xiàn)的)。

上面就是進(jìn)程創(chuàng)建到回收的簡單過程。子進(jìn)程由父進(jìn)程創(chuàng)建,父進(jìn)程回收,有點恢復(fù)現(xiàn)場的感覺,不過在比較安全的系統(tǒng)里面,哪里都可以看的“恢復(fù)現(xiàn)場”等類似概念的身影,就像借錢一樣,“好借好還再借不難”,做程序也是這個道理,哈哈,慢慢體會,編程里面蘊含很多的哲學(xué)道理的。

1、進(jìn)程描述符及任務(wù)結(jié)構(gòu)

在軟件設(shè)計中,第一就是抽象名詞,一切名詞都會在計算機中找到它的數(shù)據(jù)抽象,就是偉大的數(shù)據(jù)結(jié)構(gòu)童鞋。他可能被抽象成一個變量,一個數(shù)組,一個struct,一個對象……可能是任何一種類型,只要滿足你的需求,他就是最perfect的抽象。

進(jìn)程在kernel中是被放在任務(wù)隊列(task list)中的,task list 是個雙向循環(huán)鏈表。鏈表中的每一項都是task_struct類型,即進(jìn)程描述符。定義在中,包含著一個具體進(jìn)程的所有信息。

1.1 分配進(jìn)程描述符

進(jìn)程有的表達(dá)了,但是不能胡亂表達(dá)啊,就像追女朋友一樣,不能見人就表白,那不成耍流氓了,名額有限,見好就收啊。OS能多道并跑的進(jìn)程也就那幾個,若肆意創(chuàng)建進(jìn)程,不跑癱了機子,那就變成病毒程序了,狂吃cpu。Linux使用slab分配器分配task_struct 結(jié)構(gòu)。由slab動態(tài)生成task_struct,只需在棧底創(chuàng)建一個新的thread_info ,再用這個結(jié)構(gòu)的數(shù)據(jù)可以容易的計算出偏移量。

其中包含了task_struct 的指針和進(jìn)程的相關(guān)信息。

1.2 進(jìn)程描述符的存放

Kernel通過PID唯一標(biāo)識一個進(jìn)程,PID是pid_t類型,其實也是int型的,pid最大值是32768 (short int 的Max 值)??梢愿钠渲?,在/proc/sys/kernel/pid_max 中,因為大公司的web服務(wù)器集群工作時32768個進(jìn)程多開貌似不夠啊。

內(nèi)核在處理進(jìn)程時一般是直接通過task_struct進(jìn)程的,都是通過current宏直接找到或計算當(dāng)前task_struct的。有的平臺寄存器豐富,不用專門計算其值,一直把當(dāng)前運行進(jìn)程的值保存在專用的寄存器中就OK。如powerPC用r2寄存器,而x86寄存器少要專門計算。

1.3 進(jìn)程狀態(tài)

進(jìn)程一直處于下面五種狀態(tài)之一:

TASK_RUNNING//運行狀態(tài)

TASK_INTERRUPTIBLE//可中斷狀態(tài)

TASK_UNINTRRUPTIBLE//不可中斷狀態(tài)

TASK_ZOMBIE//僵死

TASK_STOPPED//停止

下圖是大概的轉(zhuǎn)換過程。不很詳細(xì),大家可以search一下……

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11017

    瀏覽量

    215460
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11435

    瀏覽量

    212511
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    206

    瀏覽量

    14187
  • Kernel
    +關(guān)注

    關(guān)注

    0

    文章

    48

    瀏覽量

    11513

原文標(biāo)題:揭開OS的面紗,一位嵌入式er 初探Linux kernel之重點Linux的進(jìn)程管理

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    Linux開發(fā)_Linux進(jìn)程編程

    介紹Linux進(jìn)程概念、進(jìn)程信號捕獲、進(jìn)程管理相關(guān)的命令的使用等知識點。
    的頭像 發(fā)表于 09-17 15:38 ?1567次閱讀
    <b class='flag-5'>Linux</b>開發(fā)_<b class='flag-5'>Linux</b>下<b class='flag-5'>進(jìn)程</b>編程

    Linux進(jìn)程是如何創(chuàng)建出來的?

    Linux 中,進(jìn)程是我們非常熟悉的東東了,哪怕是只寫過一天代碼的人也都用過它。但是你確定它不是你最熟悉的陌生人?我們今天通過深度剖析進(jìn)程的創(chuàng)建過程,幫助你提高對
    發(fā)表于 11-15 09:27 ?657次閱讀

    Linux使用Systemd管理進(jìn)程服務(wù)

    systemd是目前Linux系統(tǒng)上主要的系統(tǒng)守護(hù)進(jìn)程管理工具,由于init一方面對于進(jìn)程管理是串行化的,容易出現(xiàn)阻塞情況,另一方面ini
    發(fā)表于 11-28 09:07 ?631次閱讀

    Linux使用Systemd管理進(jìn)程服務(wù)

    今天浩道跟大家分享linux運維中大家很少用到的一個硬核干貨,使用 Systemd 管理進(jìn)程服務(wù)。讓你體驗一下該技巧帶來的便捷性!
    發(fā)表于 12-12 09:02 ?573次閱讀

    Linux內(nèi)核進(jìn)程管理與調(diào)度:策略優(yōu)化與實踐分析

    今天給大家上點硬貨,關(guān)于Linux進(jìn)程管理和調(diào)度是學(xué)習(xí)和理解Linux的必學(xué)知識。為協(xié)調(diào)多個進(jìn)程 "同時" 運行,現(xiàn)代操作系統(tǒng)通常使用
    發(fā)表于 05-08 09:42 ?1283次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>進(jìn)程</b><b class='flag-5'>管理</b>與調(diào)度:策略優(yōu)化與實踐分析

    Linux進(jìn)程管理

    Linux進(jìn)程管理
    發(fā)表于 05-20 10:53

    LINUX下的進(jìn)程管理問題如何解決

    基于LINUX下的進(jìn)程管理問題
    發(fā)表于 05-20 07:58

    linux系統(tǒng)進(jìn)程存在狀態(tài)及管理

    linux系統(tǒng)進(jìn)程存在狀態(tài)及管理詳解
    發(fā)表于 05-21 06:28

    Linux進(jìn)程管理工具之Supervisor

    Linux進(jìn)程管理工具Supervisor
    發(fā)表于 06-12 10:58

    Linux進(jìn)程管理

    Linux進(jìn)程管理 本章主要介紹進(jìn)程的概念、狀態(tài)、構(gòu)成以及Linux進(jìn)程的相關(guān)知識。 掌握
    發(fā)表于 04-28 14:57 ?0次下載

    Linux進(jìn)程管理:什么是進(jìn)程進(jìn)程的生命周期

    所有運行在Linux操作系統(tǒng)中的進(jìn)程都被task_struct結(jié)構(gòu)管理,該結(jié)構(gòu)同時被叫作進(jìn)程描述。一個進(jìn)程描述包含一個運行
    的頭像 發(fā)表于 02-15 14:29 ?8296次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b><b class='flag-5'>管理</b>:什么是<b class='flag-5'>進(jìn)程</b>?<b class='flag-5'>進(jìn)程</b>的生命周期

    學(xué)會Linux進(jìn)程管理的方法

    Linux 是一種動態(tài)系統(tǒng),能夠適應(yīng)不斷變化的計算需求。Linux 計算需求的表現(xiàn)是以進(jìn)程 的通用抽象為中心的。進(jìn)程可以是短期的(從命令行執(zhí)行的一個命令),也可以是長期的(一種網(wǎng)絡(luò)服務(wù)
    發(fā)表于 05-16 17:19 ?833次閱讀
    學(xué)會<b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b><b class='flag-5'>管理</b>的方法

    簡要剖析Linux系統(tǒng)的進(jìn)程管理機制_LINUX_操作系統(tǒng)_腳本之家

    ,更詳細(xì)的說,linux采用了分時管理的方法,所有的任務(wù)都放在一個隊列中,操作系統(tǒng)根據(jù)每個任務(wù)的優(yōu)先級為每個任務(wù)分配合適的時間片,每個時間片很短,用戶根本感覺不到是多個任務(wù)在運行,從而使所有的任務(wù)共同
    發(fā)表于 04-02 14:46 ?635次閱讀

    linux查看weblogic進(jìn)程

    Linux操作系統(tǒng)中,WebLogic是一種常用的Java應(yīng)用服務(wù)器,用于部署和管理企業(yè)級Java應(yīng)用程序。為了確保WebLogic服務(wù)器正常運行,有時我們需要查看WebLogic進(jìn)程以了解其狀態(tài)
    的頭像 發(fā)表于 12-05 16:07 ?2336次閱讀

    Linux系統(tǒng)進(jìn)程管理入門指南

    Linux 系統(tǒng)中,進(jìn)程是正在運行的程序的實例。理解進(jìn)程管理、查看和控制對于系統(tǒng)管理員和開發(fā)者來說非常重要
    的頭像 發(fā)表于 04-22 14:34 ?224次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>進(jìn)程</b><b class='flag-5'>管理</b>入門指南

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品