服务器并发模型

服务器:

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

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

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多路复用服务器,对多用户进行连接。

相关推荐
狄加山6758 分钟前
Cadence模块复用
服务器·硬件架构·硬件工程·信号处理·智能硬件
宇钶宇夕20 分钟前
SIMATIC S7-1200的以太网通信能力:协议与资源详细解析
运维·服务器·数据库·程序人生·自动化
该用户已不存在23 分钟前
关于我把Mac Mini托管到机房,后续来了,还有更多玩法
服务器·前端·mac
杰夫贾维斯28 分钟前
CentOS Linux 8 的系统部署 Qwen2.5-7B -Instruct-AWQ
linux·运维·人工智能·机器学习·centos
%d%d21 小时前
python 在运行时没有加载修改后的版本
java·服务器·python
kfepiza1 小时前
Netplan 配置网桥(Bridge)的模板笔记250711
linux·tcp/ip·ubuntu
kfepiza2 小时前
用Netplan配置网桥bridge笔记250711
linux·ubuntu·debian
CodeWithMe2 小时前
【Note】Linux Kernel 实时技术深入:详解 PREEMPT_RT 与 Xenomai
linux·运维·服务器
hrrrrb2 小时前
【TCP/IP】11. IP 组播
服务器·网络·tcp/ip
muyun28002 小时前
安全访问云端内部应用:用frp的stcp功能解决SSH转发的痛点
运维·安全·ssh·frp