個人關於NIO的理解

2021-08-21 20:52:31 字數 1885 閱讀 1823

一、同步、非同步、阻塞、非阻塞的聯絡和區別

同步和非同步是針對於應用程式和核心的互動而言的,阻塞和非阻塞是針對使用者程序訪問資料而言的。

同步:使用者程序觸發io操作後,就一直等待或者輪詢直到io操作完成。

非同步:使用者程序觸發io操作後,就可以開始做自己的事,等到io完成後會收到乙個通知。

阻塞:讀取資料時,如果沒有資料可讀,就一直等待知道有資料可以讀取。

非阻塞:讀取資料時,沒有資料可讀,就立刻返回。

二、nio的產生

剛剛我們闡述了同步、非同步、阻塞、非阻塞。這是理解io與nio的基礎。

io是乙個同步阻塞的io。由於同步阻塞,則在io操作時,我們也不能做其他事情。很浪費資源。而且,傳統io是針對鏈結的,而nio可以針對事件(因為傳統io麼有select函式)。針對鏈結,意味著,乙個鏈結要對應乙個執行緒,鏈結中的事情沒做完,執行緒不退出,100個鏈結就有100個執行緒維護著。考慮用執行緒池可以減少執行緒建立與銷毀咯。但是如果執行緒池支援的最大連線數是100,那101個請求過來的時候,就沒法接受啊,因為面向鏈結的力度太大了,很多事情都在要乙個鏈結裡完成,那麼這個鏈結肯定非常耗時。比如乙個連線裡有鏈結、讀取、寫入操作吧。這個連線的建立到結束的週期肯定很長。

那如果用nio,有select,所以可以針對事件處理,就相當於把乙個鏈結拆成好幾個等分,那處理每個等分的時間肯定相對於要少一點。如上例,可以把乙個連線拆成鏈結、讀取、寫入操作。那麼針對這些細力度的事件,處理時間肯定較少了,使執行緒的職責更加單一簡單。你是想讓100個吃飯,另外200個人就看著。還是讓300個人輪流著一人吃一點呢?

三、nio的核心要素與io的區別。

首先說一下io與nio的區別

io

nio

面向流

面向緩衝

阻塞

非阻塞

選擇器

接下來說一下nio的核心:

channel

buffer

select

nio的所有讀寫都需先讀寫到buffer裡,而buffer裡是由capacity、limit、postion三個位置指標維護,有這三個指標可以對buffer做很多操作,使處理更加靈活。而io面向流,一次讀取乙個字元或乙個位元組,直到讀完。其次,io流是單向的,所以有inputstream和outputstream,而nio是使用channel對緩衝進行讀寫,這個channel是雙向的。最後nio有選擇器,選擇器的優勢就不談了。在nio的產生裡說得很清楚了。

四、reactor和proactor

reactor的基礎是nio,proactor的基礎是aio。所以reactor更關注與事件的產生,而proactor更關注事件的完成。例如前者收到乙個讀取事件,則在程式中維護讀取事件的全過程。而proactor則收到乙個讀取完成時間,只要維護讀取完成後的操作即可。資料的讀取是先由硬碟讀到快取的,再由快取讀到程式。那reactor則維護了全過程,proactor只需要維護讀取到快取後的工作即可。

關於NIO的學習理解

全稱new input output。針對於檔案系統的io,提供記憶體對映以提高io效率 對於網路io,提供乙個執行緒可以管理多個連線的能力。針對於本地檔案系統,不支援選擇通道 io多路復用。檔案要被應用所訪問到,路徑為 磁碟 核心空間 使用者空間,磁碟到核心空間有乙個dma控制器,dma控制器從磁...

關於NSRunloop的個人理解

今天看到了nsrunloop,其實之前也有看了關於nsrunloop的內容,在這裡想簡單的就個人的理解總結一下。其實自己在開發的過程當中,還沒有更多的涉及到nsrunloop的功能。總的來說,nsrunloop就是類似於windows的訊息機制。他的存在是給執行緒增加事件處理機制。對於多執行緒開發而...

個人關於指標的理解

指標是什麼?如何理解指標?因為指標是抽象的,所以這裡我把它擬物化,這樣解釋也許跟容易懂。指標的專業解釋是 指標是記憶體單元的編號。說明 以下的黑方框都代表乙個位元組 1 對於記憶體。我們一般認為記憶體的基本單位是位元組,記憶體空間由很多位元組組成的。記憶體可以儲存資料,所以我們把每個位元組當做是乙個...