1. 程式人生 > 其它 >python併發程式設計基礎

python併發程式設計基礎

  • 一 引子

  • 二 為什麼要有作業系統,什麼又是作業系統

  • 三 作業系統與普通軟體的區別

  • 四 作業系統發展史

一 引子

顧名思義,程序即正在執行的一個過程。程序是對正在執行程式的一個抽象。

程序的概念起源於作業系統,是作業系統最核心的概念,也是作業系統提供的最古老也是最重要的抽象概念之一。作業系統的其他所有內容都是圍繞程序的概念展開的。

所以想要真正瞭解程序,必須事先了解作業系統。

程序排程演算法發展史
    1.先來先服務
      對短作業任務不太友好
  2.短作業優先
      多長作業任務不太友好
  3.時間片輪轉法與多級反饋佇列
      時間片輪轉法:先公平的將CPU分給每個人執行
    多級反饋佇列:根據作業長短的不同再合理分配CPU執行時間
  
'''目的就是為了能夠讓單核的計算機也能夠做到執行多個程式'''

 

二 為什麼要有作業系統,什麼又是作業系統

現代的計算機系統主要是由一個或者多個處理器,主存,硬碟,鍵盤,滑鼠,顯示器,印表機,網路介面及其他輸入輸出裝置組成。

一般而言,現代計算機系統是一個複雜的系統。

其一:如果每位應用程式設計師都必須掌握該系統所有的細節,那就不可能再編寫程式碼了(嚴重影響了程式設計師的開發效率:全部掌握這些細節可能需要一萬年....)

其二:並且管理這些部件並加以優化使用,是一件極富挑戰性的工作,於是,計算安裝了一層軟體(系統軟體),稱為作業系統。它的任務就是為使用者程式提供一個更好、更簡單、更清晰的計算機模型,並管理剛才提到的所有裝置。

總結:

程式設計師無法把所有的硬體操作細節都瞭解到,管理這些硬體並且加以優化使用是非常繁瑣的工作,這個繁瑣的工作就是作業系統來乾的,有了他,程式設計師就從這些繁瑣的工作中解脫了出來,只需要考慮自己的應用軟體的編寫就可以了,應用軟體直接使用作業系統提供的功能來間接使用硬體。

精簡的說的話,作業系統就是一個協調、管理和控制計算機硬體資源和軟體資源的控制程式。作業系統所處的位置如下圖

作業系統位於計算機硬體與應用軟體之間,本質也是一個軟體。作業系統由作業系統的核心(運行於核心態,管理硬體資源)以及系統呼叫(運行於使用者態,為應用程式設計師寫的應用程式提供系統呼叫介面)兩部分組成,所以,單純的說作業系統是運行於核心態的,是不準確的。

細說的話,作業系統應該分成兩部分功能:

#一:隱藏了醜陋的硬體呼叫介面,為應用程式設計師提供呼叫硬體資源的更好,更簡單,更清晰的模型(系統呼叫介面)。應用程式設計師有了這些介面後,就不用再考慮操作硬體的細節,專心開發自己的應用程式即可。
例如:作業系統提供了檔案這個抽象概念,對檔案的操作就是對磁碟的操作,有了檔案我們無需再去考慮關於磁碟的讀寫控制(比如控制磁碟轉動,移動磁頭讀寫資料等細節),
​
#二:將應用程式對硬體資源的競態請求變得有序化
例如:很多應用軟體其實是共享一套計算機硬體,比方說有可能有三個應用程式同時需要申請印表機來輸出內容,那麼a程式競爭到了印表機資源就列印,然後可能是b競爭到印表機資源,也可能是c,這就導致了無序,印表機可能列印一段a的內容然後又去列印c...,作業系統的一個功能就是將這種無序變得有序。

詳解

