<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 三、進(jìn)程-創(chuàng)新互聯(lián)

            進(jìn)程、輕量級(jí)進(jìn)程和線(xiàn)程三、進(jìn)程

            進(jìn)程類(lèi)似于人類(lèi):他們被產(chǎn)生,有或多或少有效的生命,可以產(chǎn)生一個(gè)或多個(gè)子進(jìn)程,最終都要死亡。一個(gè)微小的差異是進(jìn)程之間沒(méi)有性別差異——每個(gè)進(jìn)程只有一個(gè)父親。

            我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、營(yíng)口ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的營(yíng)口網(wǎng)站制作公司

            從內(nèi)核的觀(guān)點(diǎn)來(lái)看:進(jìn)程的目的就是擔(dān)當(dāng)分配系統(tǒng)資源的實(shí)體(CPU時(shí)間、內(nèi)存等資源)。

            實(shí)現(xiàn)多線(xiàn)程應(yīng)用的一個(gè)簡(jiǎn)單的方式是把輕量級(jí)進(jìn)程與每個(gè)線(xiàn)程關(guān)聯(lián)起來(lái)。這樣線(xiàn)程之間就可以通過(guò)簡(jiǎn)單的共享同一內(nèi)存地址空間、同一打開(kāi)文件集等來(lái)訪(fǎng)問(wèn)相同的應(yīng)用數(shù)據(jù)結(jié)構(gòu)集;同時(shí)每個(gè)線(xiàn)程都可以由內(nèi)核獨(dú)立調(diào)度,以便一個(gè)睡眠的同時(shí)另一個(gè)仍然是可運(yùn)行的。(共享內(nèi)存地址、內(nèi)核獨(dú)立調(diào)度)。

            進(jìn)程描述符

            進(jìn)程描述符都是task_struct類(lèi)型結(jié)構(gòu),它的字段包含了一個(gè)進(jìn)程相關(guān)的所有信息。

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

            進(jìn)程描述符的state字段描述了進(jìn)程當(dāng)前所處的狀態(tài)。它由一組標(biāo)志組成,其中每個(gè)標(biāo)志描述一種可能的進(jìn)程狀態(tài)。在當(dāng)前l(fā)inux版本中,這些狀態(tài)是互斥的,只能設(shè)置一種狀態(tài);其余的標(biāo)志將被清除。

            1、可運(yùn)行TASK_RUNNING 進(jìn)程在CPU上要么正在執(zhí)行,要么準(zhǔn)備執(zhí)行

            2、可中斷TASK_INTERUPTIBLE 進(jìn)程被掛起,直到達(dá)到某個(gè)條件。產(chǎn)生一個(gè)硬件中斷,釋放進(jìn)程正等待的系統(tǒng)資源,或傳遞一個(gè)信號(hào)都是可以喚醒進(jìn)程的條件。

            3、不可中斷 TASK_UNINTERUPTIBLE 與可中斷狀態(tài)類(lèi)似,但是把信號(hào)傳遞到不可中斷狀態(tài)進(jìn)程時(shí)不能改變其狀態(tài)。例如,當(dāng)進(jìn)程打開(kāi)一個(gè)設(shè)備文件,其相應(yīng)的設(shè)備驅(qū)動(dòng)程序開(kāi)始探測(cè)相應(yīng)的硬件設(shè)備時(shí)會(huì)用到這種狀態(tài)。探測(cè)完成之前,設(shè)備驅(qū)動(dòng)程序不能被中斷,否則,硬件設(shè)備會(huì)處于不可預(yù)知的狀態(tài)。

            4、暫停狀態(tài)TASK_STOPPED 進(jìn)程的執(zhí)行被暫停。當(dāng)進(jìn)程受到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信號(hào)后進(jìn)入暫停狀態(tài)

            5、TASK_TRACED跟蹤狀態(tài) 進(jìn)程的執(zhí)行已經(jīng)有debugger程序暫停。

            以下兩個(gè)進(jìn)程狀態(tài)既可以存放到state字段又可以存放到exit_state字段

            6、僵死狀態(tài)(EXIT_ZOMBLE) 進(jìn)程的執(zhí)行被終止,但是父進(jìn)程還沒(méi)有發(fā)布wait4()或waitpid()系統(tǒng)調(diào)用來(lái)返回有關(guān)死亡進(jìn)程的信息。

            7、僵死撤銷(xiāo)狀態(tài)(EXIT_DEAD) 最終狀態(tài):由于父進(jìn)程剛發(fā)出wait4()系統(tǒng)調(diào)用,因而進(jìn)程由系統(tǒng)刪除。為了防止其他執(zhí)行線(xiàn)程在同一個(gè)進(jìn)程上也執(zhí)行wait()類(lèi)系統(tǒng)調(diào)用而產(chǎn)生競(jìng)爭(zhēng)條件,而把僵死狀態(tài)改為撤銷(xiāo)狀態(tài)。

            標(biāo)識(shí)一個(gè)進(jìn)程

            由于循環(huán)使用PID編號(hào),內(nèi)核必須通過(guò)管理一個(gè)pidmap_array的位圖來(lái)標(biāo)識(shí)當(dāng)前已經(jīng)分配的pid號(hào)和閑置的pid號(hào)。因?yàn)橐粋€(gè)頁(yè)框包含4*1024*8個(gè)位,所以32位體系結(jié)構(gòu)中pidmap_array位圖存放在一個(gè)單獨(dú)的頁(yè)中。一個(gè)多線(xiàn)程應(yīng)用中的所有線(xiàn)程都必須有相同的pid。Linux引入線(xiàn)程組:一個(gè)線(xiàn)程組中的所有線(xiàn)程使用和該線(xiàn)程組領(lǐng)頭線(xiàn)程相同的pid。它被存入進(jìn)程描述符的tgid字段中。getpid()系統(tǒng)調(diào)用返回當(dāng)前進(jìn)程的tgid值而不是pid值。

            進(jìn)程描述符處理

            對(duì)每個(gè)進(jìn)程來(lái)說(shuō),Linux都把兩個(gè)不同的數(shù)據(jù)結(jié)構(gòu)緊湊的放在一個(gè)單獨(dú)為進(jìn)程分配的存儲(chǔ)區(qū)域中:一個(gè)是與進(jìn)程描述符相關(guān)的小數(shù)據(jù)結(jié)構(gòu)thread_Info,一個(gè)是內(nèi)核態(tài)的進(jìn)程堆棧。這塊存儲(chǔ)區(qū)域的大小一般為2頁(yè)。考慮到效率的因素,內(nèi)核讓這個(gè)8k空間占連續(xù)兩個(gè)頁(yè)框并讓第一個(gè)頁(yè)框的起始地址是2^13的倍數(shù)。

            因?yàn)閮?nèi)核控制路徑使用很少的棧,因此只需要幾千個(gè)字節(jié)的內(nèi)核態(tài)堆棧。對(duì)已,對(duì)棧和thread_info來(lái)說(shuō),8k足夠了。

            thread_info存放在這個(gè)8k內(nèi)存區(qū)域的開(kāi)始,而棧從內(nèi)存區(qū)域的末端向下增長(zhǎng)。

            esp寄存器時(shí)CPU棧指針,用來(lái)存放棧頂單元的地址。在80x86系統(tǒng)中,棧起始于末端,并朝這個(gè)內(nèi)存區(qū)域開(kāi)始的方向增長(zhǎng)。從用戶(hù)態(tài)剛切換到內(nèi)核態(tài)后,進(jìn)程的內(nèi)核棧總是空的,因此,esp寄存器這是指向這個(gè)棧的頂端。一旦數(shù)據(jù)寫(xiě)入棧,esp的值就遞減。因?yàn)閠hread_Info的結(jié)構(gòu)式52個(gè)字節(jié)長(zhǎng),因此內(nèi)核棧能擴(kuò)展到8140個(gè)字節(jié)。

            標(biāo)識(shí)當(dāng)前進(jìn)程

            如果thread_union結(jié)構(gòu)長(zhǎng)度是8k,則內(nèi)核屏蔽掉esp的低13位就可以獲得thread_info的基地址;如果thread_union結(jié)構(gòu)的長(zhǎng)度是4k,內(nèi)核需要屏蔽掉esp的低12位。這項(xiàng)工作由current_thread_info()函數(shù)來(lái)完成,它產(chǎn)生如下匯編指令:

            movl $-8192, %ecx //將19個(gè)1+00000000000000(低13位為0)的值保存到ecx寄存器

            andl %esp, %ecx //取出ecx中的值與esp中當(dāng)前棧頂單元的地址進(jìn)行位與運(yùn)算,即屏蔽esp的后13位。

            movl %ecx ,p //將計(jì)算的結(jié)構(gòu)賦值給p

            因?yàn)閠ask字段在thread_info結(jié)構(gòu)中的偏移量為0,所以執(zhí)行完以上指令后,p就包含在cpu上運(yùn)行進(jìn)程的進(jìn)程描述符指針。

            雙向鏈表

            linux定義了list_head數(shù)據(jù)結(jié)構(gòu),字段next和prev分別表示通用雙向鏈表向前和向后的指針元素。list_head字段的指針中存放的是另一個(gè)list_head字段的地址,而不是含有l(wèi)ist_head結(jié)構(gòu)的整個(gè)數(shù)據(jù)結(jié)構(gòu)的地址。

            雙向鏈表處理函數(shù)和宏

            list_add(n,p)

            list_add_tail(n,p)把n指向的元素插在p指向的元素之前。

            list_del(p)

            list_empty(p) 檢查由第一個(gè)元素地址p指向的鏈表是否為空

            list_entry(p,t,m) 返回類(lèi)型為t的數(shù)據(jù)結(jié)構(gòu)地址,其中類(lèi)型t含有l(wèi)ist_head字段,而list_head字段中含有名字m和地址p

            list_for_each(p,h) 對(duì)表頭地址h指定的鏈表進(jìn)行掃描,每次循環(huán)時(shí),通過(guò)p返回指向鏈表元素的list_head結(jié)構(gòu)的指針

            list_for_each_entry(p,h,m) 與list_for_each類(lèi)似,但是返回了包含list_head結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)的地址,而不是list_head結(jié)構(gòu)本身的地址

            進(jìn)程鏈表

            進(jìn)程鏈表的頭是init_task描述符,init_task的tasks.prev字段指向鏈表中最后插入的額進(jìn)程描述符的tasks字段。

            SET_LINKS和REMOVE_LINKS宏分別用于從進(jìn)程鏈表中插入和刪除一個(gè)進(jìn)程描述符。

            宏for_each_process掃描整個(gè)進(jìn)程鏈表定義如下:

            #define for_each_process(p)

            for(p=&init_task;(p=list_entry((p)->tasks.next, struct task_struct,tasks))!=&init_task; )

            TASK_RUNNING狀態(tài)的進(jìn)程鏈表

            提高調(diào)度程序運(yùn)行速度的訣竅是建立多個(gè)可運(yùn)行進(jìn)程鏈表,每種進(jìn)程優(yōu)先級(jí)權(quán)限對(duì)應(yīng)一個(gè)不同的鏈表。每個(gè)task_struct描述符包含一個(gè)list_head類(lèi)型字段run_list。如果進(jìn)程的優(yōu)先權(quán)等于k,run_list字段把進(jìn)程鏈接到優(yōu)先權(quán)為k的可運(yùn)行進(jìn)程鏈表中。所有這些可運(yùn)行進(jìn)程鏈表由一個(gè)單獨(dú)的prio_array_t數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。

            prio_array_t數(shù)據(jù)結(jié)構(gòu)字段:

            int nr_active 鏈表中進(jìn)程描述符的數(shù)量

            unsigned long[5] bitmp 優(yōu)先權(quán)位圖;當(dāng)且僅當(dāng)某個(gè)優(yōu)先權(quán)的進(jìn)程鏈表不為空時(shí)設(shè)置相應(yīng)的標(biāo)志位

            struct list_head[140] queue 140個(gè)優(yōu)先權(quán)隊(duì)列的頭結(jié)點(diǎn)。

            進(jìn)程間的關(guān)系

            進(jìn)程描述符中表示進(jìn)程進(jìn)程親屬字段的描述

            real_parent 指向創(chuàng)建了p的進(jìn)程描述符,如果p的父進(jìn)程不存在,就指向1的進(jìn)程描述符

            parent   指向p的當(dāng)前父進(jìn)程。它的值常常與real_parent一致,偶爾不同:當(dāng)一個(gè)進(jìn)程發(fā)出監(jiān)控p的ptrace()系統(tǒng)請(qǐng)求時(shí)

            children   鏈表的頭部,鏈表中的所有元素都是p創(chuàng)建的子進(jìn)程

            sibling   指向兄弟進(jìn)程鏈表中的下一元素或前一個(gè)元素的指針,這些兄弟進(jìn)程的父進(jìn)程都是p

            建立非親屬關(guān)系的進(jìn)程描述符字段

            group_leader   p所在進(jìn)程組的領(lǐng)頭進(jìn)程的描述符指針

            signal->pgrp   p所在進(jìn)程組領(lǐng)頭進(jìn)程的pid

            tgid       p所在線(xiàn)程組的領(lǐng)頭進(jìn)程pid

            signal->session p所在登錄會(huì)話(huà)領(lǐng)頭進(jìn)程的pid

            ptrace_children 鏈表的頭,該鏈表包含所有被debugger程序跟蹤的p的子進(jìn)程

            ptrace_list     指向所跟蹤進(jìn)程其實(shí)際父進(jìn)程鏈表的前一個(gè)和下一個(gè)元素

            pidhash表及鏈表

            內(nèi)核必須能從進(jìn)程的pid導(dǎo)出對(duì)應(yīng)的進(jìn)程描述符指針。順序掃描進(jìn)程鏈表并檢查進(jìn)程描述符的pid字段是可行但是相當(dāng)?shù)牡托А榱思铀俨檎遥肓?個(gè)散列表。

            4個(gè)散列表和進(jìn)程描述符中的相關(guān)字段

            PIDTYPE_PID    pid  進(jìn)程的PID

            PIDTYPE_TGID    tgid  線(xiàn)程組領(lǐng)頭進(jìn)程的pid

            PIDTPE_PGID     pgrp  進(jìn)程組領(lǐng)頭進(jìn)程的pid

            PIDTYPE_SID    session  回話(huà)領(lǐng)頭進(jìn)程的pid

            內(nèi)核初始化期間動(dòng)態(tài)的為這4個(gè)散列表分配空間,并把他們的地址存入pid_hash數(shù)組中。一個(gè)散列表的長(zhǎng)度依賴(lài)于可用的ram容量。

            用pid_hashfn宏把PID數(shù)值轉(zhuǎn)化為散列表的表索引。

            Linux利用鏈表來(lái)處理散列表中沖突的pid:每一個(gè)表項(xiàng)是有沖突的進(jìn)程描述符組成的雙向鏈表。

            具有鏈表的散列法比從pid到表索引的線(xiàn)性轉(zhuǎn)換更優(yōu)越,因?yàn)樵谌魏谓o定的實(shí)例中,系統(tǒng)中的進(jìn)程數(shù)總是遠(yuǎn)遠(yuǎn)小于32768。如果在任何給定的實(shí)例中大部分表項(xiàng)都不使用的話(huà),那么把表定義為32768項(xiàng)會(huì)是一種存儲(chǔ)浪費(fèi)。

            由于需要跟蹤進(jìn)程間的關(guān)系,pid散列表中使用的數(shù)據(jù)結(jié)構(gòu)非常復(fù)雜。如果根據(jù)線(xiàn)程組號(hào)查找散列表,只能返回一個(gè)進(jìn)程描述符,就是線(xiàn)程組領(lǐng)頭進(jìn)程的描述符。為了能快速返回組中其他所有的進(jìn)程,內(nèi)核就必須為每個(gè)線(xiàn)程組保留一個(gè)鏈表。PID散列表的數(shù)據(jù)結(jié)構(gòu)解決了這個(gè)問(wèn)題。因?yàn)樗麄兛梢詾榘谝粋€(gè)散列表中的任何pid號(hào)定義進(jìn)程鏈表。針對(duì)四中散列表,定義了四個(gè)pid結(jié)構(gòu)的數(shù)組,它在進(jìn)程描述符的pids字段中。

            pid結(jié)構(gòu)的字段

            int      nr      pid的數(shù)值

            struct h_list_node  pid_chain  鏈接散列表的下一個(gè)和前一個(gè)元素

            struct list_head  pid_list  鏈接相同pid值的進(jìn)程鏈表的標(biāo)頭

            如何組織進(jìn)程

            運(yùn)行隊(duì)列鏈表把處于TASK_RUNNING狀態(tài)的所有進(jìn)程組織在一起;沒(méi)有為處于TASK_STOPPED、EXIT_ZOMBLE或EXIT_DEAD狀態(tài)的進(jìn)程建立專(zhuān)門(mén)的鏈表。由于對(duì)處于這些狀態(tài)的進(jìn)程訪(fǎng)問(wèn)比較簡(jiǎn)單,或者通過(guò)pid或者通過(guò)特定父進(jìn)程的子進(jìn)程鏈表,所有不必對(duì)這三種狀態(tài)進(jìn)程分組。

            根據(jù)不同特殊事件把處于TASK_INTERUPTIBLE和TASK_UNinteruptible狀態(tài)的進(jìn)程細(xì)分為許多類(lèi),將這些進(jìn)程鏈接到等待隊(duì)列。

            等待隊(duì)列

            等待隊(duì)列由雙向鏈表實(shí)現(xiàn),其元素包括指向進(jìn)程描述符的指針。每個(gè)等待隊(duì)列有一個(gè)等待隊(duì)列頭wait_queue_head_t;因?yàn)榈却?duì)列是有中斷處理程序和主要內(nèi)核函數(shù)修改的,因此必須對(duì)其雙向鏈表進(jìn)行保護(hù),同步是通過(guò)等待隊(duì)列頭中的lock自旋鎖達(dá)到的。等待隊(duì)列鏈表中的元素類(lèi)型為wait_queue_t.

            有兩種睡眠進(jìn)程:互斥進(jìn)程(等待隊(duì)列元素的flags字段為1)由內(nèi)核有選擇的喚醒,而非互斥進(jìn)程(flags=0)總是由內(nèi)核在事件發(fā)生時(shí)喚醒。等待訪(fǎng)問(wèn)臨界資源的進(jìn)程是互斥進(jìn)程的例子,等待相關(guān)事件的進(jìn)程是非互斥的。

            等待隊(duì)列的操作

            定義一個(gè)等待隊(duì)列:DECLARE_WAIT_QUEUE_HEAD(name)定義一個(gè)等待隊(duì)列的頭init_waitqueue_head()可以用來(lái)初始化動(dòng)態(tài)分配的等待隊(duì)列的頭變量。

            初始化wait_queue_t結(jié)構(gòu)變量:init_waitqueue_entry(q,p);DEFINE_WAIT宏

            插入等待隊(duì)列:add_wait_queue()非互斥 第一個(gè)位置;add_wait_queue_exclusive()互斥最后一個(gè)位置

            移除:remove_wait_queue()

            判斷隊(duì)列為空:waitqueue_active()

            要等待特定條件的進(jìn)程可以條用如下函數(shù):

            sleep_on();

            interruptible_sleep_on();

            sleep_on_timeout();interruptible_sleep_on_timeout();

            prepare_to_wait();finsh_wait();prepare_to_wait_exclusive();

            wait_event;wait_event_interruptible;

            喚醒:各種喚醒函數(shù),不舉例。

            喚醒:非互斥進(jìn)程p將有default_wake_function()喚醒

            進(jìn)程資源限制

            每個(gè)進(jìn)程都由一組相關(guān)資源的限制,限制了進(jìn)程能使用的系統(tǒng)資源數(shù)量。對(duì)當(dāng)前進(jìn)程的資源限制存放在current->signal->rlim字段,即進(jìn)程信號(hào)描述符的一個(gè)字段。該字段類(lèi)型為rlimt結(jié)構(gòu)的數(shù)組,每個(gè)資源限制對(duì)應(yīng)一個(gè)元素:

            struct rlimit{

            unsigned long rlim_cur;

            unsigned long rlim_max;

            }

            rlim_cur字段是資源的當(dāng)前資源限制。rlim_max字段是組員限制所允許的大值。

            進(jìn)程切換

            為了控制進(jìn)程的執(zhí)行,內(nèi)核必須有能力掛起當(dāng)前cpu上運(yùn)行的進(jìn)程,并恢復(fù)以前掛起的某個(gè)進(jìn)程執(zhí)行。這種行為被稱(chēng)為進(jìn)程切換、任務(wù)切換或上下文切換。

            硬件上下文

            進(jìn)程恢復(fù)執(zhí)行前必須裝入寄存器的一組數(shù)據(jù)稱(chēng)為硬件上下文。硬件上下文是進(jìn)程可執(zhí)行上下文的一個(gè)子集,因?yàn)榭蓤?zhí)行上下文包含進(jìn)程執(zhí)行所需要的所有信息。linux中,進(jìn)程硬件上下文的一部分存放在TSS段,而剩余部分存放在內(nèi)核態(tài)的堆棧中。

            進(jìn)程切換只發(fā)生在內(nèi)核態(tài)。在執(zhí)行進(jìn)程切換之前,用戶(hù)態(tài)進(jìn)程使用的所有寄存器內(nèi)容已經(jīng)保存在內(nèi)核態(tài)堆棧上,這也包括ss和esp這對(duì)寄存器的內(nèi)容(存儲(chǔ)用戶(hù)態(tài)堆棧指針的地址)。

            任務(wù)狀態(tài)段

            盡管linux不使用硬件上下文切換,但是強(qiáng)制它為系統(tǒng)中不同的cpu創(chuàng)建一個(gè)TSS。因?yàn)椋?/p>

            1、cpu從用戶(hù)態(tài)切換到內(nèi)核態(tài)時(shí),它就從TSS中獲取內(nèi)核態(tài)堆棧的地址。

            2、當(dāng)用戶(hù)態(tài)進(jìn)程視圖通過(guò)in或out指令訪(fǎng)問(wèn)一個(gè)I/O端口時(shí),cpu需要訪(fǎng)問(wèn)存放在TSS中的I/O許可權(quán)位圖,以檢查該進(jìn)程是否有訪(fǎng)問(wèn)端口的權(quán)力。

            tss_struct結(jié)構(gòu)描述TSS的格式。每次進(jìn)程切換時(shí),內(nèi)核都更新TSS的某些字段以便相應(yīng)的cpu控制單元可以安全的檢索到它需要的信息。因此,TSS反應(yīng)了CPU上當(dāng)前進(jìn)程的特權(quán)級(jí)別,但不必為沒(méi)有運(yùn)行的進(jìn)程保留TSS。

            每個(gè)TSS有它自己8字節(jié)的任務(wù)狀態(tài)段描述符。這個(gè)描述符包括指向TSS起始地址的32位base字段,20位limit字段。s標(biāo)志位被清0,以表示相應(yīng)的TSS是系統(tǒng)段。type字段值為11或9以表示這個(gè)段實(shí)際上是TSS。每個(gè)cpu的tr寄存器包含相應(yīng)TSS的TSSD選擇符,也包含了兩個(gè)隱藏的非編程字段base和limit。這樣處理器可以直接對(duì)TSS尋址而不用從GDT中檢索TSS的地址。

            thread字段

            每個(gè)進(jìn)程描述符包含一個(gè)類(lèi)型為thread_struct的thread字段,只要進(jìn)程被切換出去,內(nèi)核就把硬件上下文保存在這個(gè)結(jié)構(gòu)中。

            執(zhí)行進(jìn)程切換

            從本質(zhì)上說(shuō),進(jìn)程切換由兩步組成:

            1、切換頁(yè)全局目錄以安裝一個(gè)新的地址空間;

            2、切換內(nèi)核堆棧和硬件上下文,因?yàn)橛布舷挛奶峁┝藘?nèi)核執(zhí)行新進(jìn)程所需要的所有信息,包含cpu寄存器。

            switch_to宏

            __switch_to()函數(shù)

            創(chuàng)建進(jìn)程

            1、copy on write機(jī)制允許父子進(jìn)程讀相同的物理頁(yè)。只要兩者中有一個(gè)視圖寫(xiě)一個(gè)物理頁(yè),內(nèi)核就把這個(gè)頁(yè)的內(nèi)容拷貝到一個(gè)新的物理頁(yè),并把這個(gè)新的物理頁(yè)分配給正在寫(xiě)的進(jìn)程。

            2、輕量級(jí)進(jìn)程允許父子進(jìn)程共享每進(jìn)程在內(nèi)核的很多數(shù)據(jù)結(jié)構(gòu),如頁(yè)表、打開(kāi)文件表及信號(hào)處理。

            3、vfork()系統(tǒng)調(diào)用創(chuàng)建的進(jìn)程能共享其父進(jìn)程的內(nèi)存地址空間。為了防止父進(jìn)程重寫(xiě)子進(jìn)程需要的數(shù)據(jù),阻塞父進(jìn)程的執(zhí)行,一直到子進(jìn)程退出或執(zhí)行一個(gè)新的程序?yàn)橹埂?/p>

            clone()、fork()和vfork()系統(tǒng)調(diào)用

            do_fork()函數(shù)負(fù)責(zé)處理clone()、fork()、vfork()系統(tǒng)調(diào)用

            copy_process()創(chuàng)建進(jìn)程描述符以及子進(jìn)程執(zhí)行所需要的所有其他數(shù)據(jù)結(jié)構(gòu)

            內(nèi)核線(xiàn)程

            與普通進(jìn)程的區(qū)別:1、內(nèi)核線(xiàn)程只運(yùn)行在內(nèi)核態(tài),而普通進(jìn)程既可以運(yùn)行在內(nèi)核態(tài),也可以運(yùn)行在用戶(hù)態(tài)。2、內(nèi)核線(xiàn)程只能使用大于PAGE_OFFSET的線(xiàn)性地址空間。

            創(chuàng)建一個(gè)內(nèi)核線(xiàn)程

            kernel_thread()函數(shù)創(chuàng)建一個(gè)新的內(nèi)核線(xiàn)程

            進(jìn)程0和進(jìn)程1以及其他內(nèi)核線(xiàn)程

            撤銷(xiāo)進(jìn)程

            進(jìn)程終止:exit_group()終止線(xiàn)程組;exit()終止一個(gè)線(xiàn)程

            do_group_exit();

            do_exit();

            進(jìn)程刪除  release_task()函數(shù)從僵死進(jìn)程的描述符中分離出最后的數(shù)據(jù)結(jié)構(gòu);對(duì)僵死進(jìn)程的處理方式:如果父進(jìn)程不需要接受來(lái)自自進(jìn)程的信號(hào),就do_exit();如果已經(jīng)給父進(jìn)程信號(hào),就調(diào)用wait4()或waitpid(),將回收進(jìn)程描述符所占用的內(nèi)存空間。在前一種情況下,內(nèi)存的回收將有進(jìn)程調(diào)度程序來(lái)完成。

            網(wǎng)站名稱(chēng):三、進(jìn)程-創(chuàng)新互聯(lián)
            當(dāng)前鏈接:http://www.jbt999.com/article42/diechc.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)商城網(wǎng)站響應(yīng)式網(wǎng)站移動(dòng)網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            成都app開(kāi)發(fā)公司

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 久久99国产免费 | 免费看操逼逼 | 荫蒂添出高潮A片视频 | 国产精品一区二区黑人巨大 | 高清久久无码视频 |