成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java并發(fā)編程之背景知識(shí)

dendoink / 696人閱讀

摘要:其實(shí)現(xiàn)在打開一個(gè)程序的意思是打開一個(gè)進(jìn)程并且打開若干個(gè)于這個(gè)進(jìn)程相關(guān)聯(lián)的線程。

操作系統(tǒng)發(fā)展回顧 裸機(jī)

老早之前的計(jì)算機(jī)只有一個(gè)處理器,而一個(gè)處理器在同一時(shí)刻只能處理一條指令,換句話說,我們的代碼需要一行一行的按順序被計(jì)算機(jī)執(zhí)行,計(jì)算機(jī)只能把一個(gè)程序完整的執(zhí)行完,然后再執(zhí)行第二個(gè)程序。所以計(jì)算機(jī)專業(yè)的同學(xué)們要排隊(duì)去機(jī)房做實(shí)驗(yàn),一個(gè)人執(zhí)行完然他的程序后,第二個(gè)人再執(zhí)行自己的程序,這也就意味著所有計(jì)算機(jī)資源是被一個(gè)程序獨(dú)占的,計(jì)算機(jī)資源包括處理器、內(nèi)存、硬盤、輸入/輸出設(shè)備啥的。這樣的計(jì)算機(jī)系統(tǒng)我們稱之為裸機(jī)。

簡(jiǎn)單批處理系統(tǒng)

后來人們發(fā)現(xiàn)對(duì)于價(jià)格高昂的計(jì)算機(jī)設(shè)備來說,在換人的過程中就浪費(fèi)了好多時(shí)間,時(shí)間就是金錢,有這些時(shí)間可以多執(zhí)行好多程序了。所以有人寫了一個(gè)程序,把所有同學(xué)們需要做實(shí)驗(yàn)的程序都放在這個(gè)程序里排個(gè)隊(duì),由這個(gè)程序來協(xié)調(diào)各個(gè)同學(xué)們的程序執(zhí)行,一個(gè)執(zhí)行完了立即換成另一個(gè),這樣就不用人工干預(yù)了,所以他們把這樣的系統(tǒng)叫做簡(jiǎn)單批處理系統(tǒng),而那個(gè)負(fù)責(zé)協(xié)調(diào)各個(gè)童鞋們程序的程序,就是所謂的操作系統(tǒng)的雛形。

多道批處理系統(tǒng)

我們知道,處理器的速度是嗖嗖的,比內(nèi)存訪問的速度快好多個(gè)數(shù)量級(jí),而內(nèi)存又比硬盤、打印機(jī)等I/O設(shè)備啥的快好多個(gè)數(shù)量級(jí),而程序執(zhí)行過程中又免不了從硬盤里讀個(gè)文件,往打印機(jī)輸出個(gè)啥的,所以處理器浪費(fèi)了好多時(shí)間等待這些I/O操作的完成。再一次,時(shí)間就是金錢,為了盡可能的剝削計(jì)算機(jī)的運(yùn)算能力,在程序遇到I/O操作或者什么其他會(huì)阻塞程序執(zhí)行的操作時(shí),處理器會(huì)轉(zhuǎn)向執(zhí)行其它的程序,什么時(shí)候這個(gè)阻塞的操作完成了,再掉過頭繼續(xù)執(zhí)行它。從宏觀上看,處理器可以各個(gè)程序輪流執(zhí)行,所以這樣的系統(tǒng)就稱為多道批處理系統(tǒng)。

分時(shí)處理

有的同學(xué)對(duì)排隊(duì)執(zhí)行程序這個(gè)事兒很有意見,大家都是學(xué)生,憑啥先執(zhí)行你的后執(zhí)行我的,你要是寫了個(gè)while(true),那大家都得玩兒完~所以人們給每個(gè)程序都分配一點(diǎn)處理器時(shí)間去輪流執(zhí)行,每個(gè)程序分配到的執(zhí)行時(shí)間就叫做時(shí)間片,這個(gè)過程也叫做分時(shí)處理。又因?yàn)樘幚砥魉俣忍炝?,時(shí)間片的大小可以做到微秒毫秒的大小,所以這個(gè)切換的過程對(duì)于人來說根本感覺不出來,所以看起來像各個(gè)程序在同時(shí)執(zhí)行。不過后來人們?cè)谝慌_(tái)計(jì)算機(jī)上又裝了多個(gè)處理器,就是我們常聽說的4核、8核啥的,所以也可能真正的在同時(shí)執(zhí)行。

