摘要:其實現在打開一個程序的意思是打開一個進程并且打開若干個于這個進程相關聯的線程。
操作系統發展回顧 裸機
老早之前的計算機只有一個處理器,而一個處理器在同一時刻只能處理一條指令,換句話說,我們的代碼需要一行一行的按順序被計算機執行,計算機只能把一個程序完整的執行完,然后再執行第二個程序。所以計算機專業的同學們要排隊去機房做實驗,一個人執行完然他的程序后,第二個人再執行自己的程序,這也就意味著所有計算機資源是被一個程序獨占的,計算機資源包括處理器、內存、硬盤、輸入/輸出設備啥的。這樣的計算機系統我們稱之為裸機。
簡單批處理系統后來人們發現對于價格高昂的計算機設備來說,在換人的過程中就浪費了好多時間,時間就是金錢,有這些時間可以多執行好多程序了。所以有人寫了一個程序,把所有同學們需要做實驗的程序都放在這個程序里排個隊,由這個程序來協調各個同學們的程序執行,一個執行完了立即換成另一個,這樣就不用人工干預了,所以他們把這樣的系統叫做簡單批處理系統,而那個負責協調各個童鞋們程序的程序,就是所謂的操作系統的雛形。
多道批處理系統我們知道,處理器的速度是嗖嗖的,比內存訪問的速度快好多個數量級,而內存又比硬盤、打印機等I/O設備啥的快好多個數量級,而程序執行過程中又免不了從硬盤里讀個文件,往打印機輸出個啥的,所以處理器浪費了好多時間等待這些I/O操作的完成。再一次,時間就是金錢,為了盡可能的剝削計算機的運算能力,在程序遇到I/O操作或者什么其他會阻塞程序執行的操作時,處理器會轉向執行其它的程序,什么時候這個阻塞的操作完成了,再掉過頭繼續執行它。從宏觀上看,處理器可以各個程序輪流執行,所以這樣的系統就稱為多道批處理系統。
分時處理有的同學對排隊執行程序這個事兒很有意見,大家都是學生,憑啥先執行你的后執行我的,你要是寫了個while(true),那大家都得玩兒完~所以人們給每個程序都分配一點處理器時間去輪流執行,每個程序分配到的執行時間就叫做時間片,這個過程也叫做分時處理。又因為處理器速度太快了,時間片的大小可以做到微秒毫秒的大小,所以這個切換的過程對于人來說根本感覺不出來,所以看起來像各個程序在同時執行。不過后來人們在一臺計算機上又裝了多個處理器,就是我們常聽說的4核、8核啥的,所以也可能真正的在同時執行。
而時間片具體設置為多大,處理器怎么切換各個程序的執行,這些工作就是所謂的操作系統來控制的。
進程 進程的概念和特點我們自己寫的程序,也就是所謂的用戶程序是由操作系統來管理的,人們把一個執行著的程序叫做一個進程(英文名:Process),每個進程都有這么兩個特點:
1.資源所有權
程序在運行過程中需要一定的資源,比如內存、I/O啥的,這些東西不能在不同進程間共享,假如一個進程占了另一個進程的內存,那另一個進程的數據不就丟失了么;一個進程正在使用打印機輸出東西,另一個進程也使用的話,不就尷尬了么。所以進程所擁有的這些資源是不能共享的,而這種資源分配的活是由操作系統來管理的。
2.調度/執行
操作系統會為它管理的進程分配時間片,來調度哪個進程應該被處理器處理,哪個應該先休息一會兒。
所以我們現在電腦里每個運行著的程序都是一個進程,可以打開你的任務管理器(windows)或者活動監視器(mac),看到我們的電腦里其實有好多好多進程喔,什么QQ、微信、音樂播放器、視頻播放器啥的。
進程的狀態在操作系統級別上,進程根據它運行的情況,可以分成下邊5種狀態:
1.新建
剛剛創建的那個時刻,操作系統會為這個進程在內存中創建相應的數據,比如分配這個進程的ID,優先級什么的~這個狀態持續的時間比較短。
2.就緒
一旦該進程相關的一些數據創建好了,這個進程就會被放在一個叫就緒隊列的隊列里,之后操作系統就會從這個隊列里挑一個進程放到處理器里執行。
3.運行
這個進程被操作系統分配了時間片,處理器開始執行它。
4.阻塞
在執行進程的過程中,可能遇到某些阻塞的動作,比如I/O操作,處理器如果一直等待該阻塞動作完成的話就太浪費時間了,所以會把等待阻塞動作完成的進程放到一個叫阻塞隊列的隊列里,之后并不會從這個隊列里挑選即將執行的進程,而是直到該阻塞動作完成,才重新把該進程放到就緒隊列里等待執行。
5.退出
該進程執行完畢,或者遇到了什么錯誤,或者操作系統就是想弄死它,它就被殺死了,這個狀態里操作系統可能還會記錄一下死因啥的,這個過程也很短。
這些狀態的具體轉換過程看下圖:
串行編程和并行編程到目前為止,我們的編程模式都是串行編程,也就是處理器執行完一條指令再執行另一條。舉個例子啊,比如你媽給你布置了兩個任務:一是去打瓶醬油,二是去燒一壺水,按照串行編程的方式就是兩個任務依次進行,也就是說你先打醬油,然后回來再燒水。這么做沒啥問題,但是沒有效率啊,所以你也可以先把水燒上,然后去打醬油,回來正好水燒開了~這種多個任務同時進行的編程方式就叫做并行編程。
回到計算機中來,串行編程的方式就是我們把所有要完成的任務放到一個進程中去執行,而并行編程的方式就是我們去開幾個進程同時執行(注:這個同時可能是假的,如果只有單個處理器,那就是看上去是同時的)。這種并行編程的優勢是顯而易見的:
1.充分利用多個處理器
現代計算機的處理器越來越多,不用白不用。如果所有的任務都塞到1個進程中,而計算機實際有100個處理器,那么將會有99%的計算能力將被浪費。
2.防止任務的阻塞
即使是在單個處理器中,為多個任務創建多個進程也是有好處的。先執行的任務可能會需要執行某些I/O操作而造成阻塞,所以就需要等待I/O操作完成才能繼續執行。但是如果為每個任務創建一個進程之后,一個任務阻塞掉并不會影響別的任務的正常執行。
3.簡化編程的模型
把一個大任務拆分成若干個小任務自然是會事情清晰許多(注:也不是絕對啊),也就是所謂的大事化小,小事化了~所以把各個任務分配到不同進程里去執行在我們編程方面也會容易一些(注:不是絕對啊)。
線程 線程的概念進程是個好東西,可以給每個任務都分配一個進程以達到并發執行的目的。可是運行了一段時間人們發現還是有一些不好的地方的:
1.不同進程之間的資源不能夠共享。
這個對于為了一個大目標細分成的若干小任務很不友好。比方說對于一個網站來說,針對每一個訪問網站的連接都去創建一個進程,如果我們想累加一下總的訪問連接數就比較麻煩了,因為各個進程不能去修改同一塊內存。
2.創建、切換、銷毀進程成本太大。
由于我們的主題是java語言里的并發操作,至于操作系統底層對于創建、切換、銷毀進程都要做哪些東西不是我們嘮叨的范圍,但是這些操作的開銷真的很大,你知道這一點就好了~
再返回頭來看進程的兩個特點,一是對資源的所有權,二是可以作為操作系統調度和執行的單位,這兩個特點是沒有關系的,也就是說獨立的,現代的好多操作系統已經把這兩個特點給拆開了,可以被調度和執行的單位通常被稱作線程或者輕量級進程,而擁有資源所有權的單位通常被稱為進程。
小貼士:
由于歷史原因,原先的進程既是資源的分配單位,也是調度和執行的單位,所以我們打開一個程序就相當于打開一個進程。
提出線程概念之后,這種打開一個程序就相當于打開一個進程的叫法也被保留了下來。其實現在打開一個程序的意思是打開一個進程并且打開若干個于這個進程相關聯的線程。
線程的特點.
看一下這個線程的各種特點
1.一個進程至少對應一個線程
操作系統每開始執行一個程序,都會為其分配所需的資源以及創建若干個程序執行流,也就是說會創建一個進程以及若干線程。
2.各個線程可以共享同一個進程中的各種資源
因為線程是從屬于某個進程,所以進程中的內存、I/O啥的資源這個線程都可以訪問到。接著上邊那個例子,我們可以對于每一個連到網站的連接都可以分配一個線程,然后在申請一塊兒內存表示連接數,每創建一個線程都把連接數加1,問題就愉快的解決了。
3.創建、切換、銷毀線程的成本遠低于原先進程的成本
因為只是一個調度和執行的單位,本來就是原先進程概念的一部分,所以創建、切換、銷毀線程的成本就小多了。
4.線程通信比進程通信的效率高
原先進程間通信需要配合各種機制,現在線程間由于可以共享內存,所以通信就easy多了。
至于進程間通信需要啥機制我這就不說了,不是我們討論的范圍。
所以線程的提出完美的解決了一開始提出的把不同任務分配給不同進程執行的缺陷,現在我們可以把不同的任務分配給不同的線程去執行,不僅可以方便通信交流,而且創建和使用的成本還低~
由于線程只是單純的繼承了進程中調度和執行的特性,所以原先進程擁有的狀態,現在線程一樣擁有,也就是:創建、就緒、執行、阻塞、退出。
總結由于本篇比較簡單,總結就免了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73820.html
摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:用線程表示維修的過程維修結束把廁所置為可用狀態維修工把廁所修好了,準備釋放鎖了這個維修計劃的內容就是當維修工進入廁所之后,先把門鎖上,然后開始維修,維修結束之后把的字段設置為,以表示廁所可用。 線程間通信 如果一個線程從頭到尾執行完也不和別的線程打交道的話,那就不會有各種安全性問題了。但是協作越來越成為社會發展的大勢,一個大任務拆成若干個小任務之后,各個小任務之間可能也需要相互協作最終...
摘要:方法即為收集器,它接收高階函數和的后端掘金年的第一天,我坐在獨墅湖邊,寫下這篇文章。正因如此,所以最全系列教程后端掘金是從版本開始引入的一個新的,可以替代標準的。 設計模式之單例模式 - 掘金前言 作為一個好學習的程序開發者,應該會去學習優秀的開源框架,當然學習的過程中不免會去閱讀源碼,這也是一個優秀程序員的必備素養,在學習的過程中很多人會遇到的障礙,那就是設計模式。很多優秀的框架會運...
閱讀 2164·2021-11-11 16:55
閱讀 1685·2019-08-30 15:54
閱讀 2817·2019-08-30 15:53
閱讀 2211·2019-08-30 15:44
閱讀 1152·2019-08-30 15:43
閱讀 965·2019-08-30 11:22
閱讀 1942·2019-08-29 17:20
閱讀 1566·2019-08-29 16:56