面试题答案
一键面试基本工作原理
在Linux环境下,prefork多进程服务器模型是一种预先创建多个子进程来处理客户端请求的服务器设计模式。在服务器启动时,父进程会预先创建一定数量的子进程,这些子进程在创建后就处于等待状态,一旦有客户端连接请求到达,就由其中一个空闲的子进程来处理该请求。
父进程职责
- 创建子进程:父进程使用
fork
系统调用创建多个子进程。在创建子进程过程中,父进程会根据实际需求(如服务器硬件资源、预计负载等)确定子进程的数量。 - 监听套接字:父进程创建并绑定监听套接字,监听指定的端口,等待客户端连接请求。当有连接请求到达时,父进程接受该连接,然后将已连接套接字传递给一个可用的子进程进行处理。
- 进程管理:父进程负责监控子进程的状态,如子进程异常终止时,父进程可以选择重新创建新的子进程以维持子进程池的数量,确保服务器的处理能力。
子进程职责
- 处理客户端请求:子进程从父进程接受已连接套接字,通过该套接字与客户端进行通信,处理客户端的请求,如读取客户端发送的数据,进行业务逻辑处理,然后将响应数据返回给客户端。
- 保持等待状态:在处理完一个客户端请求后,子进程并不会终止,而是重新进入等待状态,准备处理下一个客户端连接请求,从而提高服务器的并发处理能力。
进程间协同工作
- 套接字传递:父进程在接受客户端连接后,通过一些进程间通信机制(如管道、信号等)将已连接套接字传递给一个空闲的子进程。子进程获取到该套接字后,就可以与客户端进行通信。
- 负载均衡:为了确保各个子进程负载相对均衡,父进程可以采用多种分配策略,如简单的轮询方式,将新的客户端连接依次分配给各个子进程;或者根据子进程的当前负载情况(如已处理的连接数、处理任务的复杂程度等),将连接分配给负载较轻的子进程。
- 同步与互斥:在多进程环境下,可能会存在多个子进程同时访问共享资源(如全局变量、文件等)的情况。为了避免数据竞争和不一致问题,需要使用同步机制,如信号量、互斥锁等,来保证同一时间只有一个进程访问共享资源。