現代計算機或者網路都是多使用者的,多個使用者不僅共享硬體,而且共享檔案,資料庫等資訊,共享意味著衝突和無序。
​
作業系統主要使用來
​
1.記錄哪個程式使用什麼資源
​
2.對資源請求進行分配
​
3.為不同的程式和使用者調解互相沖突的資源請求。
​
我們可將上述作業系統的功能總結為:處理來自多個程式發起的多個(多個即多路)共享(共享即複用)資源的請求,簡稱多路複用
​
多路複用有兩種實現方式
​
1.時間上的複用
​
當一個資源在時間上覆用時,不同的程式或使用者輪流使用它,第一個程式獲取該資源使用結束後,在輪到第二個。。。第三個。。。
​
例如:只有一個cpu,多個程式需要在該cpu上執行,作業系統先把cpu分給第一個程式,在這個程式執行的足夠長的時間(時間長短由作業系統的演算法說了算)或者遇到了I/O阻塞,作業系統則把cpu分配給下一個程式,以此類推,直到第一個程式重新被分配到了cpu然後再次執行,由於cpu的切換速度很快,給使用者的感覺就是這些程式是同時執行的,或者說是併發的,或者說是偽並行的。至於資源如何實現時間複用,或者說誰應該是下一個要執行的程式,以及一個任務需要執行多長時間,這些都是作業系統的工作。
​
2.空間上的複用
​
每個客戶都獲取了一個大的資源中的一小部分資源,從而減少了排隊等待資源的時間。
​
例如:多個執行的程式同時進入記憶體,硬體層面提供保護機制來確保各自的記憶體是分割開的,且由作業系統控制,這比一個程式獨佔記憶體一個一個排隊進入記憶體效率要高的多。
​
有關空間複用的其他資源還有磁碟,在許多系統中,一個磁碟同時為許多使用者儲存檔案。分配磁碟空間並且記錄誰正在使用哪個磁碟塊是作業系統資源管理的典型任務。
​
這兩種方式合起來便是多道技術

   

 

 

 作業系統與普通軟體的區別

1.主要區別是:你不想用暴風影音了你可以選擇用迅雷播放器或者乾脆自己寫一個,但是你無法寫一個屬於作業系統一部分的程式(時鐘中斷處理程式),作業系統由硬體保護,不能被使用者修改。

2.作業系統與使用者程式的差異並不在於二者所處的地位。特別地,作業系統是一個大型、複雜、長壽的軟體,

  • 大型:linux或windows的原始碼有五百萬行數量級。按照每頁50行共1000行的書來算,五百萬行要有100卷,要用一整個書架子來擺置,這還僅僅是核心部分。使用者程式,如GUI,庫以及基本應用軟體(如windows Explorer等),很容易就能達到這個數量的10倍或者20倍之多。

  • 長壽:作業系統很難編寫,如此大的程式碼量,一旦完成,作業系統所有者便不會輕易扔掉,再寫一個。而是在原有的基礎上進行改進。(基本上可以把windows95/98/Me看出一個作業系統,而windows NT/2000/XP/Vista則是兩位一個作業系統,對於使用者來說它們十分相似。還有UNIX以及它的變體和克隆版本也演化了多年,如System V版,Solaris以及FreeBSD等都是Unix的原始版,不過儘管linux非常依照UNIX模式而仿製,並且與UNIX高度相容,但是linux具有全新的程式碼基礎)

四 作業系統發展史

第一代計算機(1940~1955):真空管和穿孔卡片

第一代計算機的產生背景:

第一代之前人類是想用機械取代人力,第一代計算機的產生是計算機由機械時代進入電子時代的標誌,從Babbage失敗之後一直到第二次世界大戰,數字計算機的建造幾乎沒有什麼進展,第二次世界大戰刺激了有關計算機研究的爆炸性進展。

lowa州立大學的john Atanasoff教授和他的學生Clifford Berry建造了據認為是第一臺可工作的數字計算機。該機器使用300個真空管。大約在同時,Konrad Zuse在柏林用繼電器構建了Z3計算機,英格蘭布萊切利園的一個小組在1944年構建了Colossus,Howard Aiken在哈佛大學建造了Mark 1,賓夕法尼亞大學的William Mauchley和他的學生J.Presper Eckert建造了ENIAC。這些機器有的是二進位制的,有的使用真空管,有的是可程式設計的,但都非常原始,設定需要花費數秒鐘時間才能完成最簡單的運算。

在這個時期,同一個小組裡的工程師們,設計、建造、程式設計、操作及維護同一臺機器,所有的程式設計是用純粹的機器語言編寫的,甚至更糟糕,需要通過成千上萬根電纜接到外掛板上連成電路來控制機器的基本功能。沒有程式設計語言(彙編也沒有),作業系統則是從來都沒聽說過。使用機器的過程更加原始,詳見下‘工作過程’

特點: 沒有作業系統的概念 所有的程式設計都是直接操控硬體

工作過程: 程式設計師在牆上的機時表預約一段時間,然後程式設計師拿著他的外掛版到機房裡,將自己的外掛板街道計算機裡,這幾個小時內他獨享整個計算機資源,後面的一批人都得等著(兩萬多個真空管經常會有被燒壞的情況出現)。

