xinglp 发表于 2017-02-08 12:04
这个aio自己不能等待一堆io么,就像epoll那样另外这个内核aio现在支持套接字了么
可以,可是你怎样组织一堆IO呢?
作为服务器,客户端的请求是随机的,你怎么把一堆客户端的请求一起处理又不让他们互相等待。
windoze 发表于 2017-02-06 22:50
目前应该都是kernel aio了,除非你还在用2.4
你的意思是? 现在Libaio和glibc的aio都已经是kernel aio了,glibc也不再是调用posix aio了?
回复 12# cdsfiui
glibc的aio_XXX还是以前那个吊样,libaio里面的是io_XXX,这个是新的kernel AIO,但是在2.4版本下不能用,必须要2.6或者更新的kernel。
windoze 发表于 2017-02-08 22:02
回复 12# cdsfiui
glibc的aio_XXX还是以前那个吊样,libaio里面的是io_XXX,这个是新的kernel AIO,但 ...
/*******************************************
* 需要linux 2.6.22 以上版本
* 和libaio 3.107以上版本
* 如果不具备这个条件,在makefile里用SIO_fd.o
* 取代本模块
*******************************************/
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/eventfd.h>
#include <libaio.h>
#include <scsrv.h>
static int AIO_oper(int fd,char *buff,size_t iosize,int flg)
{
io_context_t myctx;
int rc,num;
uint64_t finished_aio;
struct iocb _iocb,*io=&_iocb;
struct io_event event;
int efd = eventfd(0, 0);
T_YIELD yield=get_yield();
if (efd == -1) {
return flg?write(fd,buff,iosize):read(fd,buff,iosize);
}
memset(&myctx,0,sizeof(myctx));
io_set_eventfd(io,efd);
io_queue_init(1, &myctx);
if(flg) io_prep_pread(io, fd, buff, iosize, 0);
else io_prep_pwrite(io, fd, buff, iosize, 0);
rc = io_submit(myctx, 1, &io);
if(rc<0) {
close(efd);
io_destroy(myctx);
return flg?write(fd,buff,iosize):read(fd,buff,iosize);
}
if(yield) {
rc = yield(efd,0,0);//efd提交给epoll,并yield and resume.
if(rc==0) eventfd_read(efd, &finished_aio);
}
close(efd);
num = io_getevents(myctx, 1, 1, &event, NULL);
if(num>0) {
if(event.res2==0) num=event.res;
else num=-1;
}
io_destroy(myctx);
return num;
}
int AIO_read(int fd,char *buff,size_t iosize)
{
return AIO_oper(fd,buff,iosize,0);
}
int AIO_write(int fd,char *buff,size_t iosize)
{
return AIO_oper(fd,buff,iosize,1);
}
本帖最后由 yulihua49 于 2017-02-09 11:06 编辑
yulihua49 发表于 2017-02-08 22:21
看31行,与eventfd结合,然后,在yield时,提交epoll。
还是一个原则,能异步就异步,不能异步就同步,反正事情是不能耽误的。
yulihua49 发表于 2017-02-08 17:02
可以,可是你怎样组织一堆IO呢?
作为服务器,客户端的请求是随机的,你怎么把一堆客户端的请求一起处理 ...
我的意思是这个内核的aio没有epoll或者kqueue那样的等待接口么 楼主加油,我们都看好你哦
xinglp 发表于 2017-02-09 11:13
我的意思是这个内核的aio没有epoll或者kqueue那样的等待接口么
没有。必须是libaio,107以上版本。
页:
1
[2]