一.進程:
程序并不能單獨運行退个,只有將程序裝載到內(nèi)存中,系統(tǒng)為它分配資源才能運行调炬,而這種執(zhí)行的程序就稱之為進程语盈。
程序和進程的區(qū)別就在于:程序是指令的集合,它是進程運行的靜態(tài)描述文本缰泡;進程是程序的一次執(zhí)行活動刀荒,屬于動態(tài)概念。
在多種編程中棘钞,我們允許多個同時加載到內(nèi)存中缠借,在操作系統(tǒng)的調(diào)度下,可以實現(xiàn)并發(fā)地執(zhí)行宜猜。這是這樣的設(shè)計泼返,大大提高了CPU的利用率。進程的出現(xiàn)讓每個用戶感覺到自己獨享CPU姨拥,因此绅喉,進程就是為了在CPU上實現(xiàn)多道編程而提出的
有了進程為什么還要線程?
進程有很多優(yōu)點垫毙,它提供了多種編程霹疫,讓我們感覺我們每個人都擁有自己的CPU和其他資源,可以提高計算機的利用率综芥。很多人就不理解了丽蝎,既然進程這么優(yōu)秀,為什么還要線程呢膀藐?其實屠阻,仔細觀察就會發(fā)現(xiàn)進程還是有很多缺陷的,主要體現(xiàn)在兩點上:
1.進程只能在一個時間干一件事额各,如果想同時干兩件事或多件事国觉,進程就無能為力了。
2.進程在執(zhí)行的過程中如果阻塞,例如等待輸入,整個進程就會掛起,即使進程中有些工作不依賴于輸入的數(shù)據(jù),也將無法執(zhí)行虾啦。
例如麻诀,我們在使用qq聊天痕寓, qq做為一個獨立進程如果同一時間只能干一件事,那他如何實現(xiàn)在同一時刻 即能監(jiān)聽鍵盤輸入蝇闭、又能監(jiān)聽其它人給你發(fā)的消息呻率、同時還能把別人發(fā)的消息顯示在屏幕上呢?你會說呻引,操作系統(tǒng)不是有分時么礼仗?但分時是指在不同進程間的分時呀, 即操作系統(tǒng)處理一會你的qq任務(wù)逻悠,又切換到word文檔任務(wù)上了元践,每個cpu時間片分給你的qq程序時,你的qq還是只能同時干一件事呀童谒。
再直白一點单旁, 一個操作系統(tǒng)就像是一個工廠,工廠里面有很多個生產(chǎn)車間惠啄,不同的車間生產(chǎn)不同的產(chǎn)品慎恒,每個車間就相當(dāng)于一個進程任内,且你的工廠又窮撵渡,供電不足,同一時間只能給一個車間供電死嗦,為了能讓所有車間都能同時生產(chǎn)趋距,你的工廠的電工只能給不同的車間分時供電,但是輪到你的qq車間時越除,發(fā)現(xiàn)只有一個干活的工人节腐,結(jié)果生產(chǎn)效率極低,為了解決這個問題摘盆,應(yīng)該怎么辦呢翼雀?。孩擂。狼渊。。沒錯类垦,你肯定想到了狈邑,就是多加幾個工人,讓幾個人工人并行工作蚤认,這每個工人米苹,就是線程!
二.線程:
線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位砰琢。它被包含在進程之中蘸嘶,是進程中的實際運作單位良瞧。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程训唱,每條線程并行執(zhí)行不同的任務(wù)
三.進程和線程的區(qū)別:
1.線程共享創(chuàng)建它的進程的地址空間莺褒;進程擁有它們自己的地址空間。
2.線程可以直接訪問其進程的數(shù)據(jù)段雪情;進程具有父進程的數(shù)據(jù)段的自身副本遵岩。
3.線程可以直接與其進程的其他線程通信;進程必須使用進程間通信來與兄弟進程通信巡通。
5.新線程容易創(chuàng)建尘执;新進程需要復(fù)制父進程。
6.線程可以對同一進程的線程執(zhí)行相當(dāng)大的控制宴凉;進程只能對子進程執(zhí)行控制誊锭。對主線程的更改(取消、優(yōu)先級更改等)可能會影響進程的其他線程的行為弥锄;對父進程的更改不影響子進程丧靡。
四.生產(chǎn)者消費者模型
在并發(fā)編程中使用生產(chǎn)者和消費者模式能夠解決絕大多數(shù)并發(fā)問題。該模式通過平衡生產(chǎn)線程和消費線程的工作能力來提高程序的整體處理數(shù)據(jù)的速度籽暇。
為什么要使用生產(chǎn)者和消費者模式
在線程世界里温治,生產(chǎn)者就是生產(chǎn)數(shù)據(jù)的線程,消費者就是消費數(shù)據(jù)的線程戒悠。在多線程開發(fā)當(dāng)中熬荆,如果生產(chǎn)者處理速度很快,而消費者處理速度很慢绸狐,那么生產(chǎn)者就必須等待消費者處理完卤恳,才能繼續(xù)生產(chǎn)數(shù)據(jù)。同樣的道理寒矿,如果消費者的處理能力大于生產(chǎn)者突琳,那么消費者就必須等待生產(chǎn)者。為了解決這個問題于是引入了生產(chǎn)者和消費者模式符相。
什么是生產(chǎn)者消費者模式
生產(chǎn)者消費者模式是通過一個容器來解決生產(chǎn)者和消費者的強耦合問題拆融。生產(chǎn)者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊主巍,所以生產(chǎn)者生產(chǎn)完數(shù)據(jù)之后不用等待消費者處理冠息,直接扔給阻塞隊列,消費者不找生產(chǎn)者要數(shù)據(jù)孕索,而是直接從阻塞隊列里取逛艰,阻塞隊列就相當(dāng)于一個緩沖區(qū),平衡了生產(chǎn)者和消費者的處理能力搞旭。
五.協(xié)成:
1.協(xié)程散怖,又稱微線程菇绵,纖程。英文名Coroutine镇眷。一句話說明什么是協(xié)程:協(xié)程是一種用戶態(tài)的輕量級線程咬最。
2.協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度切換時欠动,將寄存器上下文和棧保存到其他地方永乌,在切回來的時候,恢復(fù)先前保存的寄存器上下文和棧具伍。因此:
協(xié)程能保留上一次調(diào)用時的狀態(tài)(即所有局部狀態(tài)的一個特定組合)翅雏,每次過程重入時,就相當(dāng)于進入上一次調(diào)用的狀態(tài)人芽,換種說法:進入上一次離開時所處邏輯流的位
3.協(xié)程的好處:
無需線程上下文切換的開銷
無需原子操作鎖定及同步的開銷
4."原子操作(atomic operation)是不需要synchronized"望几,所謂原子操作是指不會被線程調(diào)度機制打斷的操作;這種操作一旦開始萤厅,就一直運行到結(jié)束橄抹,中間不會有任何 context switch (切換到另一個線程)。原子操作可以是一個步驟惕味,也可以是多個操作步驟楼誓,但是其順序是不可以被打亂,或者切割掉只執(zhí)行部分赦拘。視作整體是原子性的核心慌随。
方便切換控制流,簡化編程模型
高并發(fā)+高擴展性+低成本:一個CPU支持上萬的協(xié)程都不是問題躺同。所以很適合用于高并發(fā)處理。
5.缺點:
1.無法利用多核資源:協(xié)程的本質(zhì)是個單線程,它不能同時將單個CPU 的多個核用上,協(xié)程需要和進程配合才能運行在多CPU上.當(dāng)然我們?nèi)粘K帉懙慕^大部分應(yīng)用都沒有這個必要丸逸,除非是cpu密集型應(yīng)用蹋艺。
2.進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序
摘錄:https://www.cnblogs.com/richardzgt/articles/7761172.html