同步和异步
从消息通知机制角度来说的。 两个任务 同步一直等,异步不等
阻塞和非阻塞
程序(线程)等待消息通知时的状态角度来说
同步和阻塞
对于同步调用来说,很多时候当前线程可能还是激活的,只是从逻辑上当前函数没有返回而已,此时,这个线程可能也会处理其他的消息
对于阻塞调用来说,则当前线程就会被挂起等待当前函数返回
同步阻塞、同步非阻塞
异步阻塞、异步非阻塞
阻塞与非阻塞 CPU的利用率 vs 系统的线程切换,上下文切换
同步非阻塞形式实际上是效率低下的,异步非阻塞形式却没有这样的问题
同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态
以小明下载文件打个比方
同步阻塞:小明一直盯着下载进度条,到 100% 的时候就完成。
同步非阻塞:小明提交下载任务后就去干别的,每过一段时间就去瞄一眼进度条,看到 100% 就完成。
异步阻塞:小明换了个有下载完成通知功能的软件,下载完成就“叮”一声。不过小明仍然一直等待“叮”的声音(看起来很傻,不是吗)。
异步非阻塞:仍然是那个会“叮”一声的下载软件,小明提交下载任务后就去干别的,听到“叮”的一声就知道完成了。
同步/异步是“下载完成消息”通知的方式(机制),而阻塞/非阻塞则是在等待“下载完成消息”通知过程中的状态(能不能干其他任务)
“消息通知机制”和“等待消息通知时的状态” 是 理解 同步,异步,阻塞和非阻塞的关键
用户空间与内核空间:
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间
进程切换
缓存 IO
在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page cache )中,
也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间
read操作两个阶段:
第一阶段:等待数据准备 (Waiting for the data to be ready)。
第二阶段:将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。
网络IO的模型分类:
- 同步模型(synchronous IO)
- 阻塞IO(bloking IO)
- 非阻塞IO(non-blocking IO)
- 多路复用IO(multiplexing IO)
- 异步IO(asynchronous IO)
- 信号驱动式IO(signal-driven IO) 不常用
- 同步阻塞 IO 模型:
- 同步非阻塞 IO:
同步非阻塞就是 “每隔一会儿瞄一眼进度条” 的轮询(polling)方式
nonblocking IO的特点是用户进程需要不断的主动询问kernel数据好了没有
这会导致整体数据吞吐量的降低。 - IO 多路复用( IO multiplexing)
如果轮询不是进程的用户态,而是有人帮忙就好了。那么这就是所谓的 “IO 多路复用”
UNIX/Linux 下的 select、poll、epoll 就是干这个的(epoll 比 poll、select 效率高,做的事情是一样的)
select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
从整个IO过程来看,他们都是顺序执行的,因此可以归为同步模型(synchronous)。都是进程主动等待且向内核检查状态。
并发和并行的区别
并发数是指同时进行的任务数(如同时服务的 HTTP 请求),而并行数是可以同时工作的物理资源数量(如 CPU 核数)
异步非阻塞 IO(asynchronous IO)
网友评论