一、服务器
1.单循环服务器:同一时刻,只能处理一个客户端的任务;
2.并发服务器:同一时刻,可以处理多个客户端的任务;
3.TCP并发服务器:
(1)多进程:
(2)多线程:
(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复用一个进程;