而時(shí)間片具體設(shè)置為多大,處理器怎么切換各個(gè)程序的執(zhí)行,這些工作就是所謂的操作系統(tǒng)來控制的。

進(jìn)程 進(jìn)程的概念和特點(diǎn)

我們自己寫的程序,也就是所謂的用戶程序是由操作系統(tǒng)來管理的,人們把一個(gè)執(zhí)行著的程序叫做一個(gè)進(jìn)程(英文名:Process),每個(gè)進(jìn)程都有這么兩個(gè)特點(diǎn):

1.資源所有權(quán)

程序在運(yùn)行過程中需要一定的資源,比如內(nèi)存、I/O啥的,這些東西不能在不同進(jìn)程間共享,假如一個(gè)進(jìn)程占了另一個(gè)進(jìn)程的內(nèi)存,那另一個(gè)進(jìn)程的數(shù)據(jù)不就丟失了么;一個(gè)進(jìn)程正在使用打印機(jī)輸出東西,另一個(gè)進(jìn)程也使用的話,不就尷尬了么。所以進(jìn)程所擁有的這些資源是不能共享的,而這種資源分配的活是由操作系統(tǒng)來管理的。

2.調(diào)度/執(zhí)行

操作系統(tǒng)會(huì)為它管理的進(jìn)程分配時(shí)間片,來調(diào)度哪個(gè)進(jìn)程應(yīng)該被處理器處理,哪個(gè)應(yīng)該先休息一會(huì)兒。

所以我們現(xiàn)在電腦里每個(gè)運(yùn)行著的程序都是一個(gè)進(jìn)程,可以打開你的任務(wù)管理器(windows)或者活動(dòng)監(jiān)視器(mac),看到我們的電腦里其實(shí)有好多好多進(jìn)程喔,什么QQ、微信、音樂播放器、視頻播放器啥的。

進(jìn)程的狀態(tài)

在操作系統(tǒng)級(jí)別上,進(jìn)程根據(jù)它運(yùn)行的情況,可以分成下邊5種狀態(tài):

1.新建

剛剛創(chuàng)建的那個(gè)時(shí)刻,操作系統(tǒng)會(huì)為這個(gè)進(jìn)程在內(nèi)存中創(chuàng)建相應(yīng)的數(shù)據(jù),比如分配這個(gè)進(jìn)程的ID,優(yōu)先級(jí)什么的~這個(gè)狀態(tài)持續(xù)的時(shí)間比較短。

2.就緒

一旦該進(jìn)程相關(guān)的一些數(shù)據(jù)創(chuàng)建好了,這個(gè)進(jìn)程就會(huì)被放在一個(gè)叫就緒隊(duì)列的隊(duì)列里,之后操作系統(tǒng)就會(huì)從這個(gè)隊(duì)列里挑一個(gè)進(jìn)程放到處理器里執(zhí)行。

3.運(yùn)行

這個(gè)進(jìn)程被操作系統(tǒng)分配了時(shí)間片,處理器開始執(zhí)行它。

4.阻塞

在執(zhí)行進(jìn)程的過程中,可能遇到某些阻塞的動(dòng)作,比如I/O操作,處理器如果一直等待該阻塞動(dòng)作完成的話就太浪費(fèi)時(shí)間了,所以會(huì)把等待阻塞動(dòng)作完成的進(jìn)程放到一個(gè)叫阻塞隊(duì)列的隊(duì)列里,之后并不會(huì)從這個(gè)隊(duì)列里挑選即將執(zhí)行的進(jìn)程,而是直到該阻塞動(dòng)作完成,才重新把該進(jìn)程放到就緒隊(duì)列里等待執(zhí)行。

5.退出

該進(jìn)程執(zhí)行完畢,或者遇到了什么錯(cuò)誤,或者操作系統(tǒng)就是想弄死它,它就被殺死了,這個(gè)狀態(tài)里操作系統(tǒng)可能還會(huì)記錄一下死因啥的,這個(gè)過程也很短。

這些狀態(tài)的具體轉(zhuǎn)換過程看下圖:

串行編程和并行編程

到目前為止,我們的編程模式都是串行編程,也就是處理器執(zhí)行完一條指令再執(zhí)行另一條。舉個(gè)例子啊,比如你媽給你布置了兩個(gè)任務(wù):一是去打瓶醬油,二是去燒一壺水,按照串行編程的方式就是兩個(gè)任務(wù)依次進(jìn)行,也就是說你先打醬油,然后回來再燒水。這么做沒啥問題,但是沒有效率啊,所以你也可以先把水燒上,然后去打醬油,回來正好水燒開了~這種多個(gè)任務(wù)同時(shí)進(jìn)行的編程方式就叫做并行編程。

