对于开发人员来讲,不少概念老是在使用,面试的时候也会被频繁的问到。其中有几个老是被混淆的概念,也是被反复咀嚼的几个概念。面试
1.补足同步、异步、阻塞、非阻塞术语服务器
首先,须要说明的是 同步、异步、阻塞、非阻塞 这四个概念是被简略掉的说法。异步
同步,异步(调用)、阻塞,非阻塞(I/O)这才是稍微彻底的说法。单纯的同步,异步,阻塞,非阻塞说明的是工做的方式。而完成的说法则添加了场景。socket
将同步,异步,阻塞,非阻塞两个场景进行了区分。函数
2.阻塞、非阻塞的场景tornado
阻塞、非阻塞的场景是在I/O,进行设置的地方就是在处理文件句柄。在Linux服务器代码中一版都有这样的设置oop
iret = fcntl(nfd, F_SETFL, O_NONBLOCK)呢,那就是不空等。不进行阻塞,形成CPU空等。spa
这就是阻塞、非阻塞I/O场景。设计
3.同步、异步场景指针
同步、异步调用是一种程序设计的思路。同步是很是显然的。函数一个接一个的执行。
而异步则是在知足条件下进行调用。其实就是回调。
好比Linux aio,libev等等著名的异步方式的lib。都是要肯定的定义,在各类状况下的方法。
//设置cb函数,字段等 ev_io_init(&socket_watcher, accept_cb, sd, EV_READ); ev_io_start(loop, &socket_watcher); ev_timer_init (&timeout_watcher, timeout_cb, 2, 1); ev_timer_start (loop, &timeout_watcher);
而后设置给回调指针。这样的工做方式则是异步。
4.为何(异步、非阻塞)概念在混淆
这两个概念其实有不少人是在一种混淆的状态。为何由于在不少network lib中,这两种状况同时存在,例如tornado,twisted。而他们的应用场景也没有进行比较深入的思考。越简单越难啊。真是老虎,老鼠傻傻分不清。
好了不说了,该洗澡睡觉了。。