服务器并发模型

服务器:

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

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

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

相关推荐
轻松Ai享生活1 天前
5 节课深入学习Linux Cgroups
linux
白帽黑客沐瑶1 天前
【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
网络·安全·web安全·计算机·程序员·编程·网络安全就业
christine-rr1 天前
linux常用命令(4)——压缩命令
linux·服务器·redis
三坛海会大神5551 天前
LVS与Keepalived详解(二)LVS负载均衡实现实操
linux·负载均衡·lvs
東雪蓮☆1 天前
深入理解 LVS-DR 模式与 Keepalived 高可用集群
linux·运维·服务器·lvs
qq_264220891 天前
LVS负载均衡群集和LVS+Keepalived群集
运维·负载均衡·lvs
树码小子1 天前
Java网络编程:(socket API编程:TCP协议的 socket API -- 回显程序的服务器端程序的编写)
java·网络·tcp/ip
乌萨奇也要立志学C++1 天前
【Linux】进程概念(二):进程查看与 fork 初探
linux·运维·服务器
雨落Liy1 天前
Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南
运维·nginx·负载均衡
Yyyy4821 天前
Nginx负载均衡集群实验步骤
运维·nginx·负载均衡