程序 協程篇

2022-08-24 22:00:10 字數 4741 閱讀 1270

程序、執行緒、協程篇

1.作業系統發展史

①手工操作(無作業系統):將對應於程式和資料的已穿孔的紙帶(或卡片)裝入輸入機,然後啟動輸入機把程式和資料輸入計算機記憶體,接著通過控制台開關啟動程式針對資料執行;計算完畢,印表機輸出計算結果;使用者取走結果並卸下紙帶(或卡片)後,才讓下乙個使用者上機。

②批處理系統:載入在計算機上的乙個系統軟體,在它的控制下,計算機能夠自動地、成批地處理乙個或多個使用者的作業(這作業包括程式、資料和命令)。

③聯機批處理系統:作業的輸入/輸出由cpu來處理。成批地讀入、輸出。

④離線批處理系統:增加一台不與主機直接相連而專門用於與輸入/輸出裝置打交道的衛星機。

⑤多道程式系統:指允許多個程式同時進入記憶體並允許它們交替在cpu中執行。單處理機系統中多道程式

⑥多道批處理系統:(簡稱:批處理系統)系統內可同時容納多個作業,不允許使用者與其作業發生互動作用。

⑦分時系統:把處理機的執行時間分成很短的時間片,按時間片輪流把處理機分配給各聯機作業使用。

⑧實時系統:即系統能夠及時響應隨機發生的外部事件,並在嚴格的時間範圍內完成對該事件的處理。

2.程序與執行緒

程式是指令的集合,它是程序執行的靜態描述文字;

程序是程式的一次執行活動,屬於動態概念。

執行緒是程序的細分,執行程序總事件下很多不同類別的事件。

3.python gil(global interpreter lock)

無論你啟多少個執行緒,你有多少個cpu, python在執行的時候會淡定的在同一時刻只允許乙個執行緒執行。

4.執行緒的呼叫方式:

直接呼叫

繼承式呼叫

join & daemon:守護執行緒

執行緒鎖(互斥鎖mutex)

①使用者級的lock與gil的區別:加入gil主要的原因是為了降低程式的開發的複雜度,

你自己的程式 裡的執行緒和 py直譯器自己的執行緒是併發執行的,lock可以解決程式執行緒的先後,而gil解決直譯器的執行緒先後。

rlock(遞迴鎖):在乙個大鎖中還要再包含子鎖

semaphore(訊號量):互斥鎖 同時只允許乙個執行緒更改資料,而semaphore是同時允許一定數量的執行緒更改資料

timer:設定時間後執行

events:實現兩個或多個執行緒間的互動,紅綠燈的例子、員工進公司門要刷卡。

5.queue佇列:在多執行緒中要求資料安全修改時,特別有效。

6.生產者消費者模型:該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。

①生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。

②生產者消費者模式是通過乙個容器(緩衝區)來解決生產者和消費者的強耦合問題。

7.多程序multiprocessing

2018/03/09 周五

協程協程,又稱微執行緒,纖程。英文名coroutine。協程是一種使用者態的輕量級執行緒。

協程擁有自己的暫存器上下文和棧。重入時,進入上一次離開時所處邏輯流的位置。

2018/03/10 週六

1.資料庫(database)是按照資料結構來組織、儲存和管理資料的倉庫,

rdbms即關聯式資料庫管理系統(relational database management system)

mysql是最流行的關係型資料庫管理系統

通過orm將程式語言的物件模型和資料庫的關係模型建立對映關係,

在使用程式語言對資料庫進行操作的時候,可以直接使用程式語言的物件模型進行操作

2018/03/11 週日

1.協程

gevent:併發同步或非同步程式設計

gevent.joinall 函式:阻塞當前流程,並執行所有給定的greenlet。

執行流程只會在所有greenlet執行完後才會繼續向下走。

協程與程序、執行緒在伺服器處理模型中的比較:

(1)每收到乙個請求,建立乙個新的程序,來處理該請求;

(2)每收到乙個請求,建立乙個新的執行緒,來處理該請求;

(3)每收到乙個請求,放入乙個事件列表,讓主程序通過非阻塞i/o方式來處理請求

①建立新的程序的開銷比較大,所以,會導致伺服器效能比較差,但實現比較簡單。

②要涉及到執行緒的同步,有可能會面臨死鎖等問題。

③在寫應用程式**時,邏輯比前面兩種都複雜。

結論:一般普遍認為第(3)種方式是大多數網路伺服器採用的方式

2.程式設計正規化:單執行緒、多執行緒以及事件驅動程式設計模型

