日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程、线程简介

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程、线程简介 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下內(nèi)容源于網(wǎng)絡(luò)資源的學(xué)習(xí)整理,如有侵權(quán),請告知?jiǎng)h除。

參考博客

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html(通俗理解)

https://blog.csdn.net/chen_geng/article/details/51613445(表格總結(jié),推薦)

https://blog.csdn.net/java_zero2one/article/details/51477791(并發(fā)和并行)

https://www.cnblogs.com/reality-soul/p/6397021.html(單進(jìn)程和多進(jìn)程的代碼示例)

https://blog.csdn.net/zqixiao_09/article/details/50298693

https://blog.csdn.net/linux0231/article/details/24523129

https://blog.csdn.net/earbao/article/details/53106419

之前關(guān)于進(jìn)程的學(xué)習(xí)要點(diǎn)總結(jié):https://pan.baidu.com/s/1dktsSp2D8YIinhD2DUdUYQ

?

?

一、并發(fā)、并行

(1)并發(fā):是指一個(gè)處理器同時(shí)處理多個(gè)任務(wù),是邏輯上的同時(shí)發(fā)生(即假象)。

  • 程序假裝同時(shí)執(zhí)行多個(gè)操作(每個(gè)小時(shí)間片執(zhí)行一個(gè)操作,多個(gè)操作快速切換執(zhí)行)。

(2)并行:是指多個(gè)處理器(或者多核處理器)同時(shí)處理多個(gè)不同的任務(wù),是物理上的同時(shí)發(fā)生。

(3)比喻:并發(fā)是一個(gè)人同時(shí)吃三個(gè)饅頭,而并行是三個(gè)人同時(shí)吃三個(gè)饅頭。

(4)

當(dāng)有多個(gè)線程在操作時(shí),如果系統(tǒng)只有一個(gè)CPU,則它根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程,它只能把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間段分配給各個(gè)線程執(zhí)行,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其它線程處于掛起狀態(tài)。這種方式我們稱之為并發(fā)(Concurrent)。

當(dāng)系統(tǒng)有一個(gè)以上CPU時(shí),則線程的操作有可能非并發(fā)。當(dāng)一個(gè)CPU執(zhí)行一個(gè)線程時(shí),另一個(gè)CPU可以執(zhí)行另一個(gè)線程,兩個(gè)線程互不搶占CPU資源,可以同時(shí)進(jìn)行,這種方式我們稱之為并行(Parallel)。

?

二、對比進(jìn)程與線程

?進(jìn)程,process線程,thread
定義資源(CPU時(shí)間、內(nèi)存等)分配的最小單位程序執(zhí)行的最小調(diào)度單位
區(qū)別

1、獨(dú)立的地址空間。每創(chuàng)建一個(gè)進(jìn)程,就會(huì)給該進(jìn)程分配一個(gè)4G的虛擬內(nèi)存空間。

2、進(jìn)程是建立在虛擬內(nèi)存的基礎(chǔ)之上的。

1、沒有獨(dú)立的地址空間(同一進(jìn)程內(nèi)的線程共享進(jìn)程的地址空間)。

2、主要是為了將進(jìn)程的資源申請和調(diào)度屬性分開。

聯(lián)系

1、一個(gè)進(jìn)程有幾個(gè)線程組成。

2、同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。

3、一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉。

4、線程與同屬一個(gè)進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源。

OS而言

1、uCOS只有線程的概念。uCOS的整個(gè)程序可以理解為一個(gè)進(jìn)程,而其中的任務(wù)(一個(gè)個(gè)函數(shù))就可以理解為一個(gè)個(gè)線程,有自己的堆棧和局部變量,但沒有單獨(dú)的地址空間。

2、對于windows,linux等,其有進(jìn)程和線程。

線程的優(yōu)勢

一、優(yōu)勢

1、與進(jìn)程相比,它是一種非常"節(jié)儉"的多任務(wù)操作方式。

(1)對進(jìn)程而言,創(chuàng)建一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種"昂貴"的多任務(wù)工作方式。

(2)對一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間,而且線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間。

?

2、與進(jìn)程相比,線程間的通信機(jī)制更方便。

(1)對不同進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí),而且很不方便。

(2)對一個(gè)進(jìn)程中的多個(gè)線程,由于它們共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。

?

3、提高應(yīng)用程序響應(yīng)。

  • 使用多線程技術(shù),將耗時(shí)長的操作(time consuming)置于一個(gè)新的線程。

4、使多CPU系統(tǒng)更加有效。

  • 操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行于不同的CPU。

5、改善程序結(jié)構(gòu)。

  • 一個(gè)既長又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會(huì)利于理解和修改。

二、線程可以有效地提高系統(tǒng)的執(zhí)行效率,但并不是在所有計(jì)算機(jī)系統(tǒng)中都是適用的,如某些很少做進(jìn)程調(diào)度和切換的實(shí)時(shí)系統(tǒng)。使用線程的好處是有多個(gè)任務(wù)需要處理 機(jī)處理時(shí),減少處理機(jī)的切換時(shí)間;而且,線程的創(chuàng)建和結(jié)束所需要的系統(tǒng)開銷也比進(jìn)程的創(chuàng)建和結(jié)束要小得多。最適用使用線程的系統(tǒng)是多處理機(jī)系統(tǒng)和網(wǎng)絡(luò)系統(tǒng)或分布式系統(tǒng)。

區(qū)分進(jìn)程、用戶線程、內(nèi)核線程

uCOS/Linux狀態(tài)區(qū)別

線程只有 3 個(gè)基本狀態(tài):就緒,執(zhí)行,阻塞。