回到計(jì)算機(jī)中來,串行編程的方式就是我們把所有要完成的任務(wù)放到一個(gè)進(jìn)程中去執(zhí)行,而并行編程的方式就是我們?nèi)ラ_幾個(gè)進(jìn)程同時(shí)執(zhí)行(注:這個(gè)同時(shí)可能是假的,如果只有單個(gè)處理器,那就是看上去是同時(shí)的)。這種并行編程的優(yōu)勢(shì)是顯而易見的:

1.充分利用多個(gè)處理器

現(xiàn)代計(jì)算機(jī)的處理器越來越多,不用白不用。如果所有的任務(wù)都塞到1個(gè)進(jìn)程中,而計(jì)算機(jī)實(shí)際有100個(gè)處理器,那么將會(huì)有99%的計(jì)算能力將被浪費(fèi)。

2.防止任務(wù)的阻塞

即使是在單個(gè)處理器中,為多個(gè)任務(wù)創(chuàng)建多個(gè)進(jìn)程也是有好處的。先執(zhí)行的任務(wù)可能會(huì)需要執(zhí)行某些I/O操作而造成阻塞,所以就需要等待I/O操作完成才能繼續(xù)執(zhí)行。但是如果為每個(gè)任務(wù)創(chuàng)建一個(gè)進(jìn)程之后,一個(gè)任務(wù)阻塞掉并不會(huì)影響別的任務(wù)的正常執(zhí)行。

3.簡(jiǎn)化編程的模型

把一個(gè)大任務(wù)拆分成若干個(gè)小任務(wù)自然是會(huì)事情清晰許多(注:也不是絕對(duì)啊),也就是所謂的大事化小,小事化了~所以把各個(gè)任務(wù)分配到不同進(jìn)程里去執(zhí)行在我們編程方面也會(huì)容易一些(注:不是絕對(duì)啊)。

線程 線程的概念

進(jìn)程是個(gè)好東西,可以給每個(gè)任務(wù)都分配一個(gè)進(jìn)程以達(dá)到并發(fā)執(zhí)行的目的??墒沁\(yùn)行了一段時(shí)間人們發(fā)現(xiàn)還是有一些不好的地方的:

1.不同進(jìn)程之間的資源不能夠共享。

這個(gè)對(duì)于為了一個(gè)大目標(biāo)細(xì)分成的若干小任務(wù)很不友好。比方說對(duì)于一個(gè)網(wǎng)站來說,針對(duì)每一個(gè)訪問網(wǎng)站的連接都去創(chuàng)建一個(gè)進(jìn)程,如果我們想累加一下總的訪問連接數(shù)就比較麻煩了,因?yàn)楦鱾€(gè)進(jìn)程不能去修改同一塊內(nèi)存。

2.創(chuàng)建、切換、銷毀進(jìn)程成本太大。

由于我們的主題是java語(yǔ)言里的并發(fā)操作,至于操作系統(tǒng)底層對(duì)于創(chuàng)建、切換、銷毀進(jìn)程都要做哪些東西不是我們嘮叨的范圍,但是這些操作的開銷真的很大,你知道這一點(diǎn)就好了~

再返回頭來看進(jìn)程的兩個(gè)特點(diǎn),一是對(duì)資源的所有權(quán),二是可以作為操作系統(tǒng)調(diào)度和執(zhí)行的單位,這兩個(gè)特點(diǎn)是沒有關(guān)系的,也就是說獨(dú)立的,現(xiàn)代的好多操作系統(tǒng)已經(jīng)把這兩個(gè)特點(diǎn)給拆開了,可以被調(diào)度和執(zhí)行的單位通常被稱作線程或者輕量級(jí)進(jìn)程,而擁有資源所有權(quán)的單位通常被稱為進(jìn)程。

小貼士:
由于歷史原因,原先的進(jìn)程既是資源的分配單位,也是調(diào)度和執(zhí)行的單位,所以我們打開一個(gè)程序就相當(dāng)于打開一個(gè)進(jìn)程。
提出線程概念之后,這種打開一個(gè)程序就相當(dāng)于打開一個(gè)進(jìn)程的叫法也被保留了下來。其實(shí)現(xiàn)在打開一個(gè)程序的意思是打開一個(gè)進(jìn)程并且打開若干個(gè)于這個(gè)進(jìn)程相關(guān)聯(lián)的線程。
線程的特點(diǎn).

