色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 關于Linux內核中的異步IO的使用

關于Linux內核中的異步IO的使用 時間:2018-09-21      來源:未知

我們都知道異步IO的作用,就是可以提高我們程序的并發能力,尤其在網絡模型中。在linux中有aio的一系列異步IO的函數接口,但是這類函數都是glibc庫中的函數,是基于多線程實現,不是真正的異步IO,在內核中有真正的異步IO函數接口。下邊我們來學習一下linux內核中的異步IO。

首先我們來看一下內核中異步IO的主要函數接口:

int io_setup(unsigned nr_events, aio_context_t *ctxp);

功能:用來初始化異步IO的上下文。

其中參數ctxp用來描述異步IO上下文, 參數nr_events表示小可處理的異步IO事件的個數。

int io_submit(io_context_t ctx, long nr, struct iocb *iocbs[]);

功能:提交初始化好的異步讀寫事件。

其中ctx是上文的描述句柄, nr表示提交的異步事件個數。Iocbs是異步事件的結構體。

int io_getevents(io_context_t ctx, long nr, struct io_event *events[], struct timespec *timeout);

功能:獲得已經完成的異步IO事件。

其中參數ctx是上下文的句柄,nr 表示期望獲得異步IO事件個數,events用來存放已經完成的異步事件的數據,timeout為超時事件。

int io_destroy(aio_context_t ctx);

功能:用于銷毀異步IO事件句柄。

但是內核的異步IO通常和epoll等IO多路復用配合使用來完成一些異步事件,那么就需要使用epoll來監聽一個可以通知異步IO完成的描述符,那么就需要使用eventfd函數來獲得一個這樣的描述符。

下邊附上一個epoll和內核異步IO配合使用的示例代碼:

#define TEST_FILE "aio_test_file"

#define TEST_FILE_SIZE (127 * 1024)

#define NUM_EVENTS 128

#define ALIGN_SIZE 512

#define RD_WR_SIZE 1024

struct custom_iocb

{

struct iocb iocb;

int nth_request;

};

//異步IO的回調函數

void aio_callback(io_context_t ctx, struct iocb *iocb, long res, long res2)

{

struct custom_iocb *iocbp = (struct custom_iocb *)iocb;

printf("nth_request: %d, request_type: %s, offset: %lld, length: %lu, res: %ld, res2: %ld\n", iocbp->nth_request, (iocb->aio_lio_opcode == IO_CMD_PREAD) ? "READ" : "WRITE",iocb->u.c.offset, iocb->u.c.nbytes, res, res2);

}

int main(int argc, char *argv[])

{

int efd, fd, epfd;

io_context_t ctx;

struct timespec tms;

struct io_event events[NUM_EVENTS];

struct custom_iocb iocbs[NUM_EVENTS];

struct iocb *iocbps[NUM_EVENTS];

struct custom_iocb *iocbp;

int i, j, r;

void *buf;

struct epoll_event epevent;

//創建用于獲取異步事件的通知描述符

efd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);

if (efd == -1) {

perror("eventfd");

return 2;

}

fd = open(TEST_FILE, O_RDWR | O_CREAT | O_DIRECT , 0644);

if (fd == -1) {

perror("open");

return 3;

}

ftruncate(fd, TEST_FILE_SIZE);

ctx = 0;

//創建異步IO的句柄

if (io_setup(8192, &ctx)) {

perror("io_setup");

return 4;

}

//申請空間

if (posix_memalign(&buf, ALIGN_SIZE, RD_WR_SIZE)) {

perror("posix_memalign");

return 5;

}

printf("buf: %p\n", buf);

for (i = 0, iocbp = iocbs; i < NUM_EVENTS; ++i, ++iocbp) {

iocbps[i] = &iocbp->iocb;

//設置異步IO讀事件

io_prep_pread(&iocbp->iocb, fd, buf, RD_WR_SIZE, i * RD_WR_SIZE);

//關聯通知描述符

io_set_eventfd(&iocbp->iocb, efd);

//設置回調函數

io_set_callback(&iocbp->iocb, aio_callback);

iocbp->nth_request = i + 1;

}

//提交異步IO事件

if (io_submit(ctx, NUM_EVENTS, iocbps) != NUM_EVENTS) {

perror("io_submit");

return 6;

}

epfd = epoll_create(1);

if (epfd == -1) {

perror("epoll_create");

return 7;

}

epevent.events = EPOLLIN | EPOLLET;

epevent.data.ptr = NULL;

if (epoll_ctl(epfd, EPOLL_CTL_ADD, efd, &epevent)) {

perror("epoll_ctl");

return 8;

}

i = 0;

while (i < NUM_EVENTS) {

uint64_t finished_aio;

//監聽通知描述符

if (epoll_wait(epfd, &epevent, 1, -1) != 1) {

perror("epoll_wait");

return 9;

}

//讀取完成的異步IO事件個數

if (read(efd, &finished_aio, sizeof(finished_aio)) != sizeof(finished_aio)) {

perror("read");

return 10;

}

printf("finished io number: %"PRIu64"\n", finished_aio);

while (finished_aio > 0) {

tms.tv_sec = 0;

tms.tv_nsec = 0;

//獲取完成的異步IO事件

r = io_getevents(ctx, 1, NUM_EVENTS, events, &tms);

if (r > 0) {

for (j = 0; j < r; ++j) {

//調用回調函數

//events[j].data的數據和設置的iocb結構體中的data數據是一致。

((io_callback_t)(events[j].data))(ctx, events[j].obj, events[j].res, events[j].res2);

}

i += r;

finished_aio -= r;

}

}

}

close(epfd);

free(buf);

io_destroy(ctx);

close(fd);

close(efd);

remove(TEST_FILE);

return 0;

}

上一篇:CMOS集成電路的性能及特點

下一篇:Linux下printf輸出字符串的顏色

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 精品国产乱码久久久久久鸭王1 | 精品国产一区二区AV片 | 精品少妇人妻AV免费久久洗澡 | 男吃奶玩乳尖高潮视频 | 精品一区二区三区无码视频 | 人人人澡人人肉人人妻 | 尹人在线最新香蕉视频 | 在线看免费无码a片视频 | 日日AV拍夜夜添久久免费 | 我妈妈的朋友在线 | 国产又爽又猛又粗的A片 | 免费一级做a爰片久久毛片无遮挡 | 亚洲欧洲日产国码aⅴ | 亚洲AV综合色一区二区三区 | 漂亮人妻中文字幕丝袜 | 亚洲Aⅴ天堂Av天堂无码麻豆 | 色偷偷人人澡人人添老妇人 | 久久丫亚洲一区二区 | 最新国产乱人伦偷精品免费网站 | 午夜福利理论片在线观看播放 | 亚洲香蕉中文网 | 国产成人卡2卡3卡4乱码 | 婷婷五月深深久久精品 | 四虎国产精品永久在线无码 | 亚洲色噜噜噜噜噜噜国产 | 免费的青榴视频在线观看 | 精品国产成人亚洲午夜福利 | 亚洲国产成人精品无码区二本 | 五月天综合网缴情五月中文 | 四虎影视网址 | 国产又爽又黄又刺激的视频 | 精品国产福利一区二区三区 | 99精品一区二区三区无码吞精 | 色综合一 | 欧美成人无码一二区免费网站 | 中文字幕无码精品亚洲资源网久久 | 18禁无遮挡无码国产免费网站 | 免费A级毛片高清视频哦哦 苍井空毛片精品久久久 | 末成年av女网站 | 精品人妻无码一区二区三区打不开 | 黄色的视频在线免费观看 |