【青训营】1月22日总结

92 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第7天 同步异步I/O 和 阻塞非阻塞I/O

  • 网络I/O的核心过程:

    1. 成功建立连接
    2. 内核等待网卡数据到位。(这里涉及DMA技术)(这一步控制IO是否阻塞)
    3. 内核缓冲区数据拷贝到用户空间(这里涉及mmap内存映射技术)。(这一步控制IO是否同步)
  • 同步或者异步IO

    同步与异步关注的是消息通信机制。 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以就没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是通过被调用者通知调用者。

    • 同步一般指主动发送请求并等待IO操作完毕的方式,IO操作未完成前,会导致应用程序挂起
    • 异步是指用户触发IO操作后就开始做自己的事情,当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知),这样可以使进程在数据读写时不阻塞。
  • 阻塞或者不阻塞IO

    阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

    • 主要是指IO操作第一阶段的完成方式(内核缓冲区的数据未就绪),数据还没有准备好的时候,应用程序的表现,如果这里进程挂起,就是阻塞IO,否则是非阻塞IO。
    • 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取不同的方式。
    • 更简单点说:阻塞和非阻塞是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待;非阻塞方式下,读取或者写入函数会立即返回一个状态值。