根据阻塞非阻塞,同步异步,把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从队列里取包,回包。
同步是:我发一个,然后我等着收。 或者是,我发一个,等你发出去,我再发一个。
异步是: 我发一个,你通知我收我才收。 或者是,我发一个,我把包加入队列即可,实际哪时候发出去我不管。
楼主对异步的理解是什么? 非要跑一个线程来做通知的感觉,异步难道就一定要和多线程联系在一起么? 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
互斥锁的效率最近了解到很低,多线程的程序通常都跑不过单线程的程序.
设计这类程序,主要是考虑包的处理是不是花费很长时间,如果很长时间,那么处理线程就必须单独拿出去,否则将影响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从队列里取包,回包。
同步是:我发一个,然后我等着收。 或者是,我发一个,等你发出去,我再发一个。
异步是: 我发一个,你通知我收我才收。 或者是,我发一个,我把包加入队列即可,实际哪时候发出去我不管。
楼主对异步的理解是什么? 非要跑一个线程来做通知的感觉,异步难道就一定要和多线程联系在一起么? 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
互斥锁的效率最近了解到很低,多线程的程序通常都跑不过单线程的程序.
设计这类程序,主要是考虑包的处理是不是花费很长时间,如果很长时间,那么处理线程就必须单独拿出去,否则将影响I/O. 另外一方面也得考虑CPU个数和网卡个数,CPU多那么多线程肯定优势,网卡多,那么在一些特定的要求下,可以将某些业务数据分到一张单独的网卡上.
#5
觉得异步里面又是可以细分的。AIO和IOCP应该是更高级点的异步