程序 進(jìn)程 線程 協(xié)成,你們真的了解嗎?

一.進(jìn)程:

程序并不能單獨(dú)運(yùn)行,只有將程序裝載到內(nèi)存中,系統(tǒng)為它分配資源才能運(yùn)行,而這種執(zhí)行的程序就稱之為進(jìn)程。

程序和進(jìn)程的區(qū)別就在于:程序是指令的集合,它是進(jìn)程運(yùn)行的靜態(tài)描述文本;進(jìn)程是程序的一次執(zhí)行活動(dòng),屬于動(dòng)態(tài)概念。

在多種編程中,我們?cè)试S多個(gè)同時(shí)加載到內(nèi)存中,在操作系統(tǒng)的調(diào)度下,可以實(shí)現(xiàn)并發(fā)地執(zhí)行。這是這樣的設(shè)計(jì),大大提高了CPU的利用率。進(jìn)程的出現(xiàn)讓每個(gè)用戶感覺到自己獨(dú)享CPU,因此,進(jìn)程就是為了在CPU上實(shí)現(xiàn)多道編程而提出的

有了進(jìn)程為什么還要線程?

進(jìn)程有很多優(yōu)點(diǎn),它提供了多種編程,讓我們感覺我們每個(gè)人都擁有自己的CPU和其他資源,可以提高計(jì)算機(jī)的利用率。很多人就不理解了,既然進(jìn)程這么優(yōu)秀,為什么還要線程呢?其實(shí),仔細(xì)觀察就會(huì)發(fā)現(xiàn)進(jìn)程還是有很多缺陷的,主要體現(xiàn)在兩點(diǎn)上:

1.進(jìn)程只能在一個(gè)時(shí)間干一件事,如果想同時(shí)干兩件事或多件事,進(jìn)程就無能為力了。

2.進(jìn)程在執(zhí)行的過程中如果阻塞,例如等待輸入,整個(gè)進(jìn)程就會(huì)掛起,即使進(jìn)程中有些工作不依賴于輸入的數(shù)據(jù),也將無法執(zhí)行。

例如,我們?cè)谑褂胵q聊天, qq做為一個(gè)獨(dú)立進(jìn)程如果同一時(shí)間只能干一件事,那他如何實(shí)現(xiàn)在同一時(shí)刻 即能監(jiān)聽鍵盤輸入、又能監(jiān)聽其它人給你發(fā)的消息、同時(shí)還能把別人發(fā)的消息顯示在屏幕上呢?你會(huì)說,操作系統(tǒng)不是有分時(shí)么?但分時(shí)是指在不同進(jìn)程間的分時(shí)呀, 即操作系統(tǒng)處理一會(huì)你的qq任務(wù),又切換到word文檔任務(wù)上了,每個(gè)cpu時(shí)間片分給你的qq程序時(shí),你的qq還是只能同時(shí)干一件事呀。

再直白一點(diǎn), 一個(gè)操作系統(tǒng)就像是一個(gè)工廠,工廠里面有很多個(gè)生產(chǎn)車間,不同的車間生產(chǎn)不同的產(chǎn)品,每個(gè)車間就相當(dāng)于一個(gè)進(jìn)程,且你的工廠又窮,供電不足,同一時(shí)間只能給一個(gè)車間供電,為了能讓所有車間都能同時(shí)生產(chǎn),你的工廠的電工只能給不同的車間分時(shí)供電,但是輪到你的qq車間時(shí),發(fā)現(xiàn)只有一個(gè)干活的工人,結(jié)果生產(chǎn)效率極低,為了解決這個(gè)問題,應(yīng)該怎么辦呢?。。。。沒錯(cuò),你肯定想到了,就是多加幾個(gè)工人,讓幾個(gè)人工人并行工作,這每個(gè)工人,就是線程!

二.線程:

線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)

三.進(jìn)程和線程的區(qū)別:

1.線程共享創(chuàng)建它的進(jìn)程的地址空間;進(jìn)程擁有它們自己的地址空間。

2.線程可以直接訪問其進(jìn)程的數(shù)據(jù)段;進(jìn)程具有父進(jìn)程的數(shù)據(jù)段的自身副本。

3.線程可以直接與其進(jìn)程的其他線程通信;進(jìn)程必須使用進(jìn)程間通信來與兄弟進(jìn)程通信。

5.新線程容易創(chuàng)建;新進(jìn)程需要復(fù)制父進(jìn)程。

6.線程可以對(duì)同一進(jìn)程的線程執(zhí)行相當(dāng)大的控制;進(jìn)程只能對(duì)子進(jìn)程執(zhí)行控制。對(duì)主線程的更改(取消、優(yōu)先級(jí)更改等)可能會(huì)影響進(jìn)程的其他線程的行為;對(duì)父進(jìn)程的更改不影響子進(jìn)程。

四.生產(chǎn)者消費(fèi)者模型

在并發(fā)編程中使用生產(chǎn)者和消費(fèi)者模式能夠解決絕大多數(shù)并發(fā)問題。該模式通過平衡生產(chǎn)線程和消費(fèi)線程的工作能力來提高程序的整體處理數(shù)據(jù)的速度。

