建设信用卡网站首页,怎么免费创建自己的网站平台,预付做网站定金如何,同德县公司网站建设0、前言 阻塞与非阻塞、同步与异步#xff0c;这几个概念虽然每次看都能看的懂#xff0c;但是过一段时间又会忘掉#xff0c;所以系统的整理一下他们的区别#xff0c;也方便自己后面忘掉的时候快速记忆#xff0c;虽然网上有很多的说明这些概念的帖子#xff0c;但是每…0、前言 阻塞与非阻塞、同步与异步这几个概念虽然每次看都能看的懂但是过一段时间又会忘掉所以系统的整理一下他们的区别也方便自己后面忘掉的时候快速记忆虽然网上有很多的说明这些概念的帖子但是每次去找到能让自己明白的帖子也是一件不容易的事。
1、概念解释
1.1 阻塞与非阻塞 如果对于一次调用比如说read()如果是阻塞的话当内核中数据没有准备好的情况下该进程会阻塞当前的线程进入休眠的状态直到读取到数据。如果是非阻塞的话会直接返回一个错误码。
1.2 同步与异步 同步指的是我做一件事总是要把它做完了以后再去做另一件事即我调用一个函数在没有得到结果之前该调用不会返回。在用户线程发起 I/O 请求的时候数据是有的即将数据从内核缓存拷贝到用户空间的这个过程用户线程是要等待着拷贝完成。 好重点就是在这里就是这个同步描述总是让人觉得它和阻塞不是一样的吗但是实际上阻塞的时候当前的进程或者线程会休眠会挂起这个时候会让出CPU但是同步不一样同步是我一定要执行完我当前的任务他是占有CPU的。 现在再看看什么是异步异步就是我发起了一个调用我就去做另外一件事情了在那件事情昨晚之后通过回调函数等方式去通知我完成了这个任务。在用户线程发起 I/O 请求的时候数据是有的但是在数据从内核缓存拷贝到用户空间这个过程中不需要用户线程等待线程可以去执行其它逻辑等内核将数据从内核空间拷贝到用户空间后用户线程会得到一个通知。 那么再来看看异步与非阻塞的区别看起来都是调用完直接返回了但是异步会在事情完成之后告诉调用者我完成了一个任务。
2、二者的区别 从大的角度来看判断同步与异步的层次会高一些它指的是数据还没有完成处理的时候代码的处理的方式上的不同。同步和异步是指内核的 I/O 拷贝实现当数据准备就绪后需要将内核空间的数据拷贝至用户空间如果是同步 I/O 那么用户线程会等待拷贝的完成而异步 I/O则这个拷贝过程用户线程该干嘛可以去干吗当内核拷贝完毕之后会“通知”用户线程。 而阻塞与非阻塞指的是数据没有处理完的时候线程的状态。阻塞和非阻塞指的是发起 I/O 请求后用户线程状态的不同阻塞I/O在数据未准备就绪的时候会 阻塞当前用户线程而非阻塞 I/O 会立马返回一个错误不会阻塞当前用户线程。