天天看點

linux核心分析--異步io(三)

使用者建立了異步io環境,并且送出了異步io請求,該做的都做了,剩下的就是結果了,人生漂泊,有因無果,結果真的重要嗎?務實一點說,重要,真正不在乎結果的人又有幾個呢?人尤如此,核心就更不用說了,我拿到錢大把大把的花,等到請客吃飯時,囊中羞澀,這也是一種務實--肥水不流外人田;我有了時間,大把大把浪費,等到考試或考核時,總在呐喊:再多一秒吧!linux核心是這樣的嗎?很抱歉,不是!我覺得它是世界上最吝啬的了,不花一分冤枉錢,啥時候 windows也能這麼吝啬就好了,我們就不用攢幾個月的工資來買一塊顯示卡僅僅為了玩一個幾個月後就過時的遊戲了,君不見Linux跑在奔二128m記憶體 機器上,天馬行空,windows在酷睿1g記憶體機器依然蠕動,鈔票啊!好了,不扯犢子了,第三場,開始! 

為了得到結果,使用者應該調用io_getevents庫函數,該函數進行sys_io_getevents系統調用,實際上不用分析代碼也能猜個八九不離十,但是分析該系統調用前,必須先看一眼aio_complete函數,畢竟,得有人把資料放到一個地方你才可以讀,而aio_complete函數就是 做這個的:

unsigned long tail; 

int ret; 

return 1; 

goto put_rq; 

tail = 0; 

put_rq: 

/* everything turned out well, dispose of the aiocb. */ 

if (ret) 

return ret; 

long min_nr, 

///////// 

int retry = 0; 

retry: 

ret = 0; 

break;

/* Could we split the check in two? */ 

break; 

/* Good, event copied to userland, update counts. */ 

retry = 1; 

goto retry; 

do { 

if (to.timed_out) /* Only check after read evt */ 

/*ret = aio_read_evt(ctx, &ent);*/ 

} while (1) ; 

int ret = 0; 

ret = 1; 

… 

這下脈絡就很清晰了,到這裡我想到了一些東西,我讀核心的過程中發現,核心函數基本可以分為兩種,一種為管理函數,一種為操作函數,管理函數主要涉及到很多很複雜的資料結構,可謂變态級别,而操作函數一般一目了然,比如寫寄存器,就一個writeX函數,由此想到了我們的社會何嘗不是如此,管理機關機構臃腫,人員閑雜,而勞動人民則是那麼的淳樸...... 

願好人一生平安!

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274054

繼續閱讀