當前位置:編程學習大全網 - 源碼破解 - 操作系統IO機制

操作系統IO機制

身處不同的學習階段時,總會對不同的知識有不同的理解,最近感慨其實計算機就是在計算和IO這兩件事情上反復執行,最後完成壹系列指令,雖然之前寫過壹篇NIO epoll的文章,但這裏還是專門為操作系統的IO機制開辟壹篇專欄,壹起再來整理壹下IO這壹重要事件的機制。

網上講這塊的內容很多,爛熟的燒開水例子相信大家都不陌生,總之,說同步和異步時,需要肯定的是這兩個概念說明的是多個事物的狀態,而不是單個事物的狀態,多個事物串行,但每次只執行壹個事物,這樣的狀態稱為 同步 ,至於其他事物壹般來說都是在等待著的狀態,可以聯系的生活中的場景有排隊買票等;異步與同步是相反的狀態, 異步 是指,多個事物可以互不幹擾的同時進行,比如地鐵閘機口可以允許多人在多個通道同時通過壹樣。

這兩個也是相反的狀態,其實從字面意思已經看出十之八九, 阻塞 指的是線程在調用某方法的時候會被掛起,等到g方法返回結果時才會恢復運行; 非阻塞 指的是線程在調用某方法時立即返回壹個信號,但這個信號不是方法的結果,它是壹個僅僅表示調用方法的返回值,在等待方法執行的過程中,該線程還可以繼續去幹其他事情。

綜上所述,同步與異步關心的點在於能否同時進行,阻塞與非阻塞關心的點在於是否需要等待。

IO就是數據的讀出和寫入的過程及等待數據讀出和寫入的過程,註意哦,這裏我們還是要強調壹下,IO不僅包括數據讀出寫入的過程,還包括等待數據讀出和寫入的過程,但還需牢記,壹旦數據讀出寫入完成,剩下的操作數據的過程不屬於IO的範圍。

在Linux系統中,我們常見的IO機制有以下幾種:

阻塞IO

非阻塞IO

多路復用IO

異步IO

結合以上說的概念,再延伸壹下, 阻塞IO 指的是應用程序發出壹個阻塞系統的調用時,在等待數據到達用戶空間的過程中,應用程序的執行被掛起,應用程序從操作系統的運行隊列加入等待隊列,等到系統調用完成後,應用程序移回到運行隊列中。

非阻塞IO,按上面說的IO的兩個過程細分壹下,等待數據到達用戶空間(非阻塞)及在用戶空間發生拷貝(阻塞)的這兩個過程中,所以非阻塞IO主要是說明,用戶進程不會阻塞於等待數據達到用戶空間的過程中,此時它會多次發起系統調用,並馬上返回錯誤的結果,直到數據到達用戶空間會返回OK,然後繼續執行拷貝,但拷貝的過程是阻塞的。所以這種方式嚴格壹點來說,並不能將全部的過程都稱為非阻塞IO,這種輪詢的方式,會消耗CPU資源。

多路復用其實是壹種同步非阻塞的IO方式,epoll就是多路復用的典型,多路復用從select、poll、epoll壹路進階,詳細的過程可以看專門寫epoll的那篇文章,總之它的過程就是用戶進程在等待數據到達用戶空間的過程中,epoll會監聽所有的socket,用戶進程也會加入epoll的等待隊列,當某壹個socket接收數據,epoll會把收到數據的socket加入自己的list,從而得知是具體的哪個socket收到了數據,並喚醒等待這個socket的進程,不知道在我剛剛的描述中,妳是否能感受到多路復用的好處,epoll相比select的好處是無需去輪詢,但在等待數據到達的這個過程,還是壹個阻塞的狀態。以上過程中有壹點要 註意 ,對於用戶進程來說,在等待數據到用戶空間的過程中,其實它是阻塞於epoll的,它要等待epoll獲悉具體的某壹個socket收到數據後喚醒它;但對於socket來說,數據從網絡傳遞進來需要壹個過程,它等待數據的過程中,沒有阻塞掛起,是非阻塞的。所以我們說的多路復用是壹直同步非阻塞的方式,如果從用戶進程的角度來說,好像不夠嚴謹。

通過以上這些過程也能發現,阻塞IO,用戶程序在等待IO及拷貝的過程是線程掛起的,相當於就還是只能允許壹個線程的進行,所以阻塞IO無論如何都是同步的。

異步IO使用率不如之前的高,所以在這裏簡單的說壹下,它不難理解,總是還是按照我們說的那兩個過程去看,在等待數據到達的過程及數據拷貝的過程,用戶進程都不會死等阻塞,而是去幹自己的事情,當數據完成從內核空間到用戶空間的拷貝後,才會通知用戶進程。這樣看來,異步IO都是非阻塞的。

非阻塞和異步IO,甚至會認為非阻塞就是異步了,其實不然,壹次IO操作分兩個階段,第壹階段是等待數據,第二階段是拷貝數據(內核到用戶空間),非阻塞IO操作在數據還沒有到達時是立即返回的,這壹點表現的跟異步壹樣,但是在第二個階段,當數據準備妥當的時候,非阻塞IO是阻塞的,直到數據拷貝完成,這壹點表現的與異步IO完全不壹樣,異步根本不關心妳的數據是否到達以及妳的數據是否拷貝完成,異步發起壹次IO操作後就去幹別的事兒了,直到內核發出壹個信號通知這壹事件,它才會轉回來繼續處理。

IO過程主要有兩個部分:等待數據(比如從網卡到達內核空間)、讀寫數據(從內核空間拷貝到用戶空間),前三種關於阻塞IO和非阻塞IO的劃分,主要是針對等待數據這個過程而言,因為從內核空間拷貝到用戶空間的這個過程它們都是阻塞的。異步IO不會引起用戶進程的阻塞。

  • 上一篇:刷新3+7刷墻哪壹集
  • 下一篇:穿越火線我有3000CF可以幹什麽
  • copyright 2024編程學習大全網