後來出現了穿孔卡片,可以將程式寫在卡片上,然後讀入機而不用外掛板

優點:

程式設計師在申請的時間段內獨享整個資源,可以即時地除錯自己的程式(有bug可以立刻處理)

缺點:

浪費計算機資源,一個時間段內只有一個人用。 注意:同一時刻只有一個程式在記憶體中,被cpu呼叫執行,比方說10個程式的執行,是序列的

第二代計算機*(1955~1965)*:電晶體和批處理系統

第二代計算機的產生背景:

由於當時的計算機非常昂貴,自認很自然的想辦法較少機時的浪費。通常採用的方法就是批處理系統。

特點: 設計人員、生產人員、操作人員、程式人員和維護人員直接有了明確的分工,計算機被鎖在專用空調房間中,由專業操作人員執行,這便是‘大型機’。

有了作業系統的概念

有了程式設計語言:FORTRAN語言或組合語言,寫到紙上,然後穿孔打成卡片,再講卡片盒帶到輸入室,交給操作員,然後喝著咖啡等待輸出介面

工作過程:插圖

 

 

 

 

 

 

 

 

 

第二代如何解決第一代的問題/缺點: 1.把一堆人的輸入攢成一大波輸入, 2.然後順序計算(這是有問題的,但是第二代計算也沒有解決) 3.把一堆人的輸出攢成一大波輸出

現代作業系統的前身:(見圖)

優點:批處理,節省了機時

缺點: 1.整個流程需要人蔘與控制,將磁帶搬來搬去(中間倆小人)

2.計算的過程仍然是順序計算-》序列

3.程式設計師原來獨享一段時間的計算機,現在必須被統一規劃到一批作業中,等待結果和重新除錯的過程都需要等同批次的其他程式都運作完才可以(這極大的影響了程式的開發效率,無法及時除錯程式)

第三代計算機*(1965~1980)*:積體電路晶片和多道程式設計

第三代計算機的產生背景:

20世紀60年代初期,大多數計算機廠商都有兩條完全不相容的生產線。

一條是面向字的:大型的科學計算機,如IBM 7094,見上圖,主要用於科學計算和工程計算

另外一條是面向字元的:商用計算機,如IBM 1401,見上圖,主要用於銀行和保險公司從事磁帶歸檔和列印服務

開發和維護完全不同的產品是昂貴的,同時不同的使用者對計算機的用途不同。

IBM公司試圖通過引入system/360系列來同時滿足科學計算和商業計算,360系列低檔機與1401相當,高檔機比7094功能強很多,不同的效能賣不同的價格

360是第一個採用了(小規模)晶片(積體電路)的主流機型,與採用電晶體的第二代計算機相比,價效比有了很大的提高。這些計算機的後代仍在大型的計算機中心裡使用,此乃現在伺服器的前身,這些伺服器每秒處理不小於千次的請求。

如何解決第二代計算機的問題1: 卡片被拿到機房後能夠很快的將作業從卡片讀入磁碟,於是任何時刻當一個作業結束時,作業系統就能將一個作業從磁帶讀出,裝進空出來的記憶體區域執行,這種技術叫做 同時的外部裝置聯機操作:SPOOLING,該技術同時用於輸出。當採用了這種技術後,就不在需要IBM1401機了,也不必將磁帶搬來搬去了(中間倆小人不再需要)

如何解決第二代計算機的問題2:

第三代計算機的作業系統廣泛應用了第二代計算機的作業系統沒有的關鍵技術:多道技術

*cpu在執行一個任務的過程中,若需要操作硬碟,則傳送操作硬碟的指令,指令一旦發出,硬碟上的機械手臂滑動讀取資料到記憶體中,這一段時間,cpu需要等待,時間可能很短,但對於cpu來說已經很長很長,長到可以讓cpu做很多其他的任務,如果我們讓cpu在這段時間內切換到去做其他的任務,這樣cpu不就充分利用了嗎。這正是多道技術產生的技術背景*

多道技術:

多道技術中的多道指的是多個程式,多道技術的實現是為了解決多個程式競爭或者說共享同一個資源(比如cpu)的有序排程問題,解決方式即多路複用,多路複用分為時間上的複用和空間上的複用。