為什么要使用生產(chǎn)者和消費(fèi)者模式

在線程世界里,生產(chǎn)者就是生產(chǎn)數(shù)據(jù)的線程,消費(fèi)者就是消費(fèi)數(shù)據(jù)的線程。在多線程開發(fā)當(dāng)中,如果生產(chǎn)者處理速度很快,而消費(fèi)者處理速度很慢,那么生產(chǎn)者就必須等待消費(fèi)者處理完,才能繼續(xù)生產(chǎn)數(shù)據(jù)。同樣的道理,如果消費(fèi)者的處理能力大于生產(chǎn)者,那么消費(fèi)者就必須等待生產(chǎn)者。為了解決這個(gè)問題于是引入了生產(chǎn)者和消費(fèi)者模式。

什么是生產(chǎn)者消費(fèi)者模式

生產(chǎn)者消費(fèi)者模式是通過一個(gè)容器來解決生產(chǎn)者和消費(fèi)者的強(qiáng)耦合問題。生產(chǎn)者和消費(fèi)者彼此之間不直接通訊,而通過阻塞隊(duì)列來進(jìn)行通訊,所以生產(chǎn)者生產(chǎn)完數(shù)據(jù)之后不用等待消費(fèi)者處理,直接扔給阻塞隊(duì)列,消費(fèi)者不找生產(chǎn)者要數(shù)據(jù),而是直接從阻塞隊(duì)列里取,阻塞隊(duì)列就相當(dāng)于一個(gè)緩沖區(qū),平衡了生產(chǎn)者和消費(fèi)者的處理能力。

五.協(xié)成:

1.協(xié)程,又稱微線程,纖程。英文名Coroutine。一句話說明什么是協(xié)程:協(xié)程是一種用戶態(tài)的輕量級(jí)線程。

2.協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度切換時(shí),將寄存器上下文和棧保存到其他地方,在切回來的時(shí)候,恢復(fù)先前保存的寄存器上下文和棧。因此:

協(xié)程能保留上一次調(diào)用時(shí)的狀態(tài)(即所有局部狀態(tài)的一個(gè)特定組合),每次過程重入時(shí),就相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài),換種說法:進(jìn)入上一次離開時(shí)所處邏輯流的位


3.協(xié)程的好處:

無需線程上下文切換的開銷

無需原子操作鎖定及同步的開銷

4."原子操作(atomic operation)是不需要synchronized",所謂原子操作是指不會(huì)被線程調(diào)度機(jī)制打斷的操作;這種操作一旦開始,就一直運(yùn)行到結(jié)束,中間不會(huì)有任何 context switch (切換到另一個(gè)線程)。原子操作可以是一個(gè)步驟,也可以是多個(gè)操作步驟,但是其順序是不可以被打亂,或者切割掉只執(zhí)行部分。視作整體是原子性的核心。

方便切換控制流,簡(jiǎn)化編程模型

高并發(fā)+高擴(kuò)展性+低成本:一個(gè)CPU支持上萬(wàn)的協(xié)程都不是問題。所以很適合用于高并發(fā)處理。

5.缺點(diǎn):

1.無法利用多核資源:協(xié)程的本質(zhì)是個(gè)單線程,它不能同時(shí)將單個(gè)CPU 的多個(gè)核用上,協(xié)程需要和進(jìn)程配合才能運(yùn)行在多CPU上.當(dāng)然我們?nèi)粘K帉懙慕^大部分應(yīng)用都沒有這個(gè)必要,除非是cpu密集型應(yīng)用。

2.進(jìn)行阻塞(Blocking)操作(如IO時(shí))會(huì)阻塞掉整個(gè)程序

摘錄:https://www.cnblogs.com/richardzgt/articles/7761172.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文鏈接:https://github.com/EasyKotlin 在常用的并發(fā)模型中,多進(jìn)程、多線程、分布式是...
    JackChen1024閱讀 10,891評(píng)論 3 23
  • 輕量級(jí)線程:協(xié)程 在常用的并發(fā)模型中,多進(jìn)程、多線程、分布式是最普遍的,不過近些年來逐漸有一些語(yǔ)言以first-c...
    Tenderness4閱讀 6,496評(píng)論 2 10
  • 一、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個(gè)執(zhí)行中的程序?qū)嵗?,每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個(gè)進(jìn)程中可以有多個(gè)線程。...
    阿敏其人閱讀 2,705評(píng)論 0 13
  • 很多年來,春節(jié)假期前的最后幾個(gè)工作日,我都流連在辦公室,象一個(gè)餐廳老板遲遲不愿意打烊,收拾著一些零碎的物件,等到同...
    植樹菌閱讀 858評(píng)論 0 1
  • 頭狼不容易,請(qǐng)尊重您的老大?。?! 當(dāng)你自認(rèn)為辛苦、艱難和甚至委屈時(shí),請(qǐng)看看前面為你開路的那位,當(dāng)你的老大在為你冒險(xiǎn)...
    投資修行之路閱讀 1,053評(píng)論 0 0

友情鏈接更多精彩內(nèi)容