服务器并发模型

服务器:

单循环服务器:服务器在同一时刻只能响应一个客户端的请求

并发服务器模型:服务器在同一时刻可以响应多个客户端的请求

UDP:无连接

TCP:有连接

1.多进程

资源空间消耗大

效率低

2.多线程

相对进程资源消耗小

效率较高

3.IO多路复用:

为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,

使进程不阻塞于某个特定的 I/O 系统调用。

优势:

系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。

多进程并发服务器

多线程并发服务器

Linux系统IO模型:

1.阻塞IO

scnaf

getchar

fgets

gets

read

recv

recvfrom

1.可以实现多任务同步(多个事件相互影响)

2.可以节省CPU资源开销,提高执行效率

2.非阻塞IO

  1. 获取文件描述符属性

fcntl---------flag 0

  1. 为文件描述符添加非阻塞属性

  2. 设置文件描述符属性

fcntl

增加非阻塞属性

flag = fcntl(0,F_GETFL);

flag = flag | O_NONBLOCK;

fcntl(0,F_SETFL,flag);

1.可以访问多个IO事件

2.配合轮询操作,浪费CPU资源

3.信号驱动IO

1.实现异步IO操作,节省CPU开销

2.只能针对比较少的IO事件

1)为IO设备增加信号驱动属性

O_ASYNC

2)关联SIGIO信号到对应进程

fcntl(fd, F_SETOWN, getpid());

  1. 注册SIGIO处理函数

signal

4.多路复用IO

select

缺点:

1.select监听文件描述符最大个数为1024 (数组)

2.select监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据

3.select需要循环遍历一次才能找到产生的事件

4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)

int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

功能:

监听文件描述符集合

参数:

nfds:监测的文件描述符上限值(最大文件描述符的值+1)

readfds:读文件描述符集合

writefds:写文件描述符集合

exceptfds:异常条件的描述符集合

timeout:设置超时时间

NULL:一直等待

返回值:

成功返回产生事件文件描述符个数

失败返回-1

定时时间到达仍没有事件产生返回0

void FD_CLR(int fd, fd_set *set);

将fd从文件描述符集合中清除

int FD_ISSET(int fd, fd_set *set);

判断文件描述符fd是否仍在文件描述符集合中

void FD_SET(int fd, fd_set *set);

将fd加入文件描述符集合中

void FD_ZERO(fd_set *set);

文件描述符集合清0

fcntl

int fcntl(int fd, int cmd, ... /* arg */ );

功能:

设置文件描述符属性

参数:

fd:文件描述符

cmd:F_GETFL 获得文件描述符属性

F_SETFL 设置文件描述符属性

返回值:

F_GETFL:

成功返回获得的属性

失败返回-1

F_SETFL:

成功返回0

失败返回-1

O_NONBLOCK 非阻塞

O_ASYNC 异步方式

修改IO属性:

1)获取原有属性

2)增加新的属性

3)设置新的属性

注意:文件属性是直接设置完成的,设置完成后就算去掉代码行,依旧会保留上一次更改设置。

select内核监听,当对应的监听内容触发后执行,大大减小了cpu的开支,以扩大服务器的容量。

使用select创建一个无进程和线程的io多路复用服务器,对多用户进行连接。

相关推荐
蚰蜒螟4 小时前
一次挂载的完整旅程:Linux 内核 VFS 到 ext4 的调用链剖析
linux·运维·服务器
害人终害己4 小时前
Redis 日志:AUTH 认证信息
运维·服务器
奇牙coding4 小时前
GPT-5.5 API 报 401 但 GPT-5.4 正常怎么办?不是 Key 失效,是 Organization 头的强制校验变了
java·网络·gpt·ai
请输入蚊子4 小时前
CVE-2026-8260 D-Link DCS-935L缓冲区溢出漏洞 复现
网络·安全·web安全·iot
a努力。4 小时前
Context-State-Memory三重信息架构揭秘
java·服务器·前端
天蓝蓝的本我4 小时前
linux本地部署Qwen3.8 27B
linux·运维·excel
0+1114 小时前
Linux --应用层协议HTTP
网络·网络协议·http
紫神4 小时前
DDS 通信技术说明
网络·云原生·容器·k8s·dds·弱网
n112124 小时前
服务器被反复尝试登录之后:fail2ban 加密钥登录的五道加固
运维·服务器·服务器安全·fail2ban·ssh加固
洋不写bug4 小时前
网络编程(二)TCP回显服务器与客户端通信详解
服务器·网络·tcp/ip·tcp·网络通信·javaee·回显服务器