理解同步异步:
同步:A调用B,同步的结果是A需要等待B的结果返回,A再继续走下面的逻辑, code1->B->B返回->code2
void function A() {
code 1,
B(),
code 2
}
异步:A调用B,不需要等B的返回,A可以继续执行下面的逻辑,code1,code1->B->code, 等B执行完会采用回调的方式通知A
同步异步关注的是程序的执行顺序
理解阻塞与非阻塞:
数据的读写分为两个部分,一是数据的准备阶段,二是数据从内核态拷贝到用户态的阶段,阻塞与非阻塞也是指在第一阶段里。
阻塞:正在运行的一个线程或是进程的一个状态,阻塞意味着进程或线程被放到某个资源的等待队列里。让出了CPU的执行权。一般每个IO设备的设备驱动程序都会有对调用的阻塞处理。当数据没有准备好时,正在运行的进程会调用阻塞原语,将自己阻塞。当有数据时候。通过中断进入中断处理程序,唤醒等待队列中的进程,如recvfrom。实现方式是等待队列。
非阻塞:调用设备驱动的read或是write操作时候,当数据没有准备好时,进程不会被挂起,而是立即返回没有数据,这样用户进程可以采用循环的方式忙询,直到数据准备好以后再读取。实现方式是轮询。
recvfrom,在读取的时候回判断,如果是阻塞模式,则没有数据的时候回将自己阻塞,而如果是非阻塞模式,则会直接返回-EAGAIN。有数据的话直接读取。
驱动程序提供的非阻塞方式是通过Poll函数,会返回文件描述符所代表文件的可读可写的状态。立即返回,不会阻塞。
多路IO复用:select, poll, epoll,都是通过调用设备驱动的poll函数来实现。对于多个文件的读写可以提高读写效率,但是对于单个文件的读写,与阻塞方式一样。