①單執行緒同步模型:程式不必要的等待,降低了執行速度

②多執行緒版本:程式設計師必須寫**來保護共享資源,防止其被多個執行緒同時訪問。

③事件驅動版本:3個任務交錯執行,但仍然在乙個單獨的執行緒控制中。

當處理i/o或者其他昂貴的操作時,註冊乙個**到事件迴圈中,然後當i/o操作完成時繼續執行。

事件驅動程式設計,可以聯絡到 協程的gevent非阻塞i/o,或者 非同步i/o

3.關於i/o 的介紹

①使用者空間與核心空間

②程序切換:

(1)儲存處理機上下文,包括程式計數器和其他暫存器。

(2)更新pcb資訊。

(3)把程序的pcb移入相應的佇列,如就緒、在某事件阻塞等佇列。

(4)選擇另乙個程序執行,並更新其pcb。

(5)更新記憶體管理的資料結構。

(6)恢復處理機上下文。

程序控制塊(processing control block):作業系統核心中一種資料結構,主要表示程序狀態。

存放著作業系統用於描述程序情況及控制程序執行所需的全部資訊

③程序的阻塞:

正在執行的程序,由於期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新資料尚未到達或無新工作做等,

則由系統自動執行阻塞原語(block),使自己由執行狀態變為阻塞狀態。

④檔案描述符fd:

它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。

⑤快取 i/o (大多數檔案系統的預設 i/o 操作)

資料會先被拷貝到作業系統核心的緩衝區中,然後才會從作業系統核心的緩衝區拷貝到應用程式的位址空間。

4.io模式:

- 阻塞 i/o(blocking io)

- 非阻塞 i/o(nonblocking io)

- i/o 多路復用( io multiplexing)

- 訊號驅動 i/o( signal driven io)

- 非同步 i/o(asynchronous io)

io執行的兩個階段:準備資料、拷貝資料

①阻塞 i/o:準備資料和拷貝資料 兩個階段都會block直至完成

②非阻塞 i/o:準備資料階段不block,使用者程序需要不斷的主動詢問kernel資料好了沒有

③i/o 多路復用:

使用者程序呼叫了select/poll/epoll函式,那麼整個程序會被block。

kernel會「監視」所有select負責的socket,當任何乙個socket中的資料準備好了,select就會返回。

使用者程序再呼叫read操作,將資料從kernel拷貝到使用者程序。

優點:通過一種機制(select,poll,epoll都是io多路復用的機制。)

乙個程序能同時等待多個檔案描述符,而這些檔案描述符(套接字描述符)其中的任意乙個進入讀就緒狀態,

select()函式就可以返回。

④非同步 i/o:

兩個階段都不block,i/o操作完成後,kernel會給使用者程序傳送乙個signal,告知read操作完成了。

synchronous io和asynchronous io的區別:

synchronous io做」io operation」的時候會將process阻塞。

如blocking io,non-blocking io,io multiplexing

non-blocking io和asynchronous io的區別:

在non-blocking io中,雖然程序大部分時間都不會被block,但仍然要求程序去主動的check,

並當資料準備完成後,也需程序主動再次呼叫recvfrom來將資料拷貝到使用者記憶體。

而asynchronous io則完全不同。它就像是使用者程序將整個io操作交給了他人(kernel)完成,

然後他人做完後發訊號通知。在此期間,使用者程序不需要去檢查io操作的狀態,也不需要主動的去拷貝資料。

5.i/o 多路復用之select、poll、epoll詳解

select,poll,epoll都是io多路復用的機制。i/o多路復用就是通過一種機制,

乙個程序可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。

①select:呼叫後select函式會阻塞,直到有描述副就緒(有資料 可讀、可寫、或者有except),

或者超時(timeout指定等待時間,如果立即返回設為null即可),函式返回。

當select函式返回後,可以 通過遍歷fdset,來找到就緒的描述符。

②poll:不同於select使用三個點陣圖來表示三個fdset的方式,poll使用乙個 pollfd的指標實現。

③epoll:select和poll的增強版本

**到此,聯絡協程的gevent,通過gevent實現單執行緒下的多socket併發,對比select單程序下,多併發socket。

程序 執行緒 協程

多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...

python 協程 and 程序

先從乙個爬蟲開始,請看下面的 import time def crawl page url print crawling format url sleep time int url.split 1 time.sleep sleep time print ok format url def main ...

程序 執行緒 協程

程序是系統資源分配的最小單位,系統由乙個個程序 程式 組成。一般情況下,包括文字區域 text region 資料區域 data region 和堆疊 stack region 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...