線程的特點(diǎn)

看一下這個(gè)線程的各種特點(diǎn)

1.一個(gè)進(jìn)程至少對(duì)應(yīng)一個(gè)線程

操作系統(tǒng)每開始執(zhí)行一個(gè)程序,都會(huì)為其分配所需的資源以及創(chuàng)建若干個(gè)程序執(zhí)行流,也就是說會(huì)創(chuàng)建一個(gè)進(jìn)程以及若干線程。

2.各個(gè)線程可以共享同一個(gè)進(jìn)程中的各種資源

因?yàn)榫€程是從屬于某個(gè)進(jìn)程,所以進(jìn)程中的內(nèi)存、I/O啥的資源這個(gè)線程都可以訪問到。接著上邊那個(gè)例子,我們可以對(duì)于每一個(gè)連到網(wǎng)站的連接都可以分配一個(gè)線程,然后在申請(qǐng)一塊兒內(nèi)存表示連接數(shù),每創(chuàng)建一個(gè)線程都把連接數(shù)加1,問題就愉快的解決了。

3.創(chuàng)建、切換、銷毀線程的成本遠(yuǎn)低于原先進(jìn)程的成本

因?yàn)橹皇且粋€(gè)調(diào)度和執(zhí)行的單位,本來就是原先進(jìn)程概念的一部分,所以創(chuàng)建、切換、銷毀線程的成本就小多了。

4.線程通信比進(jìn)程通信的效率高

原先進(jìn)程間通信需要配合各種機(jī)制,現(xiàn)在線程間由于可以共享內(nèi)存,所以通信就easy多了。

至于進(jìn)程間通信需要啥機(jī)制我這就不說了,不是我們討論的范圍。
所以線程的提出完美的解決了一開始提出的把不同任務(wù)分配給不同進(jìn)程執(zhí)行的缺陷,現(xiàn)在我們可以把不同的任務(wù)分配給不同的線程去執(zhí)行,不僅可以方便通信交流,而且創(chuàng)建和使用的成本還低~

線程的狀態(tài)

由于線程只是單純的繼承了進(jìn)程中調(diào)度和執(zhí)行的特性,所以原先進(jìn)程擁有的狀態(tài),現(xiàn)在線程一樣擁有,也就是:創(chuàng)建就緒、執(zhí)行阻塞退出。

總結(jié)

由于本篇比較簡(jiǎn)單,總結(jié)就免了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73820.html

相關(guān)文章

  • 我的阿里路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評(píng)論0 收藏0
  • Java并發(fā)編程線程間通訊(上)wait/notify機(jī)制

    摘要:用線程表示維修的過程維修結(jié)束把廁所置為可用狀態(tài)維修工把廁所修好了,準(zhǔn)備釋放鎖了這個(gè)維修計(jì)劃的內(nèi)容就是當(dāng)維修工進(jìn)入廁所之后,先把門鎖上,然后開始維修,維修結(jié)束之后把的字段設(shè)置為,以表示廁所可用。 線程間通信 如果一個(gè)線程從頭到尾執(zhí)行完也不和別的線程打交道的話,那就不會(huì)有各種安全性問題了。但是協(xié)作越來越成為社會(huì)發(fā)展的大勢(shì),一個(gè)大任務(wù)拆成若干個(gè)小任務(wù)之后,各個(gè)小任務(wù)之間可能也需要相互協(xié)作最終...

    Lionad-Morotar 評(píng)論0 收藏0
  • 好文章必讀 - 收藏集 - 掘金

    摘要:方法即為收集器,它接收高階函數(shù)和的后端掘金年的第一天,我坐在獨(dú)墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個(gè)新的,可以替代標(biāo)準(zhǔn)的。 設(shè)計(jì)模式之單例模式 - 掘金前言 作為一個(gè)好學(xué)習(xí)的程序開發(fā)者,應(yīng)該會(huì)去學(xué)習(xí)優(yōu)秀的開源框架,當(dāng)然學(xué)習(xí)的過程中不免會(huì)去閱讀源碼,這也是一個(gè)優(yōu)秀程序員的必備素養(yǎng),在學(xué)習(xí)的過程中很多人會(huì)遇到的障礙,那就是設(shè)計(jì)模式。很多優(yōu)秀的框架會(huì)運(yùn)...

    FrozenMap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

dendoink

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<