操作系统常见面试题(网络IO模型篇)(四)
Reactor:把IO事件分配给对应的handler处理
• 每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源;
• 采用阻塞IO模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费
针对传统阻塞IO模型的两个问题,可以采用如下的方案:
• 基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理;
• 基于IO复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理。
NIO(tomcat8之后默认)
BIO(tomcat7之前默认)
APR
AIO(NIO2,tomcat8之后支持)
6、Reactor和Proactor IO模型的区别?
1. Reactor基于多路复用IO模型;Proactor基于异步IO模型
2. Reactor是:事件来了操作系统通知应用进程,让应用进程来处理;
Proactor是:事件来了操作系统来处理,处理完再通知应用进程(被动接受)
BIO(挂起)和NIO(轮询)是主动从内核取数据;
多路复用IO的轮询(轮询内核准备数据情况)不是由用户进程做的,而是由select/poll/epoll做的。
• 保存处理机上下文,包括程序计数器和其他寄存器。
• 网络数据分组到达后,会被复制到内核到某个缓冲区;
• OS内核把数据从内核缓冲区(内核空间)复制到进程缓冲区(用户空间);
提示:应用程序不能直接和硬件互操作,必须借助于操作系统
nginx是基于事件模型(epoll),适合于IO密集型任务,比如反向代理。
apache是基于多进程/多线程模式的,适合于运行长时间计算任务的任务。
标签: