阻塞IO, 非阻塞IO, 同步IO,非同步IO介紹

2022-05-27 03:15:16 字數 2724 閱讀 2546

一、前言

1、我們之前講了io操作什麼時候切換回來呢?

我們剛剛講了**函式,這個**函式是當你的程式一遇到io操作,再一切換,這個切換的時候,切換之前你等著io操作完了再回來。

2、io 為什麼不阻塞吶?

因為io操作是用作業系統完成的,咋們使用者讀乙個檔案,你以為自己的程式開啟乙個檔案,然後去把檔案的內容讀出來。其實不然,是你的作業系統的排程介面開啟這個檔案,然後把這個資料讀會開,其實是作業系統負責io的控制。

3、我怎麼切換回來?

加乙個**函式,就是我去切換之前,調作業系統io介面的時候,告訴作業系統,說你處理完了之後,調一下這個**函式,這個**函式就會通知我,通知我了就代表執行完了,我就回來把這個io拿到了,所以就是通過這個事件驅動的方式。出現這個io操作,我就註冊這個事件,就是io事件交給作業系統,作業系統內部有乙個佇列,處理完了吧結果返回給你,通知**函式通知你。

二、邏輯圖

三、io多路復用

在進行解釋之前,首先要說明幾個概念:

- 使用者空間和核心空間

- 程序切換

- 程序的阻塞

- 檔案描述符

- 快取 i/o

現在作業系統都是採用虛擬儲存器,那麼對32位作業系統而言,它的定址空間(虛擬儲存空間)為4g(2的32次方)。作業系統的核心是核心,獨立於普通的應用程式,可以訪問受保護的記憶體空間,也有訪問底層硬體裝置的所有許可權。為了保證使用者程序不能直接操作核心(kernel),保證核心的安全,操心系統將虛擬空間劃分為兩部分,一部分為核心空間,一部分為使用者空間。針對linux作業系統而言,將最高的1g位元組(從虛擬位址0xc0000000到0xffffffff),供核心使用,稱為核心空間,而將較低的3g位元組(從虛擬位址0x00000000到0xbfffffff),供各個程序使用,稱為使用者空間。

為了控制程序的執行,核心必須有能力掛起正在cpu上執行的程序,並恢復以前掛起的某個程序的執行。這種行為被稱為程序切換。因此可以說,任何程序都是在作業系統核心的支援下執行的,是與核心緊密相關的。

從乙個程序的執行轉到另乙個程序上執行,這個過程中經過下面這些變化:

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

2. 更新pcb資訊。

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

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

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

6. 恢復處理機上下文。

總而言之就是很耗資源,具體的可以參考這篇文章:程序切換

注:程序控制塊(processing control block),是作業系統

核心中一種資料結構,主要表示程序

狀態。其作用是使乙個在多道程式

環境下不能獨立執行的程式(含資料),成為乙個能獨立執行的基本單位或與其它程序併發執行的程序。或者說,os是根據pcb來對併發執行的程序進行控制和管理的。 pcb通常是系統記憶體占用區中的乙個連續存區,它存放著作業系統

用於描述程序情況及控制程序執行所需的全部資訊

正在執行的程序,由於期待的某些事件未發生,如請求系統資源失敗、等待某種操作的完成、新資料尚未到達或無新工作做等,則由系統自動執行阻塞原語(block),使自己由執行狀態變為阻塞狀態。可見,程序的阻塞是程序自身的一種主動行為,也因此只有處於執行態的程序(獲得cpu),才可能將其轉為阻塞狀態。當程序進入阻塞狀態,是不占用cpu資源的

檔案描述符(file descriptor)是電腦科學中的乙個術語,是乙個用於表述指向檔案的引用的抽象化概念。

檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述符展開。但是檔案描述符這一概念往往只適用於unix、linux這樣的作業系統。

快取 i/o 又被稱作標準 i/o,大多數檔案系統的預設 i/o 操作都是快取 i/o。在 linux 的快取 i/o

機制中,作業系統會將 i/o 的資料快取在檔案系統的頁快取( page cache

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

四、總結

4.1、前面總結

1、作業系統本身執行也需要記憶體空間,所以你8g記憶體,往往使用,達不到8g。

2、只有核心是作業系統本身訪問的,其他的程式是不能直接訪問核心的,只有通過作業系統訪問。

為了減少從核心態到使用者態的資料來回的copy,因為如果你開啟乙個檔案,你讀到記憶體裡,你以為是直接讀到你的使用者的記憶體裡面,其實是先讀到快取裡面,也就是核心的快取裡面,然後再由核心幫你把這份資料copy到使用者的記憶體裡面。就是為了避免這裡的來回copy,耗資源,這樣的話效率就高。

別人發來資料不是發到你使用者的socket程式裡面,而是先發到作業系統的io介面裡,然後作業系統io介面,其實讀到了核心空間裡面,再把這份資料copy到你的使用者的記憶體空間裡面的,資料要從核心態copy到使用者態。這裡面是cpu調copy這個介面需要消耗cpu,最主要的是記憶體的開銷。都是在記憶體中的,只是有乙個核心空間和使用者空間,資料需要從核心把這個資料轉給你。

同步IO 非同步IO 阻塞IO 非阻塞IO

同步io 非同步io 阻塞io 非阻塞io,這幾個詞常見於各種各樣的與網路相關的文章之中,往往不同上下文中它們的意思是不一樣的,以致於我在很長一段時間對此感到困惑,所以想寫一篇文章整理一下。posix 可移植作業系統介面 把同步io操作定義為導致程序阻塞直到io完成的操作,反之則是非同步io按pos...

IO 同步,非同步,阻塞,非阻塞

參考文章 好文推薦 唉最近真是高產似母豬,剛進新公司工作量暫時不飽和,只能每天學學學學學學查漏補缺啦,學習使我快樂哈哈哈哈哈哈哈哈 標題裡的詞彙相信都經常看到,但是能說清楚的估計20個人裡面能有1個就不錯了,網上的資料也是五花八門,大部分描述差不多,很多時候估計作者本身也是似懂非懂,我也看了很多文章...

同步 非同步 阻塞 非阻塞 I O

一 同步 非同步 首先要是多個事物,只有乙個事物,是不存在同步或非同步的。同步 指協同步調。即,多個事物不能同時進行,必須乙個乙個的來,上乙個事物結束後,下乙個事物才開始。那當乙個事物正在進行時,其他事物在幹嘛呢?嚴格來講並沒有要求,但一般都處於 等待 狀態,因為後面事物的正常進行都需要依賴前面事物...