本篇內(nèi)容主要講解“線程和進(jìn)程有哪些關(guān)系”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“線程和進(jìn)程有哪些關(guān)系”吧!
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、陸川ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的陸川網(wǎng)站制作公司
關(guān)系:1、一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程;而一個(gè)線程只能在一個(gè)進(jìn)程的地址空間內(nèi)活動(dòng)。2、資源分配給進(jìn)程,同一個(gè)進(jìn)程的所有線程共享該進(jìn)程所有資源。3、CPU分配給線程,即真正在處理器運(yùn)行的是線程。4、線程在執(zhí)行過(guò)程中需要協(xié)作同步,不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步。
進(jìn)程是資源分配的基本單位,線程是CPU調(diào)度和分派的基本單位
線程是進(jìn)程的一部分,一個(gè)線程只能屬于一個(gè)進(jìn)程,一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程
每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序間的切換開(kāi)銷大,線程可看做輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程間切換開(kāi)銷小
在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)進(jìn)程(程序),在同一個(gè)進(jìn)程(程序)中多個(gè)線程同時(shí)執(zhí)行(通過(guò)CPU調(diào)度,在每個(gè)時(shí)間片中只有一個(gè)線程執(zhí)行)
系統(tǒng)在運(yùn)行的時(shí)候會(huì)為每個(gè)進(jìn)程分配不同的內(nèi)存空間,線程除了CPU外,系統(tǒng)不會(huì)為線程分配內(nèi)存(線程所使用的資源來(lái)自其所屬進(jìn)程的資源),線程組之間只能共享資源
沒(méi)有現(xiàn)成的進(jìn)程可以看做單線程的,如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的,維斯多條線(線程)共同完成
線程是進(jìn)程的一部分,故線程被稱為輕權(quán)進(jìn)程/輕量級(jí)進(jìn)程
進(jìn)程與線程的關(guān)系
1、一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程;而一個(gè)線程只能在一個(gè)進(jìn)程的地址空間內(nèi)活動(dòng)。
2、資源分配給進(jìn)程,同一個(gè)進(jìn)程的所有線程共享該進(jìn)程所有資源。
3、CPU分配給線程,即真正在處理器運(yùn)行的是線程。
4、線程在執(zhí)行過(guò)程中需要協(xié)作同步,不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步。
進(jìn)程之間哪些可以共享?
線程共享的環(huán)境包括:進(jìn)程代碼段、進(jìn)程的公有數(shù)據(jù)(利用這些共享的數(shù)據(jù),線程很容易的實(shí)現(xiàn)相互之間的通訊)、進(jìn)程打開(kāi)的文件描述符、信號(hào)的處理器、進(jìn)程的當(dāng)前目錄和進(jìn)程用戶ID與進(jìn)程組ID。
進(jìn)程擁有這許多共性的同時(shí),還擁有自己的個(gè)性。有了這些個(gè)性,線程才能實(shí)現(xiàn)并發(fā)性。這些個(gè)性包括:
1.線程ID
每個(gè)線程都有自己的線程ID,這個(gè)ID在本進(jìn)程中是唯一的。進(jìn)程用此來(lái)標(biāo)識(shí)線程。
2.寄存器組的值
由于線程間是并發(fā)運(yùn)行的,每個(gè)線程有自己不同的運(yùn)行線索,當(dāng)從一個(gè)線程切換到另一個(gè)線程上時(shí),必須將原有的線程的寄存器集合的狀態(tài)保存,以便將來(lái)該線程在被重新切換到時(shí)能得以恢復(fù)。
3.線程的堆棧
堆棧是保證線程獨(dú)立運(yùn)行所必須的。
線程函數(shù)可以調(diào)用函數(shù),而被調(diào)用函數(shù)中又是可以層層嵌套的,所以線程必須擁有自己的函數(shù)堆棧,使得函數(shù)調(diào)用可以正常執(zhí)行,不受其他線程的影響。
4.錯(cuò)誤返回碼
由于同一個(gè)進(jìn)程中有很多個(gè)線程在同時(shí)運(yùn)行,可能某個(gè)線程進(jìn)行系統(tǒng)調(diào)用后設(shè)置了errno值,而在該線程還沒(méi)有處理這個(gè)錯(cuò)誤,另外一個(gè)線程就在此時(shí)被調(diào)度器投入運(yùn)行,這樣錯(cuò)誤值就有可能被修改。
所以,不同的線程應(yīng)該擁有自己的錯(cuò)誤返回碼變量。
5.線程的信號(hào)屏蔽碼
由于每個(gè)線程所感興趣的信號(hào)不同,所以線程的信號(hào)屏蔽碼應(yīng)該由線程自己管理。但所有的線程都共享同樣的信號(hào)處理器。
6.線程的優(yōu)先級(jí)
由于線程需要像進(jìn)程那樣能夠被調(diào)度,那么就必須要有可供調(diào)度使用的參數(shù),這個(gè)參數(shù)就是線程的優(yōu)先級(jí)。
進(jìn)程間通信的五種方式
1.(無(wú)名)管道
半雙工,即不能同時(shí)在兩個(gè)方向上傳輸數(shù)據(jù)。有的系統(tǒng)可能支持全雙工。
只能在父子進(jìn)程間。經(jīng)典的形式就是管道由父進(jìn)程創(chuàng)建,進(jìn)程fork子進(jìn)程之后,就可以在父子進(jìn)程之間使用了。
2.命名管道(FIFO)
不相關(guān)的進(jìn)程也能夠進(jìn)行數(shù)據(jù)交換。
3.消息隊(duì)列
消息隊(duì)列,就是一個(gè)消息的鏈表,是一系列保存在內(nèi)核中消息的列表。用戶進(jìn)程可以向消息隊(duì)列添加消息,也可以向消息隊(duì)列讀取消息。
消息隊(duì)列與管道通信相比,其優(yōu)勢(shì)是對(duì)每個(gè)消息指定特定的消息類型,接收的時(shí)候不需要按照隊(duì)列次序,而是可以根據(jù)自定義條件接收特定類型的消息。
可以把消息看做一個(gè)記錄,具有特定的格式以及特定的優(yōu)先級(jí)。對(duì)消息隊(duì)列有寫(xiě)權(quán)限的進(jìn)程可以向消息隊(duì)列中按照一定的規(guī)則添加新消息,對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程可以從消息隊(duì)列中讀取消息。
4.信號(hào)量
信號(hào)量是一個(gè)計(jì)數(shù)器,它主要用在多個(gè)進(jìn)程需要對(duì)共享數(shù)據(jù)進(jìn)行訪問(wèn)的時(shí)候??紤]這一的情況,不能同時(shí)有兩個(gè)進(jìn)程對(duì)同一數(shù)據(jù)進(jìn)行訪問(wèn),那么借助信號(hào)量就可以完成這樣的事情。
它的主要流程如下:
檢查控制該資源的信號(hào)量
如果信號(hào)量值大于0,則資源可用,并且將其減1,表示當(dāng)前已被使用
如果信號(hào)量值為0,則進(jìn)程休眠直至信號(hào)量值大于0
也就是說(shuō),它實(shí)際上是提供了一個(gè)不同進(jìn)程或者進(jìn)程的不同線程之間訪問(wèn)同步的手段。
5.共享內(nèi)存
共享內(nèi)存允許兩個(gè)或多個(gè)進(jìn)程共享一個(gè)給定的存儲(chǔ)區(qū),這一段存儲(chǔ)區(qū)可以被兩個(gè)或兩個(gè)以上的進(jìn)程映射至自身的地址空間中,一個(gè)進(jìn)程寫(xiě)入共享內(nèi)存的信息,可以被其他使用這個(gè)共享內(nèi)存的進(jìn)程,通過(guò)一個(gè)簡(jiǎn)單的內(nèi)存讀取錯(cuò)做讀出,從而實(shí)現(xiàn)了進(jìn)程間的通信。
采用共享內(nèi)存進(jìn)行通信的一個(gè)主要好處是效率高,因?yàn)檫M(jìn)程可以直接讀寫(xiě)內(nèi)存,而不需要任何數(shù)據(jù)的拷貝,對(duì)于像管道和消息隊(duì)里等通信方式,則需要再內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次:一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存到輸出文件。
一般而言,進(jìn)程之間在共享內(nèi)存時(shí),并不總是讀寫(xiě)少量數(shù)據(jù)后就解除映射,有新的通信時(shí)在重新建立共享內(nèi)存區(qū)域;而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒(méi)有寫(xiě)回文件。共享內(nèi)存中的內(nèi)容往往是在解除映射時(shí)才寫(xiě)回文件,因此,采用共享內(nèi)存的通信方式效率非常高。
6.套接字Socket:
套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同計(jì)算機(jī)間的進(jìn)程通信。
7.信號(hào) ( sinal )
信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生
到此,相信大家對(duì)“線程和進(jìn)程有哪些關(guān)系”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!