CS架构中,常见的几种服务器模型,可能有许多错误,请各位朋友拍砖。
1、
进程模型: 单进程、单线程处理请求。
I/O : 阻塞read,write。
这种模型,同一时刻只能响应一个客户端请求;处理完一个客户端请求才能为 下一个请求服务。
这一般称为迭代服务器。在UNP这本数上,最前面的几章就有介绍。
2、
进程模型:单进程、单线程。
I/O: 利用I/O多路复用例如poll ,select ,epoll等,+非阻塞socket。同一时刻也只能处理一个客户端的请求。但是可以在一个时间段可以为多个客户端请求进行服务。
利用I/O复用,不会因为一个客户阻塞而阻塞其他客户端。
3、
fork 进程:
父进程中 循环accept,收到客户端发起的连接后,fork出子进程,一个子进程为一个客户端请求服务。
4、pthread_create 线程。
主线程中循环accept,收到客户端发起的连接后,create子线程,一个子线程为一个客户端请求进行服务。
5、pre_fork,进程池
进程模型:
在服务器启动时,父进程便预先创建多个子进程。
5.A
父进程负责accept,收到客户端的连接请求,便将socket fd传递给某一个子进程,可以利用unix socket等方式。
子进程再为客户端请求服务。
子进程可以利用普通的阻塞式I/o ,这样每个子进程只有在一个客户端请求处理完成后,才能处理一个客户端请求。
子进程可以利用 I/O多路复用,例如select ,poll, epoll等,这样每个子进程可以在同一时间段为多个客户端请求服务。
5.B
每个进程都调用accept ,可以利用锁保护、也可以不利用锁保护。会有惊群,一个连接到来,可能唤醒多个进程。
进程accept返回后,便为客户端请求服务。进程在处理完一个请求后,才能处理下一个请求。
6、线程池。
进程模型:
服务器启动时,主线程预先创建多个子线程
6.A
每个线程各自accept,使用互斥锁保护accept调用,(可能根据不同的内核,有的不需要锁保护)
线程accept与客户端三次握手成功后,便为客户端服务,线程在处理完一个请求后,才能处理下一个请求。
6.B
主线程负责accept,accept成功以后将socket fd传递给某一个子线程,因为父子线程在同一进程,共享文件描述符,有各种方法传递描述符号,比如pipe等。
子线程 收到描述符号后 ,利用阻塞I/O ,那么同一时间段只能为一个客户端请求服务,只有再一个请求处理完毕后,才能为下一个请求服务。
子线程利用多路I/O复用,这样同一时间段就可以处理多个客户端请求。
优缺点:
日后再说。。。