同步和异步,阻塞和非阻塞的关系

同步和异步,阻塞和非阻塞的关系

同步和异步形容二者之间的关系,流程

阻塞和非阻塞形容io socket的状态

可以组合成同步阻塞,同步非阻塞,异步阻塞,异步非阻塞

同步和异步,阻塞和非阻塞的关系

 

关键点:创建一个线程,callback io多路复用epoll

king式四元组

1 init_context  

  a.pthread_create

  b.epoll_create

2 uninit_context

  a.pthread_cancel

  b.close

3 commit()

  a.准备socket

  b connect

  c.protocol   #  dns/http/redis/mysql

  d.send

  e.epoll_ctl(add,sockfd);

4 callback()

   a.epoll_wait();

   b.recv()

 

 

同步和异步,阻塞和非阻塞的关系

 

 

同步和异步针对应用程序来,关注的是程序中间的协作关系;阻塞与非阻塞更关注的是单个进程的执行状态。

同步:执行一个操作之后,等待结果,然后才继续执行后续的操作。

异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。

阻塞:进程给CPU传达一个任务之后,一直等待CPU处理完成,然后才执行后面的操作。

非阻塞:进程给CPU传达任我后,继续处理后续的操作,隔断时间再来询问之前的操作是否完成。这样的过程其实也叫轮询。

同步和异步,阻塞和非阻塞的关系

   阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

在linux网络IO中涉及到如下模型:

(1)阻塞式IO

(2)非阻塞式IO

(3)IO多路复用

(4)信号驱动IO

(5)异步IO