<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            操作系統

            IO的阻塞與非阻塞操作系統

            時間:2025-05-30 13:58:31 操作系統 我要投稿
            • 相關推薦

            IO的阻塞與非阻塞操作系統

              所謂IO的阻塞與非阻塞,是指當進行IO操作時,需要的資源不可用,這時程序的表現。阻塞IO將讓程序處于等待狀態,指導需要的資源可用;而非阻塞IO將直接返回,不等需要的資源可用。

              目前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的方式。

              所謂IO的阻塞與非阻塞,是指當進行IO操作時,需要的資源不可用,這時程序的表現。阻塞IO將讓程序處于等待狀態,指導需要的資源可用;而非阻塞IO將直接返回,不等需要的資源可用。

              3、IO復用 我們常用到的IO復用,主要是select和poll。這里同樣是會阻塞進程的,但是這里進程是阻塞在select或者poll這兩個系統調用上,而不是阻塞在真正的IO操作上。 另外還有一點不同于阻塞IO的就是,盡管看起來與阻塞IO相比,這里阻塞了兩次,但是第一次阻塞在select上時,select可以監控多個套

              接口上是否已有IO操作準備就緒的,而不是像阻塞IO那種,一次性只能監控一個套接口。

              4、信號驅動IO 信號驅動IO就是說我們可以通過sigaction系統調用注冊一個信號處理程序,然后主程序可以繼續向下執行,當我們所監控的套接口有IO操作準備就緒時,由內核通知觸發前面注冊的信號處理程序執行,然后將我們所需要的數據從內核空間拷貝到用戶空間。

              所謂IO的阻塞與非阻塞,是指當進行IO操作時,需要的資源不可用,這時程序的表現。阻塞IO將讓程序處于等待狀態,指導需要的資源可用;而非阻塞IO將直接返回,不等需要的資源可用。

              5、異步IO 異步IO與信號驅動IO最主要的區別就是信號驅動IO是由內核通知我們何時可以進行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定義所匹配。

            【IO的阻塞與非阻塞操作系統】相關文章:

            關于Java中的阻塞隊列05-28

            護士資格教材考點:慢性阻塞性肺疾病病人護理09-03

            臨床助理醫師《呼吸系統》考點:慢性阻塞性肺疾病10-28

            2017醫學理論病理學考點:慢性阻塞性肺氣腫09-09

            2017中醫助理醫師考試《內科學》之慢性阻塞性肺疾病08-22

            linux查看磁盤io的方法是什么10-29

            國產操作系統典范:deepin操作系統08-21

            操作系統的種類07-07

            LINUX操作系統09-19

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看