成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

dendoink / 735人閱讀

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

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

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

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

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

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

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

分時處理

有的同學(xué)對排隊執(zhí)行程序這個事兒很有意見,大家都是學(xué)生,憑啥先執(zhí)行你的后執(zhí)行我的,你要是寫了個while(true),那大家都得玩兒完~所以人們給每個程序都分配一點處理器時間去輪流執(zhí)行,每個程序分配到的執(zhí)行時間就叫做時間片,這個過程也叫做分時處理。又因為處理器速度太快了,時間片的大小可以做到微秒毫秒的大小,所以這個切換的過程對于人來說根本感覺不出來,所以看起來像各個程序在同時執(zhí)行。不過后來人們在一臺計算機上又裝了多個處理器,就是我們常聽說的4核、8核啥的,所以也可能真正的在同時執(zhí)行。

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

進程 進程的概念和特點

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

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

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

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

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

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

進程的狀態(tài)

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

1.新建

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

2.就緒

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

3.運行

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

4.阻塞

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

5.退出

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

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

串行編程和并行編程

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

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

1.充分利用多個處理器

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

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

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

3.簡化編程的模型

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

線程 線程的概念

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

1.不同進程之間的資源不能夠共享。

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

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

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

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

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

線程的特點

看一下這個線程的各種特點

1.一個進程至少對應(yīng)一個線程

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

2.各個線程可以共享同一個進程中的各種資源

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

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

因為只是一個調(diào)度和執(zhí)行的單位,本來就是原先進程概念的一部分,所以創(chuàng)建、切換、銷毀線程的成本就小多了。

4.線程通信比進程通信的效率高

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

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

線程的狀態(tài)

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

總結(jié)

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

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/73820.html

相關(guān)文章

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

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

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

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

    Lionad-Morotar 評論0 收藏0
  • 好文章必讀 - 收藏集 - 掘金

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

    FrozenMap 評論0 收藏0

發(fā)表評論

0條評論

dendoink

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<