并发服务器
一、服务器
1.单循环服务器:同一时刻,只能处理一个客户端的任务;
2.并发服务器:同一时刻,可以处理多个客户端的任务;
3.TCP并发服务器:
(1)多进程:
(2)多线程:
多进程并发服务器
-
基本概念:
- 采用多个进程来处理客户端请求,每个请求由一个独立的进程处理。
- 通常使用操作系统的进程创建机制(如
fork
)来生成新进程。
-
优点:
- 进程间隔离:每个进程有独立的内存空间,进程崩溃不会影响其他进程,提高了稳定性和安全性。
- 可利用多核处理器:在多核 CPU 上,多个进程可以并行执行,充分利用 CPU 性能。
-
缺点:
- 创建和销毁进程的开销较大,相较于线程切换性能较差。
- 进程间通信(IPC)相对复杂,性能较低。
- 使用内存多,资源开销大。
多线程并发服务器
-
基本概念:
- 采用多个线程来处理客户端请求,每个请求由一个独立的线程处理。
- 线程共享同一进程的内存空间。
-
优点:
- 线程创建和切换的开销较小,因此处理请求的响应速度更快。
- 内存占用效率高,多个线程共享进程的内存空间。
- 线程间通信相对简单,可以直接使用共享变量。
-
缺点:
- 线程之间的同步和数据共享需要额外的机制,容易引起竞态条件、死锁等问题。
- 由于共享内存,崩溃的线程可能会导致整个进程崩溃。
- 不同操作系统对线程的支持和调度策略不同,可能会影响性能。
-
多进程和多线程区别:
1. 效率角度
多线程效率高(创建、任务切换)
2. 安全角度
多进程比多线程安全(进程空间独立)
3. 资源消耗
进程资源消耗比线程多
4. 通信
进程:IPC 线程:全局变量(互压锁、信号量(同步) -------- 》锁)
(3)IO多路复用
二、IO模型
1.阻塞IO:fgets、scanf、read、recv、getchar
(1)实现多个IO同步的效果
(2)cpu占有率低
2.非阻塞IO
(1)使用轮询的方法实现
(2)cpu占有率高
实现步骤:获取原文件描述符的属性->增加非阻塞属性->设置新属性
fcntl
#include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ );
参数说明:fd
:文件描述符,指向要进行操作的打开文件的描述符。
-
cmd
:要执行的命令,可以是以下之一:F_GETFD
:获取文件描述符的标志。F_SETFD
:设置文件描述符的标志。F_GETFL
:获取文件状态标志。F_SETFL
:设置文件状态标志(例如,设置为非阻塞模式)。F_GETLK
:获取文件锁的状态。F_SETLK
:设置文件锁。F_SETLKW
:设置文件锁(如果锁被其他进程占用,则会阻塞)。
-
arg
:可选参数,具体取决于cmd
的值。如果cmd
是F_SETFD
、F_SETFL
,则它是要设置的值;如果是F_GETLK
或F_SETLK
,则它是指向一个struct flock
的指针。
返回值:成功时返回 0
或文件描述符的一个标志值。失败时返回 -1
,并设置 errno
以指示错误类型。
3.信号驱动IO
(1)异步通知的IO方式,节省CPU;
(2)只能监测少量IO;
增加异步属性->关联信号和当前的进程->注册信号处理函数
4.IO多路复用
(1)多个IO复用一个进程;