版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第13章I/O操作模式內(nèi)容提要
/O操作模式概述
POSIX異步I/OLinux本地異步I/O異步I/O信號驅(qū)動I/O多路復(fù)用高性能I/O事件驅(qū)動13.1I/O操作模式I/O操作模式概述
在Linux系統(tǒng)中,文件作為一個泛化的概念,廣泛存在于系統(tǒng)。雖然為文件定義了標準的I/O操作集,但具體實現(xiàn)取決于文件,不同類型的文件具有不同的行為特征。,它們實現(xiàn)的操作集也可能有所不同,如,具有異步特性的網(wǎng)絡(luò)套接字,慢速的磁盤設(shè)備等。當進程需要同時處理多個文件I/O時,基于阻塞的處理方式具有一定的局限性,為此,內(nèi)核提供了多種非阻塞的處理方法。阻塞與非阻塞
從用戶的角度,對于向內(nèi)核發(fā)起的I/O請求,發(fā)起者是否需要等待請求的完成,可將I/O模式分為阻塞與非阻塞。若發(fā)起者等待,直至I/O請求完成,則稱為I/O阻塞模式;若無論I/O請求是否完成,發(fā)起者立即返回,則稱為I/O非阻塞模式。同步與異步
從內(nèi)核的角度,對于發(fā)起的I/O請求,內(nèi)核是否需要發(fā)起者等待請求的完成,可將I/O模式分為同步I/O模式和異步I/O模式。若內(nèi)核需發(fā)起者等待,直至I/O請求完成,則稱為I/O同步模式。若內(nèi)核無須發(fā)起者等待,I/O請求完成時,內(nèi)核以某種方式通知發(fā)起者,期間發(fā)起者可繼續(xù)執(zhí)行后續(xù)操作,則稱為I/O異步模式。異步I/O模式
對于需在一個進程中同時監(jiān)聽多個文件的I/O狀態(tài),內(nèi)核提供了多種異步I/O處理模式,它們通常采用非阻塞模式。這些異步I/O方法包括。POSIX異步I/O本地異步I/O異步I/O信號驅(qū)動I/O多路復(fù)用高性能I/O事件驅(qū)動應(yīng)用編程接口分類接口函數(shù)功能描述POSIX異步I/Oaio_read發(fā)起異步讀請求aio_write發(fā)起異步寫請求lio_listio提交多個異步I/O請求aio_cancel試圖取消異步I/O請求aio_return返回已完成的I/O狀態(tài)aio_error獲得異步I/O錯誤信息Linux本地異步I/Oio_setup創(chuàng)建異步I/O環(huán)境io_submit提交異步I/O請求io_getevents獲取已完成異步I/O請求io_cancel取消一個未完成的異步IO操作io_destro注銷異步I/O環(huán)境I/O多路復(fù)用select同時監(jiān)聽多個文件的I/O狀態(tài)poll同時監(jiān)聽多個文件的I/O狀態(tài)高性能I/O事件驅(qū)動epoll_create創(chuàng)建epoll環(huán)境epoll_ctl設(shè)置監(jiān)聽對象epoll_wait等待epoll實例上產(chǎn)生的I/O就緒事件13.2POSIX異步I/OPOSIX異步I/O概述POSIX為程序員提供了一組異步I/O編程接口,允許向內(nèi)核發(fā)起一個或多個異步I/O請求,發(fā)起者無須等待I/O操作完成,繼續(xù)執(zhí)行后續(xù)操作,當異步I/O操作完成,內(nèi)核以某種方式通知發(fā)起者,例如,發(fā)送信號或啟動線程等。Linux異步I/O的實現(xiàn)
POSIX異步I/O在Linux系統(tǒng)中以glibc函數(shù)庫方式實現(xiàn),由于早期的內(nèi)核不支持異步I/O,glibc利用線程處理異步I/O請求;自內(nèi)核2.6起引入一組本地異步I/O系統(tǒng)調(diào)用接口,glibc對原異步I/O處理進行了重構(gòu),從根本上提高了異步I/O性能。值得注意的是,POSIX異步I/O僅適用于磁盤文件系統(tǒng)。發(fā)起異步讀/寫請求1.aio_read/aio_write函數(shù)頭文件
#include<aio.h>函數(shù)原型
int
aio_read(struct
aiocb*aiocbp)
int
aio_write(struct
aiocb*aiocbp)功能 發(fā)起異步讀/寫請求。參數(shù)
aiocbp:I/O請求。返回值 成功返回0,失敗返回-1。發(fā)起異步讀/寫請求(續(xù))(1)異步I/O請求struct
aiocb{
int
aio_fildes; //文件描述符
volatilevoid*aio_buf;//緩沖區(qū)地址
size_t
aio_nbytes; //讀/寫數(shù)據(jù)的字節(jié)數(shù)
off_t
aio_offset; //文件偏移量
int
aio_reqprio; //請求優(yōu)先級
struct
sigevent
aio_sigevent;//通知方式
int
aio_lio_opcode; //僅適用于lio_listio函數(shù)};(2)通知方式struct
sigevent{
int
sigev_notify;//通知方法
int
sigev_signo;//信號編號
unionsigval
sigev_value;//傳遞的數(shù)據(jù)
void(*sigev_notify_function)(unionsigval);//線程函數(shù)
void*sigev_notify_attributes;//線程屬性
pid_t
sigev_notify_thread_id;//線程ID};一次提交多個異步I/O請求2.lio_listio函數(shù)頭文件
#include<aio.h>函數(shù)原型
int
lio_listio(int
mode,struct
aiocb*constaiocb_list[],int
nitems,struct
sigevent*sevp);功能 一次提交多個異步I/O請求。參數(shù)
mode:提交模式。
aiocb_list:請求數(shù)組。
nitems:請求數(shù)量。
sevp:通知方式。返回值 所有I/O成功提交返回0,失敗返回-1。取消已提交的異步I/O請求3.aio_cancel函數(shù)頭文件
#include<aio.h>函數(shù)原型
int
aio_cancel(int
fd,struct
aiocb*aiocbp);功能 取消已提交的異步I/O請求。參數(shù)
fd:文件描述符。
aiocbp:異步I/O請求。返回值 若返回AIO_CANCELED,請求全部被取消。獲取異步I/O的返回值4.aio_return函數(shù)頭文件
#include<aio.h>函數(shù)原型
ssize_t
aio_return(struct
aiocb*aiocbp);功能 獲取異步I/O的返回值。參數(shù)
aiocbp:異步I/O請求。返回值
I/O請求完成,返回異步處理的字節(jié)數(shù)。
I/O請求失敗,返回-1。獲取異步I/O請求的當前狀態(tài)5.aio_error函數(shù)頭文件
#include<aio.h>函數(shù)原型
int
aio_error(const
struct
aiocb*aiocbp);功能 獲取異步I/O請求的當前狀態(tài)。參數(shù)
aiocbp:異步I/O請求。返回值 若返回EINPROGRESS,表示正在處理。 若返回ECANCELED,表示異步操作被取消。 如返回0,表示異步操作已完成。 若返回值小于零,表示發(fā)生錯誤。13.3Linux本地異步I/O本地異步I/O概述
為了提高磁盤I/O請求的處理效率,Linux自內(nèi)核2.6起,引入一組非標準化的本地異步I/O接口。該組接口是glibc構(gòu)造POSIX異步I/O的基礎(chǔ)。它由5個系統(tǒng)調(diào)用組成,glibc未對它們進行封裝,但可借助syscall函數(shù)實現(xiàn)對它們的訪問。創(chuàng)建/注銷異步I/O上下文頭文件
#include<linux/aio_abi.h>函數(shù)原型
io_setup(unsigned
nr_events,aio_context_t*ctx_idp);
int
io_destroy(aio_context_t
ctx_id);功能 創(chuàng)建/注銷異步I/O上下文。參數(shù)
nr_events:容納異步I/O請求的最大數(shù)量。
ctx_idp:異步I/O上下文。返回值 成功返回0,失敗返回非0。提交異步I/O請求頭文件
#include<linux/aio_abi.h>函數(shù)原型
longio_submit(aio_context_t
ctx_id,long
nr,struct
iocb**iocbpp)功能 提交異步I/O請求,參數(shù)
ctx_id:異步I/O上下文,
nr:異步I/O請求數(shù)量,
iocbpp:異步I/O請求數(shù)組,返回值 成功返回提交的請求數(shù),失敗返回非0,提交異步I/O請求(續(xù))struct
iocb{__u64aio_data;//自定義參數(shù)
__u16aio_lio_opcode;//操作類型,IO_CMD_PWRITE,IO_CMD_PREAD__s16aio_reqprio;//請求的優(yōu)先級
__u32aio_fildes;//文件描述符
__u64aio_buf;//數(shù)據(jù)緩存區(qū)
__u64aio_nbytes;//請求字節(jié)數(shù)
__s64aio_offset;//偏移量
...};取消已提交的異步IO請求頭文件
#include<linux/aio_abi.h>函數(shù)原型
int
io_cancel(aio_context_t
ctx_id,struct
iocb*iocb,struct
io_event*result);io_event*result)功能 取消已提交的異步IO請求。參數(shù)
ctx_id:異步I/O上下文。
iocb:異步I/O請求。
result:返回消息。返回值 成功返回0,失敗返回非0。獲取已完成的異步I/O事件頭文件
#include<linux/aio_abi.h>函數(shù)原型
longio_getevents(aio_context_t
ctx_id,longmin_nr,longnr,struct
io_event*events,struct
timespec*timeout)功能 獲取已完成的異步I/O事件。參數(shù)
ctx_id:異步I/O上下文。
min_nr:請求完成的最小數(shù)量。
nr:請求完成的最大數(shù)量。
events:完成的I/O事件。
timeout:超時時間。返回值 成功返回事件數(shù)量,失敗返回值在0至min_nr之間。獲取已完成的異步I/O事件(續(xù))struct
io_event{__u64data;//對應(yīng)iocb的aio_data
__u64obj;//產(chǎn)生event的iocb__s64res;//完成的字節(jié)數(shù)
__s64res2;//返回狀態(tài)};13.4異步I/O信號驅(qū)動異步I/O信號驅(qū)動概述
異步
I/O信號驅(qū)動是一種文件I/O狀態(tài)改變時的信號通知機制,默認向目標進程發(fā)送SIGIO信號。
對于I/O信號驅(qū)動的文件,通常設(shè)置為非阻塞模式,信號屬于邊緣觸發(fā)事件。
值得注意的是,并非所有文件都支持異步I/O信號。異步I/O信號的操作流程異步處理方式1.為文件定義I/O信號2.將文件設(shè)置為異步非阻塞模式3.設(shè)置信號的發(fā)送目標4.編寫信號的處理函數(shù)異步I/O信號的操作流程(續(xù))
同步處理方式1和2與異步處理方式相同。3.阻塞I/O信號4.以同步方式處理到達的I/O信號實時信號隊列的溢出處理
當眾多文件瞬間狀態(tài)發(fā)生改變時,內(nèi)核會產(chǎn)生大量I/O信號,即使使用了實時信號,也可能導(dǎo)致信號隊列溢出。當I/O信號溢出時,新產(chǎn)生的I/O信號恢復(fù)為SIGIO,在處理SIGIO信號時,可使用sigwaitipfo函數(shù)盡快處理等待的信號,繼而使用select/poll函數(shù)處理剩余的I/O事件。13.5I/O多路復(fù)用內(nèi)容提要1I/O多路復(fù)用概述基于select的I/O多路復(fù)用基于poll的I/O多路復(fù)用1I/O多路復(fù)用概述I/O多路復(fù)用是一種同時監(jiān)聽多個文件I/O狀態(tài)的技術(shù),當有文件I/O狀態(tài)發(fā)生改變時,以I/O事件方式通知監(jiān)聽者。事件的產(chǎn)生采用水平觸發(fā)模式,只要I/O狀態(tài)可用,就一直產(chǎn)生I/O事件。
Linux繼承了Unix的select和poll兩種I/O多路復(fù)用接口。基于select的I/O多路復(fù)用
處于歷史原因select監(jiān)聽的文件受1024數(shù)量的限制,每次監(jiān)聽前都需將觀察文件信息從用戶空間拷貝至內(nèi)核空間,監(jiān)聽時需掃描整個文件列表,以確定產(chǎn)生就緒I/O事件的文件,無疑增加了系統(tǒng)開銷。select函數(shù)頭文件
#include<sys/select.h> #include<sys/time.h>函數(shù)原型
int
select(int
nfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,struct
timeval*timeout);功能 同時監(jiān)聽多個文件的I/O狀態(tài)。參數(shù)
nfds:監(jiān)聽的最大文件描述符。readfds:可讀文件描述符集。
writefds:可寫的文件描述符集。exceptfds:例外文件描述符集。
timeout:超時時間。返回值
>0,返回就緒事件的數(shù)量。=0,等待超時。-1,錯誤?;趐oll的I/O多路復(fù)用poll也是被廣泛支持的I/O多路復(fù)用接口,功能與select相似,盡管poll對檢查的文件數(shù)量沒有限制,但每次監(jiān)聽仍需復(fù)制和掃描整個文件描述符。poll函數(shù)頭文件
#include<sys/poll.h>函數(shù)原型
intpoll(struct
pollfd*fds,unsignedint
nfds,inttimeout);功能 同時監(jiān)聽多個文件的I/O狀態(tài)。參數(shù)
fds:監(jiān)聽對象數(shù)組地址。
nfds:監(jiān)聽文件數(shù)量。
timeout:超時時間,單位毫秒。返回值 成功:發(fā)生就緒事件的文件數(shù)量失敗:-1。poll函數(shù)(續(xù))struct
pollfd{int
fd;//文件描述符shortevents;//關(guān)注的事件shortrevents;//已發(fā)生的事件};事件類型含義POLLIN有數(shù)據(jù)可讀POLLPRI高優(yōu)先級數(shù)據(jù)可讀POLLOUT有數(shù)據(jù)可寫POLLRDHUP套接字對端關(guān)閉,Linux內(nèi)核2.6.171版本之后POLLWRBAND優(yōu)先級數(shù)據(jù)可寫POLLERR發(fā)生錯誤POLLHUP發(fā)生掛起POLLNVAL文件描述符無效13.6高性能I/O事件驅(qū)動epoll概述
為了提高I/O多路復(fù)用的性能,Linux內(nèi)核自2.6起,引入了一種高性能異步I/O事件處理的本地化接口,稱為epoll
epoll是對傳統(tǒng)I/O多路復(fù)用的優(yōu)化和擴展,無須每次設(shè)置和掃描整個被監(jiān)聽的文件,僅需一次性將需監(jiān)聽的被文件描述符注冊至內(nèi)核,內(nèi)核使用紅黑樹管理監(jiān)聽的對象,將用戶緩存映射至內(nèi)核空間,提高了數(shù)據(jù)存取效率,使用鏈表管理產(chǎn)生的I/O就緒事件。事件觸發(fā)模式
epoll提供了水平觸發(fā)和邊緣觸發(fā)兩種事件觸發(fā)模式。1.水平觸發(fā)模式
只要文件的I/O狀態(tài)可用,便可產(chǎn)生對應(yīng)的I/O事件。2.邊緣觸發(fā)模式只有文件的狀態(tài)與上一次相比發(fā)生了改變,才產(chǎn)生相應(yīng)的I/O事件。創(chuàng)建epoll實例頭文件
#include<sys/epoll.h>函數(shù)原型
int
epoll_create(intsize);功能 創(chuàng)建epoll實例。參數(shù)
size:文件描述符的最大數(shù)量。返回值 成功返回rpoll文件描述符,失敗返回-1。設(shè)置監(jiān)聽對象頭文件
#include<sys/epoll.h>函數(shù)原型
int
epoll_ctl(int
epfd,int
op,int
fd,struct
epoll_event*event);功能 設(shè)置監(jiān)聽對象。參數(shù)
epfd:epoll實例。
Op:操作符。
fd:文件描述符。
event:事件。返回值 成功返回0,失敗返回-1。參數(shù)op定義EPOLL_CTL_ADD向epoll實例添加監(jiān)聽對象EPOLL_CTL_MOD修改epoll實例的監(jiān)聽對象EPOLL_CTL_DEL從epoll實例刪除監(jiān)聽對象epoll_ctl含住中參數(shù)op的定義I/O事件類型含義EPOLLIN接收到普通數(shù)據(jù)EPOLLPRI接收到緊急數(shù)據(jù)EPOLLRDHUP套接字對端關(guān)閉,Linux內(nèi)核2.6.171版本之后EPOLLOUT可以寫入數(shù)據(jù)EPOLLET邊緣觸發(fā)EPOLLLT水平觸發(fā),缺省模式EPOLLONESHOT只監(jiān)聽一次事件EPOLLERR當描述符發(fā)生錯誤,默認設(shè)置E
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版版權(quán)開發(fā)與運營合同
- 2025年勞動心得體會(3篇)
- 防汛抗旱工作方案模版(2篇)
- 二零二五年個人教育培訓(xùn)居間經(jīng)紀合同3篇
- 板式給料機安全操作規(guī)程(2篇)
- 2025年中層辦公室副主任競職演講稿(2篇)
- 飛力攪拌器操作維護規(guī)程模版(3篇)
- 設(shè)備部隱患排查職責(zé)范文(2篇)
- 2024年湖南省自然資源資產(chǎn)經(jīng)營有限公司招聘考試真題
- 2024年廈門市集美區(qū)康城幼兒園教職工招聘筆試真題
- 一年級數(shù)學(xué)練習(xí)題-20以內(nèi)加減法口算題(4000道)直接打印版
- 材料性能學(xué)智慧樹知到期末考試答案章節(jié)答案2024年南昌大學(xué)
- 數(shù)據(jù)中心供電系統(tǒng)應(yīng)用方案
- 中東及非洲注塑成型模具行業(yè)現(xiàn)狀及發(fā)展機遇分析2024-2030
- JGJ276-2012 建筑施工起重吊裝安全技術(shù)規(guī)范 非正式版
- QCT1067.4-2023汽車電線束和電器設(shè)備用連接器第4部分:設(shè)備連接器(插座)的型式和尺寸
- VDA6.3-2023過程審核檢查表
- 一年級數(shù)學(xué)下冊平面圖形數(shù)個數(shù)問題詳解+練習(xí)
- 錦綸纖維研究報告-中國錦綸纖維行業(yè)競爭格局分析及發(fā)展前景研究報告2020-2023年
- 浙江省舟山市2023-2024學(xué)年高二上學(xué)期1月期末檢測地理試題(解析版)
- 國家電網(wǎng)有限公司架空輸電線路帶電作業(yè)工作管理規(guī)定
評論
0/150
提交評論