線程存在 5 種基本操作來切換線程的狀態(tài):派生,阻塞,激活,調(diào)度,結(jié)束。

?

進(jìn)程至少有 5 種基本狀態(tài):

初始態(tài),執(zhí)行態(tài),等待狀態(tài),就緒狀態(tài),終止?fàn)顟B(tài)。

?

三、進(jìn)程、線程的補(bǔ)充說明

(1)線程理解

線程,在網(wǎng)絡(luò)或多用戶環(huán)境下,一個(gè)服務(wù)器通常需要接收大量且不確定數(shù)量用戶的并發(fā)請求,為每一個(gè)請求都創(chuàng)建一個(gè)進(jìn)程顯然是行不通的——無論是從系統(tǒng)資源開銷方面或是響應(yīng)用戶請求的效率方面來看。因此,操作系統(tǒng)中線程的概念便被引進(jìn)了。線程是進(jìn)程的一部分,一個(gè)沒有線程的進(jìn)程可以被看作是單線程的。線程有時(shí)又被稱為輕權(quán)進(jìn)程或輕量級(jí)進(jìn)程,是?CPU 調(diào)度的一個(gè)基本單位。

(2)線程和進(jìn)程大致的區(qū)別

進(jìn)程的執(zhí)行過程是線狀的,盡管中間會(huì)發(fā)生中斷或暫停,但該進(jìn)程所擁有的資源只為該線狀執(zhí)行過程服務(wù)。一旦發(fā)生進(jìn)程上下文切換,這些資源都是要被保護(hù)起來的。這是進(jìn)程宏觀上的執(zhí)行過程。

進(jìn)程又可有單線程進(jìn)程與多線程進(jìn)程兩種。單線程進(jìn)程的執(zhí)行過程在宏觀上是線性的,微觀上也只有單一的執(zhí)行過程;而多線程進(jìn)程在宏觀上的執(zhí)行過程同樣為線性的,但微觀上卻可以有多個(gè)執(zhí)行操作(線程),如不同代碼片段以及相關(guān)的數(shù)據(jù)結(jié)構(gòu)集。線程的改變只代表了 CPU 執(zhí)行過程的改變,而沒有發(fā)生進(jìn)程所擁有的資源變化。除CPU 之外,計(jì)算機(jī)內(nèi)的軟硬件資源的分配與線程無關(guān),線程只能共享它所屬進(jìn)程的資源。

我們知道,進(jìn)程有一個(gè)進(jìn)程控制塊 PCB、相關(guān)程序段、(該程序段對其進(jìn)行操作的)數(shù)據(jù)結(jié)構(gòu)集。與進(jìn)程控制表和 PCB 相似,每個(gè)線程也有自己的線程控制表 TCB ,而這個(gè)TCB 中所保存的線程狀態(tài)信息則要比 PCB 表少得多,這些信息主要是相關(guān)指針用堆棧(系統(tǒng)棧和用戶棧),寄存器中的狀態(tài)數(shù)據(jù)。

進(jìn)程擁有一個(gè)完整的虛擬地址空間,不依賴于線程而獨(dú)立存在;反之,線程是進(jìn)程的一部分,沒有自己的地址空間,與進(jìn)程內(nèi)的其他線程一起共享分配給該進(jìn)程的所有資源

線程可以有效地提高系統(tǒng)的執(zhí)行效率,但并不是在所有計(jì)算機(jī)系統(tǒng)中都是適用的,如某些很少做進(jìn)程調(diào)度和切換的實(shí)時(shí)系統(tǒng)。使用線程的好處是有多個(gè)任務(wù)需要處理 機(jī)處理時(shí),減少處理機(jī)的切換時(shí)間;而且,線程的創(chuàng)建和結(jié)束所需要的系統(tǒng)開銷也比進(jìn)程的創(chuàng)建和結(jié)束要小得多。最適用使用線程的系統(tǒng)是多處理機(jī)系統(tǒng)和網(wǎng)絡(luò)系統(tǒng) 或分布式系統(tǒng)。

線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。?

?從邏輯角度來看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。

(3)摘取自http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html的評論區(qū)

?

四、多進(jìn)程的代碼示例

#include <unistd.h> #include <sys/types.h> #include <stdio.h> void print_exit() { printf("the exit pid:%d/n",getpid() ); } main () { pid_t pid; atexit( print_exit ); //注冊該進(jìn)程退出時(shí)的回調(diào)函數(shù) pid=fork(); if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("i am the child process, my process id is %d/n",getpid()); else { printf("i am the parent process, my process id is %d/n",getpid()); sleep(2); wait(); } }

運(yùn)行結(jié)果:

i am the child process, my process id is 15806
the exit pid:15806
i am the parent process, my process id is 15805
the exit pid:15805

說明:

(1)fork函數(shù),功能是產(chǎn)生子進(jìn)程。fork失敗返回-1,成功返回0。

fork產(chǎn)生子進(jìn)程的體現(xiàn),就是它會(huì)返回2次:

一次返回0,順序執(zhí)行下面的代碼。這是子進(jìn)程。

一次返回子進(jìn)程的pid,也順序執(zhí)行下面的代碼,這是父進(jìn)程。

(2)wait表明父進(jìn)程等待子進(jìn)程的終結(jié)后,處理其task_struct結(jié)構(gòu),否則會(huì)產(chǎn)生僵尸進(jìn)程。

(3)atexit( print_exit );?需要的參數(shù)是函數(shù)的調(diào)用地址。

?

五、多線程的代碼示例

?

?

總結(jié)

以上是生活随笔為你收集整理的进程、线程简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。