一.進(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