空間上的複用:將記憶體分為幾部分,每個部分放入一個程式,這樣,同一時間記憶體中就有了多道程式。

 

 

 時間上的複用:當一個程式在等待I/O時,另一個程式可以使用cpu,如果記憶體中可以同時存放足夠多的作業,則cpu的利用率可以接近100%,類似於我們小學數學所學的統籌方法。(作業系統採用了多道技術後,可以控制程序的切換,或者說程序之間去爭搶cpu的執行許可權。這種切換不僅會在一個程序遇到io時進行,一個程序佔用cpu時間過長也會切換,或者說被作業系統奪走cpu的執行許可權)

詳解

空間上的複用最大的問題是:程式之間的記憶體必須分割,這種分割需要在硬體層面實現,由作業系統控制。如果記憶體彼此不分割,則一個程式可以訪問另外一個程式的記憶體,

首先喪失的是安全性,比如你的qq程式可以訪問作業系統的記憶體,這意味著你的qq可以拿到作業系統的所有許可權。

其次喪失的是穩定性,某個程式崩潰時有可能把別的程式的記憶體也給回收了,比方說把作業系統的記憶體給回收了,則作業系統崩潰。

第三代計算機的作業系統仍然是批處理

許多程式設計師懷念第一代獨享的計算機,可以即時除錯自己的程式。為了滿足程式設計師們很快可以得到響應,出現了分時作業系統

如何解決第二代計算機的問題3:

分時作業系統: 多個聯機終端+多道技術

20個客戶端同時載入到記憶體,有17在思考,3個在執行,cpu就採用多道的方式處理記憶體中的這3個程式,由於客戶提交的一般都是簡短的指令而且很少有耗時長的,索引計算機能夠為許多使用者提供快速的互動式服務,所有的使用者都以為自己獨享了計算機資源

CTTS:麻省理工(MIT)在一臺改裝過的7094機上開發成功的,CTSS相容分時系統,第三代計算機廣泛採用了必須的保護硬體(程式之間的記憶體彼此隔離)之後,分時系統才開始流行

MIT,貝爾實驗室和通用電氣在CTTS成功研製後決定開發能夠同時支援上百終端的MULTICS(其設計者著眼於建造滿足波士頓地區所有使用者計算需求的一臺機器),很明顯真是要上天啊,最後摔死了。

後來一位參加過MULTICS研製的貝爾實驗室電腦科學家Ken Thompson開發了一個簡易的,單使用者版本的MULTICS,這就是後來的UNIX系統。基於它衍生了很多其他的Unix版本,為了使程式能在任何版本的unix上執行,IEEE提出了一個unix標準,即posix(可移植的作業系統介面Portable Operating System Interface)

後來,在1987年,出現了一個UNIX的小型克隆,即minix,用於教學使用。芬蘭學生Linus Torvalds基於它編寫了Linux

第四代計算機*(1980~至今):個人計算機*

PS:即使可以利用的cpu只有一個(早期的計算機確實如此),也能保證支援(偽)併發的能力。將一個單獨的cpu變成多個虛擬的cpu(多道技術:時間多路複用和空間多路複用+硬體上支援隔離),沒有程序的抽象,現代計算機將不復存在。

六 總結

必備的理論基礎:

#一 作業系統的作用:
    1:隱藏醜陋複雜的硬體介面,提供良好的抽象介面
    2:管理、排程程序,並且將多個程序對硬體的競爭變得有序
​
#二 多道技術:
    1.產生背景:針對單核,實現併發
    ps:
    現在的主機一般是多核,那麼每個核都會利用多道技術
    有4個cpu,運行於cpu1的某個程式遇到io阻塞,會等到io結束再重新排程,會被排程到4個
    cpu中的任意一個,具體由作業系統排程演算法決定。
​
    2.空間上的複用:如記憶體中同時有多道程式
    3.時間上的複用:複用一個cpu的時間片
       強調:遇到io切,佔用cpu時間過長也切,核心在於切之前將程序的狀態儲存下來,這樣
            才能保證下次切換回來時,能基於上次切走的位置繼續執行
#三 併發與並行and高併發與高並行
  1.併發:看上去同時執行就可以
  2.並行:必須在同一時間執行
  3.
高併發:我們寫的軟體可以支援1個億的併發量一個億的使用者來了之後都可以感覺到自己被服務著
  4.
高並行:我們寫的軟體可以支援1個億的並行量上述話語的言外之意是計算機有一億個CPU
#四 同步與非同步

  1.同步:提交完任務之後原地等待任務的返回結果 期間不做任何事情
  2.非同步:提交完任務之後不願地等待任務的結果 直接去做其他事情 有結果自動提醒