跟大家交流下IO的同步和异步问题,(找不到地方问)

时间:2022-08-27 15:45:02
网上有篇文章, http://www.ibm.com/developerworks/cn/linux/l-async/
根据阻塞非阻塞,同步异步,把IO模型分为4类,
同步阻塞    
同步非阻塞  NON_BLOCK set 
异步阻塞    select 
异步非阻塞  aio, epoll

我原来的看法,同步就是IO操作和非IO操作(一般是IO的处理,如网络程序里的消息处理)串行执行。
异步的话,IO操作和非IO操作(IO结果处理)并行执行,或者有一部分重叠。

但是很快又困惑了,

是否可以在用户态创建一个线程来完全模拟异步IO???

比如:

//IO请求
class async_io
{
    int _fd;
    void *_buf;
    int _len;
};

//线程中定义一io队列,
class io_thread
{
     queue<async_io> _requests;
     queue<async_io> _finished_ios;
     void run() 线程函数
     { 
          while (io = get_request()) {
               if (read or write (io.buf, io.buf, ) {
                    _finished_ios.push(io);
                    _requests.remove(io);

     } 
}

如果再写一个select函数,监测_finished_ios,这算不算一个异步阻塞的IO模型???但按上述文章,它应该是同步IO。
如果在io请求async_io中增加一个IO处理回调函数,在线程函数中,IO操作完成时调用,这算不算异步非阻塞???

5 个解决方案

#1


mark一下,回去好好看看那篇文章,现在没心劲

#2


IO模型是用户进程和系统间一种协作过程。进程内怎么模拟最终还是要和系统实实在在的打交道。

#3


异步概念是与同步概念针锋相对的。

同步是:我发一个,然后我等着收。 或者是,我发一个,等你发出去,我再发一个。

异步是: 我发一个,你通知我收我才收。 或者是,我发一个,我把包加入队列即可,实际哪时候发出去我不管。


楼主对异步的理解是什么? 非要跑一个线程来做通知的感觉,异步难道就一定要和多线程联系在一起么? no。

select/poll就是异步的:

1,首先,我不用recv去等,我注册read事件,select在有数据可读的时候会通知我。
2,其次,如果我send的返回值小于请求值,我不必循环send,我把数据缓冲起来,注册write事件,等select通知我可写,我再去写。

网络模型稍微复杂一点,我们用多线程来提高处理效率,I/O线程负责读与发,worker线程负责处理数据,
1,I/O线程怎么把包送给worker? 当然是包加锁入队列。
2,workder线程怎么知道有包需要处理?  1秒检测一次队列容量? 当然不是,给Pipe写字节通知worker线程的select从队列里取走,处理包。
3,worker线程构造的回包怎么传给I/O线程? 一样的道理,给Pipe写字节通知I/O线程的select从队列里取包,回包。

#4


引用 3 楼 qq120848369 的回复:
异步概念是与同步概念针锋相对的。

同步是:我发一个,然后我等着收。 或者是,我发一个,等你发出去,我再发一个。

异步是: 我发一个,你通知我收我才收。 或者是,我发一个,我把包加入队列即可,实际哪时候发出去我不管。


楼主对异步的理解是什么? 非要跑一个线程来做通知的感觉,异步难道就一定要和多线程联系在一起么? no。

select/poll就是异步的:

1,首先……


互斥锁的效率最近了解到很低,多线程的程序通常都跑不过单线程的程序.

设计这类程序,主要是考虑包的处理是不是花费很长时间,如果很长时间,那么处理线程就必须单独拿出去,否则将影响I/O. 另外一方面也得考虑CPU个数和网卡个数,CPU多那么多线程肯定优势,网卡多,那么在一些特定的要求下,可以将某些业务数据分到一张单独的网卡上.

#5


觉得异步里面又是可以细分的。AIO和IOCP应该是更高级点的异步

#1


mark一下,回去好好看看那篇文章,现在没心劲

#2


IO模型是用户进程和系统间一种协作过程。进程内怎么模拟最终还是要和系统实实在在的打交道。

#3


异步概念是与同步概念针锋相对的。

同步是:我发一个,然后我等着收。 或者是,我发一个,等你发出去,我再发一个。

异步是: 我发一个,你通知我收我才收。 或者是,我发一个,我把包加入队列即可,实际哪时候发出去我不管。


楼主对异步的理解是什么? 非要跑一个线程来做通知的感觉,异步难道就一定要和多线程联系在一起么? no。

select/poll就是异步的:

1,首先,我不用recv去等,我注册read事件,select在有数据可读的时候会通知我。
2,其次,如果我send的返回值小于请求值,我不必循环send,我把数据缓冲起来,注册write事件,等select通知我可写,我再去写。

网络模型稍微复杂一点,我们用多线程来提高处理效率,I/O线程负责读与发,worker线程负责处理数据,
1,I/O线程怎么把包送给worker? 当然是包加锁入队列。
2,workder线程怎么知道有包需要处理?  1秒检测一次队列容量? 当然不是,给Pipe写字节通知worker线程的select从队列里取走,处理包。
3,worker线程构造的回包怎么传给I/O线程? 一样的道理,给Pipe写字节通知I/O线程的select从队列里取包,回包。

#4


引用 3 楼 qq120848369 的回复:
异步概念是与同步概念针锋相对的。

同步是:我发一个,然后我等着收。 或者是,我发一个,等你发出去,我再发一个。

异步是: 我发一个,你通知我收我才收。 或者是,我发一个,我把包加入队列即可,实际哪时候发出去我不管。


楼主对异步的理解是什么? 非要跑一个线程来做通知的感觉,异步难道就一定要和多线程联系在一起么? no。

select/poll就是异步的:

1,首先……


互斥锁的效率最近了解到很低,多线程的程序通常都跑不过单线程的程序.

设计这类程序,主要是考虑包的处理是不是花费很长时间,如果很长时间,那么处理线程就必须单独拿出去,否则将影响I/O. 另外一方面也得考虑CPU个数和网卡个数,CPU多那么多线程肯定优势,网卡多,那么在一些特定的要求下,可以将某些业务数据分到一张单独的网卡上.

#5


觉得异步里面又是可以细分的。AIO和IOCP应该是更高级点的异步