IO的阻塞、非阻塞、同步、异步

伪代码:

void ioTest(){
    // 1
    read(socket, buffer);//这句阻塞,阻塞的情况有两种:1.当socket并没有数据时(等待数据);2.当socket有数据时(激活状态),要经历从socket的buffer读到程序空间的buffer中的时间过程
    // 2
    process(buffer);//这一句的执行必须得等上一句执行返回,因为参数buffer来源于上一句
    // 3
    doOtherNotRelateToTheSocket();//这一句所要执行的内容与socket无关,却还是要收到socket阻塞的影响,因为第一句的执行使整个线程阻塞在那里了。
}
void process(buffer){
    show(buffer.toString());
}

同步: 下一句的执行必须等上一句执行返回,例子中第二句执行的条件需要第一句执行返回;但第三句是与之前语句无关的语句,不应该是同步语句。因此可以通过给同步代码另开线程解决这个问题,即把第一和第二句放到另一个线程去,则doOtherNotRelateToTheSocket()方法不会受到阻塞
阻塞: io上的阻塞(系统调用read()后,马上返回一个状态回用户空间为非阻塞,不马上返回只有等到有数据才返回到用户空间则为阻塞)
这里有一个比较容易混淆的点,似乎阻塞就等于同步,第二第三句都要在第一句执行完后才执行(第二句位置合理,但第三句是不合适的同步)。阻塞是资源上的限制,不可改变,但同步代码可以通过启动多线程达到异步的效果。

高性能IO模型浅析

-----------------------------------------------------------------------

I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer),reactor与proactor模式都具有I/O多路复用的特点,区别只在于reactor属于同步IO,proactor属于异步IO。

proactor的一个重要区别地方: 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。(异步IO即应用程序操作数据时不需要才开始从IO上读取字节流,而是读取缓冲区上的数据(操作系统已经并行做了这个事情))。

reactor和proactor模式

reactor与proactor的概念

猜你喜欢

转载自kinghoo.iteye.com/blog/2298569