标签:
近来遇到一些网络编程方面的问题,涉及到了一些常见的概念,如:阻塞、非阻塞、异步I/O等等,百度的结果是惨不忍睹的,当然这也不能怪百度。没有办法还是得看英文,翻教材。后来发现阻塞和非阻塞的概念也并不难以理解,这篇随笔记录一下自己的见解,欢迎拍砖,希望多多交流。
进程的状态主要涉及运行态、就绪态和阻塞态等,一个进程逻辑上无法继续执行(例如等待I/O事件时)会被阻塞。实际上OS内部是由一个高级的进程调度程序来管理进程的状态变化以及进程共享CPU的,被阻塞的进程会被调度程序“无视”——除非你的I/O(或其他条件)就绪,然后你转成就绪态,否则就是CPU空转,我都不鸟你(不让你获得CPU)。
这样一来其实“阻塞”和“非阻塞”的特点就很明显了,阻塞I/O,在阻塞点可以看做暂停了代码的执行,后面的代码只有等I/O需求得到满足后才能继续,这是因为一旦到达阻塞点,进程调度程序直接“无视”被阻塞的进程,I/O完成前该进程是获得不了CPU的。
对于非阻塞I/O,即使I/O没有就绪,但是此时调用返回了错误,或者抛出了异常,在I/O尚未就绪的这段时间里并没有丧失CPU的使用权,而是继续具有调度获得CPU的权利,所以其后的代码得以继续,也就是程序可以继续运行。
对于非阻塞I/O,如何在I/O事件完成后继续程序应有的执行流程呢,这催生了两种主要的技术,一种是“等你搞定了告诉我啊”这样的事件驱动机制,另一种是“我会不断问你OK没有”这样的轮询机制,当然,这里的“你”,就是操作系统啦。
标签:
原文地址:http://www.cnblogs.com/Security-Darren/p/4594411.html