yulihua49 发表于 2017-02-08 17:02

本帖最后由 yulihua49 于 2017-02-08 17:04 编辑

xinglp 发表于 2017-02-08 12:04
这个aio自己不能等待一堆io么,就像epoll那样另外这个内核aio现在支持套接字了么
可以,可是你怎样组织一堆IO呢?
作为服务器,客户端的请求是随机的,你怎么把一堆客户端的请求一起处理又不让他们互相等待。

cdsfiui 发表于 2017-02-08 19:37

windoze 发表于 2017-02-06 22:50
目前应该都是kernel aio了,除非你还在用2.4

你的意思是? 现在Libaio和glibc的aio都已经是kernel aio了,glibc也不再是调用posix aio了?

windoze 发表于 2017-02-08 22:02

回复 12# cdsfiui

glibc的aio_XXX还是以前那个吊样,libaio里面的是io_XXX,这个是新的kernel AIO,但是在2.4版本下不能用,必须要2.6或者更新的kernel。

yulihua49 发表于 2017-02-08 22:21

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:03

本帖最后由 yulihua49 于 2017-02-09 11:06 编辑

yulihua49 发表于 2017-02-08 22:21

看31行,与eventfd结合,然后,在yield时,提交epoll。
还是一个原则,能异步就异步,不能异步就同步,反正事情是不能耽误的。

xinglp 发表于 2017-02-09 11:13

yulihua49 发表于 2017-02-08 17:02
可以,可是你怎样组织一堆IO呢?
作为服务器,客户端的请求是随机的,你怎么把一堆客户端的请求一起处理 ...

我的意思是这个内核的aio没有epoll或者kqueue那样的等待接口么

sditmaner 发表于 2017-02-09 12:00

楼主加油,我们都看好你哦

yulihua49 发表于 2017-02-09 12:32

xinglp 发表于 2017-02-09 11:13
我的意思是这个内核的aio没有epoll或者kqueue那样的等待接口么

没有。必须是libaio,107以上版本。
页: 1 [2]
查看完整版本: libaio是glibc提供的还是kernel提供的?