作業系統(二) IO模型 同步非同步 epoll

2021-09-28 12:22:27 字數 2549 閱讀 4891

1、五種i/o模型

任何i/o過程都包含了等待和拷貝兩個步驟;等待發生阻塞,準備就緒就執行拷貝。

準備就緒含義:核心將資料拷貝到使用者空間(緩衝區)

(1)阻塞式i/o

應用程式一旦呼叫了乙個i/o函式,要一直等待資料從核心拷貝到使用者空間(緩衝區)完成,收到返回資料,在完成之前程序會一直阻塞。(必須等到返回才能進行下一步)

(2)非阻塞式i/o

非阻塞式會立即返回,應用程式呼叫了乙個i/o函式,程序不斷詢問核心資料是否就緒,並返回(-1表示錯誤未完成,0表示正常斷開,正數表示已讀取資料),未就緒就執行其他。

(3)訊號驅動io

當核心資料準備就緒時,傳送乙個sigio訊號,應用程式收到sigio訊號進行讀取資料操作。

(4)i/o多路復用

i/o是指的我們裝置i/o;

多路指多個網路連線(socket);

復用指共用乙個或少量執行緒;

i/o多路復用就是很多個網路i/o請求共用乙個程序來處理這些連線。

乙個程序可以監視多個描述符,一旦某個描述符就緒,應用程式進行讀寫操作。

檔案描述符(fd)是核心建立的已開啟檔案的索引,是乙個非負整數,代表被開啟的檔案(檔案的id)。

(5)非同步i/o

前面4種方式屬於同步i/o。

非同步i/o是當使用者發起i/o請求,會立即返回,不需要去頻繁詢問資料是否準備就緒;核心會在準備就緒後傳送乙個訊號,應用程式收到這個訊號再去讀取。非同步i/o整個過程沒有程序被阻塞。

2、同步與非同步、阻塞與非阻塞

同步是按照順序一件一件的去完成,一件事情沒有返回結果之前,不會執行下一件。

比如a、b兩程序都要使用某資源,a程序正占用資源,那麼b程序必須等a使用完才能訪問資源,b等待時為阻塞狀態。

非同步是互相不影響,乙個程序的執行過程不受另乙個程序影響。

同步與非同步區別是訪問資料時是否會發生阻塞。

阻塞是指呼叫返回結果之前,程序會被掛起等待,此時為阻塞狀態。

非阻塞與阻塞對應,不能立刻返回結果時,程序不會阻塞,而是立刻返回。

阻塞與非阻塞區別為是否立刻返回結果。

3、select、poll、epoll區別

linux系統下i/o多路復用的系統呼叫有select、poll、epoll三種方式。

檔案描述符(fd)是核心建立的已開啟檔案的索引,是乙個非負整數,代表被開啟的檔案(檔案的id)。

區別:(1)檔案描述符數量(最大連線數)

select開啟的檔案數受限制,最大2048(fd_setsize設定);

poll沒有上限(基於鍊錶儲存的);

epoll也沒有上限。

(2)操作效率

select每次只是通知需要處理,具體位置需要通過遍歷的方式(輪詢機制)查詢檔案描述符(fd)的i/o是否就緒,時間複雜度o(n)。

poll和select一樣,也是需要遍歷的方式(輪詢機制)查詢,時間複雜度o(n)。

epoll只對活躍的描述符佇列進行操作,不需要遍歷,時間複雜度o(1)。

(3)拷貝

select需要將fd集合從使用者空間拷貝到核心空間;

poll也需要將fd集合從使用者空間拷貝到核心空間;

epoll的使用者空間和核心空間利用mmap()對映來共享記憶體,避免不必要拷貝。

4、使用者態和核心態

使用者態: 只能受限訪問記憶體, 且不允許訪問外圍裝置。占用的cpu資源可以被其他程式剝奪。(非特權指令——應用程式)

核心態: cpu可以訪問記憶體所有資料, 包括外圍裝置, cpu也可以將自己從乙個程式切換到另乙個程式。( 特權指令——核心程式)

為什麼要有使用者態和核心態?

由於需要限制不同程式的訪問許可權, 防止越界獲取記憶體資料, cpu劃分出兩個許可權等級——使用者態和核心態。

使用者態與核心態的切換:

使用者態切換到核心態的唯一途徑——>中斷/異常/陷入

核心態切換到使用者態的途徑——>設定程式狀態字

5、epoll水平觸發和邊緣觸發

linux系統下的i/o多路復用中有水平觸發和邊緣觸發兩種模式。

水平觸發(lt):epoll的預設工作方式。

epoll_wait()檢測到檔案描述符fd準備就緒,觸發通知,可以不立即處理,如果不執行,下次繼續通知處理。

如果沒有把資料一次性讀寫完(如讀寫緩衝區太小),下次呼叫 epoll_wait(),會通知上次沒讀寫完的檔案描述符繼續讀寫。

邊緣觸發(et):epoll的高速工作方式。

epoll_wait()檢測到檔案描述符fd狀態發生改變,觸發通知,執行後返回(需要立即處理)。

如果沒有把資料一次性讀寫完(如讀寫緩衝區太小),下次呼叫epoll_wait(),不會通知上次沒讀寫完,直到該檔案描述符狀態發生改變才會通知。

作業系統IO模型

目前io模型主要經歷了以下五種 1 阻塞io 2 非阻塞io 3 io復用 select和poll 4 訊號驅動io sigio 5 非同步io aio 核心空間和使用者空間 由於作業系統都包括核心空間和使用者空間 或者說核心態和使用者態 核心空間主要存放的是核心 和資料,是供系統程序使用的空間。而...

Windows作業系統網路I O模型

window 下的套接字以來兩種方式執行i o操作,阻塞io 非阻塞io,一般預設使用的是阻塞io 即執行緒會等待不會把控制權利立刻返回給程式,這就意為乙個執行緒在某乙個時候只能夠去執行乙個io操作。如果服務端想和多個客戶端同時進行通訊的話就要使用多執行緒程式設計,但是會增加開銷,如果採用非阻塞io...

作業系統 同步 非同步 阻塞 非阻塞

同步 非同步,阻塞 非阻塞分別是什麼?本篇文章想簡單談談.當請求乙個方法時,呼叫者需要等待該方法執行完成,且該方法會返回執行結果,則對於呼叫者來說就是 同步 的.當請求乙個方法時,呼叫者不需要等待該方法執行完成,該方法被呼叫後會立即返回,注意該方法返回的不是執行結果,比如返回none null 則對...