作業系統IO模型

2021-06-28 03:53:45 字數 2221 閱讀 8163

目前io模型主要經歷了以下五種:

1)阻塞io

2)非阻塞io

3)io復用(select和poll)

4)訊號驅動io(sigio)

5)非同步io(aio_)

核心空間和使用者空間:

由於作業系統都包括核心空間和使用者空間(或者說核心態和使用者態),核心空間主要存放的是核心**和資料,是供系統程序使用的空間。而使用者空間主要存放的是使用者**和資料,是供使用者程序使用的空間。目前linux系統簡化了分段機制,使得虛擬位址與線性位址總是保持一致,因此,linux系統的虛擬位址也是0~4g。linux系統將這4g空間分為了兩個部分:將最高的1g空間(從虛擬位址0xc0000000到0xffffffff)供核心使用,即為「核心空間」,而將較低的3g空間(從虛擬位址 0x00000000到0xbfffffff)供使用者程序使用,即為「使用者空間」。同時由於每個使用者程序都可以通過系統呼叫進入到核心空間,因此linux的核心空間可以認為是被所有使用者程序所共享的,因此對於乙個具體使用者程序來說,它可以訪問的虛擬記憶體位址就是0~4g。另外linux系統分為了四種特權級:0~3,主要是用來保護資源。0級特權最高,而3級則為最低,系統程序主要執行在0級,使用者程序主要執行在3級。

一般來說,io操作都分為兩個階段,就拿套介面的輸入操作來說,它的兩個階段主要是:

1)等待網路資料到來,當分組到來時,將其拷貝到核心空間的臨時緩衝區中

2)將核心空間臨時緩衝區中的資料拷貝到使用者空間緩衝區中

1、阻塞io

預設情況下,所有套介面都是阻塞的。

假如recvfrom函式是乙個系統呼叫:

說明:任何乙個系統呼叫都會產生乙個由使用者態到核心態切換,再從核心態到使用者態切換的過程,而程序上下文切換是通過系統中斷程式來實現的,需要儲存當前程序的上下文狀態,這是乙個極其費力的過程。

2、非阻塞io

當我們把套介面設定成非阻塞時,就是由使用者程序不停地詢問核心某種操作是否準備就緒,這就是我們常說的「輪詢」。這同樣是一件比較浪費cpu的方式。

3、io復用

我們常用到的io復用,主要是select和poll。這裡同樣是會阻塞程序的,但是這裡程序是阻塞在select或者poll這兩個系統呼叫上,而不是阻塞在真正的io操作上。

另外還有一點不同於阻塞io的就是,儘管看起來與阻塞io相比,這裡阻塞了兩次,但是第一次阻塞在select上時,select可以監控多個套介面上是否已有io操作準備就緒的,而不是像阻塞io那種,一次性只能監控乙個套介面。

4、訊號驅動io

訊號驅動io就是說我們可以通過sigaction系統呼叫註冊乙個訊號處理程式,然後主程式可以繼續向下執行,當我們所監控的套介面有io操作準備就緒時,由核心通知觸發前面註冊的訊號處理程式執行,然後將我們所需要的資料從核心空間拷貝到使用者空間。

5、非同步io

非同步io與訊號驅動io最主要的區別就是訊號驅動io是由核心通知我們何時可以進行io操作了,而非同步io則是由核心告訴我們io操作何時完成了。具體來說就是,訊號驅動io當核心通知觸發訊號處理程式時,訊號處理程式還需要阻塞在從核心空間緩衝區拷貝資料到使用者空間緩衝區這個階段,而非同步io直接是在第二個階段完成後核心直接通知可以程序後續操作了。

綜上所述,我們發現 前四種io模型的主要區別是在第一階段,因為它們的第二階段都是在阻塞等待資料由核心空間拷貝到使用者空間;而非同步io很明顯與前面四種有所不同,它在第一階段和第二階段都不會阻塞。具體參考如下:

最後,總結下同步io與非同步io的區別:

1)同步io操作會引起程序阻塞直到io操作完成。

2)非同步io操作不引起程序阻塞。

因此,由上面定義可以看出,阻塞io、非阻塞io、io復用、訊號驅動io都是屬於同步io,而非同步io模型才與非同步io定義所匹配。

Windows作業系統網路I O模型

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

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

1 五種i o模型 任何i o過程都包含了等待和拷貝兩個步驟 等待發生阻塞,準備就緒就執行拷貝。準備就緒含義 核心將資料拷貝到使用者空間 緩衝區 1 阻塞式i o 應用程式一旦呼叫了乙個i o函式,要一直等待資料從核心拷貝到使用者空間 緩衝區 完成,收到返回資料,在完成之前程序會一直阻塞。必須等到返...

作業系統之IO

io 是指作業系統內部的通訊流,用來提供不同模組的溝通 硬體層面 在硬體層面如何連線不同的模組,這裡採用主從模式,即有乙個mmu管理中心負責與其他硬體連線,然後cpu 記憶體與該mmu管理中心連線,通過這種方式 使得cpu 記憶體與計算機硬體隔離開來,後續的迭代維護不會影響到cpu和記憶體 計算機硬...