IO模式:對于一次IO操作食磕,數(shù)據(jù)會先被拷貝到操作系統(tǒng)內(nèi)核緩沖區(qū),然后從操作系統(tǒng)內(nèi)核緩沖區(qū)再拷貝到應用程序內(nèi)存空間檩淋。當一個IO操作發(fā)生時會發(fā)生兩個階段:1芬为、等待數(shù)據(jù)準備,2蟀悦、將數(shù)據(jù)從內(nèi)核拷貝到進程中媚朦。因為這兩個階段Linux系統(tǒng)產(chǎn)生了五種網(wǎng)絡(luò)模式方案:
1、阻塞IO:在數(shù)據(jù)準備階段日戈,用戶進程會被阻塞询张,一直等到數(shù)據(jù)的到來。知道數(shù)據(jù)到來并被拷貝到用戶內(nèi)存后該阻塞才會解除
2浙炼、非阻塞IO:數(shù)據(jù)還未準備好的時候會立刻返回error份氧,用戶進程收到error時就知道數(shù)據(jù)還未準備好,于是可再次發(fā)起改操作弯屈。當數(shù)據(jù)準備好后就馬上拷貝到用戶內(nèi)存并返回結(jié)果
3蜗帜、IO多路復用:多路IO復用有三種模式select、poll资厉、epoil厅缺,有些地方也稱這種模式為事件驅(qū)動IO。select、epoil的好處在于單個進程就可以同時處理多個網(wǎng)絡(luò)鏈接的IO.它的基本原理是select湘捎、poll诀豁、epoil這個方法會不斷的輪詢所負責的所有socket,當某個socket有數(shù)據(jù)到達了就通知用戶進程窥妇。當用戶進程調(diào)用了select舷胜,進程就會阻塞,同時kemel會監(jiān)聽所有select負責的socket活翩,當任何一個socket的數(shù)據(jù)準備好了烹骨,select就會返回,這個時候用戶再調(diào)用時間操作將數(shù)據(jù)從kemel拷貝到用戶進程纱新。IO多路復用的特點是通過一種機制一個進程能同時訪問多個文件描述符展氓,而這些文件描述符中的其中任意一個進入就緒狀態(tài)穆趴,select函數(shù)就可以返回
4锈麸、信號驅(qū)動IO
5坞靶、異步IO:當用戶發(fā)起一個操作后就立即去做其他事情了,內(nèi)核會等待、檢測數(shù)據(jù)直到數(shù)據(jù)準備完成第晰,然后將數(shù)據(jù)拷貝到用戶內(nèi)存(無需先拷貝到內(nèi)核緩沖區(qū)),這一切完成后會給用戶進程發(fā)送一個信號告知操作完成了
阻塞IO纠吴、非阻塞IO茬腿、多路復用IO都是同步IO,都需等待將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶內(nèi)存化戳,會阻塞進程单料。異步IO是異步IO
事件驅(qū)動模型:當有一個事件(如鼠標點擊)發(fā)生時,會將該事件放入一個消息隊列点楼,不斷循環(huán)處理隊列中的事件扫尖,遵循先進先出的原則,該事件中包含其處理函數(shù)的指針掠廓,所以可根據(jù)事件調(diào)用其對應的處理函數(shù)换怖。
常見的編程范式:單線程、多線程蟀瞧、事件驅(qū)動編程