linux IO學習筆記 (持續更新錯誤)

linux 學習筆記mysql

1、linux的緩存IO機制react

從權限上來講,內核擁有權限很高,可訪問全部底層硬件。而用戶(進程)的權限相對較低,而這樣的目的即是爲了保護內核的安全。
從內存空間上來講,操做系統把內存分紅了兩份,一份給內核用(稱爲內核空間),一份給用戶(進程)用(稱爲用戶空間),二者絕對的互不干擾。(windows的藍屏緣由:硬件驅動與系統的不兼容,驅動代碼運行在系統內核空間,若是出錯就會影響到系統內核,進而系統崩潰,機子死機。而QQ崩潰就不會形成機子死機,由於QQ運行在用戶空間)
因此內核的數據與用戶的數據不共享,內核若是要把任務(數據)交給用戶(進程),就會有一個data copy的過程。linux

代碼獲取硬盤文件內數據的過程(IO的一次訪問):用戶(進程)不具備對硬件(硬盤)的權限,須要申請權限,經過內核來進行系統調用(API)。內核建立 page cache(頁緩存)並把用戶須要的數據從硬盤一點一點地讀取到 page cache中,當把全部數據都準備好後,一次性交給用戶進程(這是在緩存非命中的狀況下,若是命中緩存則直接返回),因而我們代碼也就讀取到了數據,(對好比PHP的 file_get_contents()的一次文件讀取過程)。redis

而寫入的流程則是將上面的流程逆着走一遍。遠程客戶端的數據接收同理,只是讀取的起點與寫入的終點不一樣而已。sql

另,無論代碼(用戶進程)從哪裏 fread 數據,遠程客戶端數據也好,硬盤數據也好,都得經過一箇中間人(內核)來讀取(由於沒有對硬件的權限)。因此在這個怎麼接收數據的問題上產生了難題:若是解決同時接收多個客戶端發送來的數據的問題(經典的C10k併發)。因而衍生出了五種IO網絡模型:windows

  • 阻塞 I/O(blocking IO)
  • 非阻塞 I/O(nonblocking IO)
  • I/O 多路複用( IO multiplexing)
    socket的可讀可寫事件(待整理)
  • 信號驅動 I/O( signal driven IO)
  • 異步 I/O(asynchronous IO)

而基於這5種IO模型,又衍生出不少個服務器模型(IO設計模式),如多進程/線程模型,leader/follower,Reactor,Proactor設計模式

2、服務器模型歷史緩存

第一階段:早期服務器模型爲一個while死循環,接收一個接連,處理這個鏈接任務,返回處理結果。全程阻塞,運行中沒法處理新的鏈接。安全

第二階段:多進程/線程模型,即爲經典的 「connection per process/thread」,一個進程或線程,對應一個鏈接。這樣的話,有多少個進程或線程,就能處理多少個鏈接請求。服務器

至今:對第二階段的優化。多進程/線程有不少不足,如資源的拷貝,線程的建立銷燬的開銷(leader/follower模型,線程池的空閒線程的使用),進程數或線程數上限的問題(限制了鏈接請求數),單個線程還能夠再細化(reactor模型,redis底層採用此模型)等等。如下詳細分開記筆記

3、leader-follower多線程模型

線程的三種狀態:
一、leader,使命:等待事件任務;特色:始終只有一個leader;狀態:等待。
二、processing,使命:處理任務ing;狀態:運行中。
三、follower,使命:接收leader 的通知,嘗試搶佔鎖,力圖成爲leader。狀態:空閒。

線程狀態轉化
一、Leader 等到事件任務時,放出惟一的一把鎖,通知followers搶鎖(也多是其它如FIFO的形式選leader或其它策略)。肯定某個follower成爲leader後,自身轉變爲 processing 處理任務。
二、processing 處理完任務後,轉變爲 follower,加入等待隊列。

優勢:
普通的多線程模型,當主線程接到IO事件時,會建立新的子線程,把要處理的任務數據 copy 交給新的子線程,讓它去解決問題,而主線程繼續等待請求。子線程處理完任務後,會退出線程並銷燬資源。
一、無頻繁的子線程建立、銷燬的開銷
二、無線程間的data copy

4、reactor模型

5、線程池,mysql線程池

閱讀參考:
維基百科名稱解釋
http://rango.swoole.com/archi...

相關文章
相關標籤/搜索