vlambda博客
学习文章列表

操作系统常见面试题(网络IO模型篇)(四)

1、reactor模型有哪三种类型?
单Reactor单线程(一个前台一个服务员)
单Reactor多线程(一个前台多个服务员)
主从Reactor多线程(多个前台多个服务员)

2、reactor模型有哪三种角色?
模型主要分为三个角色
Reactor:把IO事件分配给对应的handler处理
Acceptor:处理客户端连接事件
Handler:处理非阻塞的任务

3、传统IO模型的不足和解决思路是什么?
不足:
• 每个连接都需要独立线程处理,当并发数大时,创建线程数多,占用资源;
• 采用阻塞IO模型,连接建立后,若当前线程没有数据可读,线程会阻塞在读操作上,造成资源浪费

针对传统阻塞IO模型的两个问题,可以采用如下的方案:
• 基于池化思想,避免为每个连接创建线程,连接完成后将业务处理交给线程池处理;
• 基于IO复用模型,多个连接共用同一个阻塞对象,不用等待所有的连接。遍历到有新数据可以处理时,操作系统会通知程序,线程跳出阻塞状态,进行业务逻辑处理。

4、Tomcat的四种IO模型?
  • NIO(tomcat8之后默认)

  • BIO(tomcat7之前默认)

  • APR

  • AIO(NIO2,tomcat8之后支持)


5、多路复用IO模型和Reactor模型的区别?
后者基于前者。

6、Reactor和Proactor  IO模型的区别?
1. Reactor基于多路复用IO模型;Proactor基于异步IO模型
2. Reactor是:事件来了操作系统通知应用进程,让应用进程来处理;
    Proactor是:事件来了操作系统来处理,处理完再通知应用进程(被动接受)

7、BIO、NIO和多路复用IO的区别?
BIO(挂起)和NIO(轮询)是主动从内核取数据;
多路复用IO的轮询(轮询内核准备数据情况)不是由用户进程做的,而是由select/poll/epoll做的。

8、进程切换的过程?
• 保存处理机上下文,包括程序计数器和其他寄存器。
• 更新PCB信息。
• 把进程的PCB移入相应阻塞队列。
• 选择另一个进程执行,并更新其PCB。
• 更新内存管理的数据结构。
• 恢复处理机上下文。

9、用户进程如何从网络IO读取数据?
• 网络数据分组到达后,会被复制到内核到某个缓冲区;
• OS内核把数据从内核缓冲区(内核空间)复制到进程缓冲区(用户空间);

提示:应用程序不能直接和硬件互操作,必须借助于操作系统

10、nginx和apache的区别?
nginx是基于事件模型(epoll),适合于IO密集型任务,比如反向代理。
apache是基于多进程/多线程模式的,适合于运行长时间计算任务的任务。