溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解web進(jìn)程和線程

發(fā)布時(shí)間:2021-12-17 09:30:58 來(lái)源:億速云 閱讀:146 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么理解web進(jìn)程和線程”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么理解web進(jìn)程和線程”吧!

    進(jìn)程和線程是操作系統(tǒng)里很重要的概念,但是所有的東西都會(huì)落實(shí)到代碼??雌饋?lái)很復(fù)雜的進(jìn)程線程,其實(shí)在操作系統(tǒng)的代碼里。也只是一些數(shù)據(jù)結(jié)構(gòu)和算法。只不過(guò)他比一般的數(shù)據(jù)結(jié)構(gòu)和算法可能復(fù)雜點(diǎn)。但是學(xué)習(xí)方法還是一樣的,就是深入源碼,一探究竟。
    進(jìn)程在操作系統(tǒng)里,是用一個(gè)task_struct結(jié)構(gòu)體表示的。因?yàn)椴僮飨到y(tǒng)是大部分是用c語(yǔ)言實(shí)現(xiàn)的,沒(méi)有對(duì)象這個(gè)概念。如果我們用高級(jí)語(yǔ)言來(lái)理解的話,每個(gè)進(jìn)程就是一個(gè)對(duì)象。每次新建一個(gè)進(jìn)程,就是新建一個(gè)對(duì)象。task_struct結(jié)構(gòu)體可以說(shuō)是類(lèi)的定義。我們看一下一個(gè)task_struct的定義。

怎么理解web進(jìn)程和線程  
在這里插入圖片描述

我們看到task_struct結(jié)構(gòu)體里其實(shí)就是保持了一個(gè)進(jìn)程所需要的一些信息,報(bào)包括執(zhí)行狀態(tài),執(zhí)行上下文tss,打開(kāi)的文件、根目錄、工作目錄、收到的信號(hào)、信號(hào)處理函數(shù)、代碼段、數(shù)據(jù)段的位置,進(jìn)程id,執(zhí)行時(shí)間、退出碼等等。我們具體看一下這些數(shù)據(jù)結(jié)構(gòu)的作用。


 

進(jìn)程的管理

操作系統(tǒng)里會(huì)維護(hù)一個(gè)task_struct數(shù)組或者鏈表來(lái)記錄當(dāng)前系統(tǒng)中所有的進(jìn)程。每次新建一個(gè)進(jìn)程的時(shí)候,就會(huì)往里面追加一個(gè)task_struct結(jié)構(gòu)體,每次銷(xiāo)毀一個(gè)進(jìn)程的時(shí)候,該進(jìn)程的父進(jìn)程會(huì)刪除對(duì)應(yīng)的task_struct。

 

進(jìn)程的調(diào)度

操作系統(tǒng)的運(yùn)作,很大程度上是由時(shí)鐘驅(qū)動(dòng)的,電腦中會(huì)有一個(gè)硬件間歇性地產(chǎn)生時(shí)鐘中斷。中斷間隔是由操作系統(tǒng)初始化該硬件時(shí)決定的(定時(shí)器也是由該硬件驅(qū)動(dòng)的,我們?cè)趹?yīng)用層使用的定時(shí)器功能,歸根到底還是使用系統(tǒng)的定時(shí)器去實(shí)現(xiàn)的)。每次時(shí)鐘中斷的時(shí)候如果當(dāng)前執(zhí)行的進(jìn)程時(shí)間片已到,則會(huì)發(fā)生進(jìn)程調(diào)度。另外進(jìn)程阻塞的時(shí)候,也會(huì)發(fā)生進(jìn)程調(diào)度。被調(diào)度到的進(jìn)程,系統(tǒng)就會(huì)把task_struct里的tss信息加載到cpu。包括當(dāng)前執(zhí)行的代碼位置,各種寄存器的值。然后就完成了進(jìn)程的切換。

 

進(jìn)程的執(zhí)行時(shí)間

每次時(shí)鐘中斷的時(shí)候,時(shí)鐘中斷處理程序都會(huì)累加當(dāng)前進(jìn)程的執(zhí)行時(shí)間,我們平時(shí)查看的進(jìn)程的執(zhí)行時(shí)間,這些數(shù)據(jù)就是由這些字段記錄的。一個(gè)進(jìn)程在內(nèi)核態(tài)和用戶態(tài)下執(zhí)行的時(shí)間,是分開(kāi)計(jì)算的。

 

信號(hào)

task_struct中用三個(gè)字段實(shí)現(xiàn)了信號(hào)相關(guān)的功能,一個(gè)是signal,記錄了進(jìn)程收到的信號(hào),按位計(jì)算。blocked就是記錄當(dāng)前進(jìn)程不接收哪些信號(hào)。sigaction則是記錄每個(gè)信號(hào)對(duì)應(yīng)的處理函數(shù),和signal一一對(duì)應(yīng)。每次我們調(diào)用kill的時(shí)候,其實(shí)就是修改signal字段的值。然后在某些時(shí)機(jī)下,系統(tǒng)會(huì)執(zhí)行sigaction里對(duì)應(yīng)的函數(shù)。這些時(shí)機(jī)包括系統(tǒng)調(diào)用返回,時(shí)鐘中斷處理程序返回、還有其他的硬件中斷返回等等。

 

狀態(tài)

task_struct用一個(gè)字段state記錄了進(jìn)程當(dāng)前的狀態(tài),exit_code記錄進(jìn)程退出時(shí)的退出碼。

 

文件系統(tǒng)相關(guān)

當(dāng)前進(jìn)程的根目錄、工作目錄。我們平時(shí)在進(jìn)程里打開(kāi)一個(gè)文件的時(shí)候,如果沒(méi)有寫(xiě)明絕對(duì)路徑,系統(tǒng)就會(huì)以工作目錄為基礎(chǔ),加上我們傳的相對(duì)路徑拼出絕對(duì)路徑。從而找到文件。另外filp字段是維護(hù)進(jìn)程打開(kāi)的文件信息。我們平時(shí)拿到的文件描述符就是filp字段的索引。他會(huì)逐步找到底層對(duì)應(yīng)的文件或者socket。executable是保存進(jìn)程對(duì)應(yīng)的二進(jìn)制文件所在的文件信息。我們都知道程序加載到內(nèi)存變成進(jìn)程。executable保存的就是程序?qū)?yīng)的文件的信息。

 

權(quán)限

task_struct里用uid、euid、gid、egid等字段記錄進(jìn)程的權(quán)限信息。

 

進(jìn)程關(guān)系信息

pid字段記錄了當(dāng)前進(jìn)程的id,father記錄了父進(jìn)程的id。pgrp,session,leader分別是組id,會(huì)話id,是不是會(huì)話leader。多個(gè)進(jìn)程組成一個(gè)組,多個(gè)組組成一個(gè)會(huì)話。如果一個(gè)進(jìn)程是這個(gè)組或者會(huì)話的leader,則他的id會(huì)成為組或者會(huì)話的id,比如
組1有進(jìn)程a的id是1(組leader、會(huì)話leader)進(jìn)程b的id是2。
組2有進(jìn)程c的id是3(組leader),進(jìn)程d的id是4。
所有進(jìn)程在一個(gè)會(huì)話,則組1的所有進(jìn)程的組id和會(huì)話id都是1。組2所有進(jìn)程的組id是3,會(huì)話id是1。

 

執(zhí)行上下文

tss_struct和desc_struct結(jié)構(gòu)體記錄了進(jìn)程執(zhí)行的上下文,每次進(jìn)程切換的時(shí)候,如果是被調(diào)度執(zhí)行,則上下文加載到cpu和對(duì)應(yīng)的硬件中,如果是被掛起,則cpu和硬件的信息保存到上下文。下次執(zhí)行的時(shí)候恢復(fù)。

以上就是一個(gè)進(jìn)程所具有的一些屬性。我們發(fā)現(xiàn),進(jìn)程也沒(méi)有那么難以理解,好比我們平時(shí)定義一個(gè)人,他有名字,身高,年齡屬性一樣。每個(gè)對(duì)象,他都有屬于自己的一些屬性。

下面我們?cè)賮?lái)看一下線程。相比進(jìn)程,線程對(duì)很多同學(xué)來(lái)說(shuō)可能更難理解。其實(shí)對(duì)于操作系統(tǒng)來(lái)說(shuō),沒(méi)有單獨(dú)去實(shí)現(xiàn)線程這個(gè)概念,操作系統(tǒng)把進(jìn)程和線程抽象成執(zhí)行上下文??梢哉f(shuō)他們是一個(gè)東西。但是他們又有一點(diǎn)點(diǎn)區(qū)別。我們以linuxthreads線程庫(kù)為例。了解一下線程是什么。我們知道fork可以新建一個(gè)進(jìn)程。但是這個(gè)進(jìn)程太重了,盡管有些屬性是可以共享的。所以操作系統(tǒng)重新實(shí)現(xiàn)了一個(gè)系統(tǒng)調(diào)用clone。他支持更細(xì)粒度的屬性共享。所以我們稱(chēng)線程是輕量級(jí)的進(jìn)程。顧名思義,線程也是進(jìn)程,但是他是輕量級(jí)的,因?yàn)樗芏鄬傩远际枪蚕碛诟高M(jìn)程(父線程)的。共享的屬性可以通過(guò)clone函數(shù)的參數(shù)來(lái)控制。當(dāng)我們新建一個(gè)線程的時(shí)候,系統(tǒng)里會(huì)新建一個(gè)進(jìn)程。clone函數(shù)會(huì)把棧的位置和代碼執(zhí)行的位置(就是我們傳進(jìn)去的函數(shù))告訴系統(tǒng)。系統(tǒng)會(huì)從我們定義的函數(shù)開(kāi)始執(zhí)行。大概如下。

怎么理解web進(jìn)程和線程  

到此,相信大家對(duì)“怎么理解web進(jìn)程和線程”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

web
AI