实现并发网络服务器

一,网络服务器

1.单循环网络服务器 —— 同一时刻只能处理一个客户端任务

2.并发服务器 —— 同一时刻能处理多个客户端任务

二,并发服务器

1.多线程

2.IO多路复用

3.多进程

三,IO模型

1.阻塞IO 

阻塞IO(Blocking IO)是一种传统的IO操作模式,在这种模式下,当一个IO操作(如读、写)执行时,如果不能立即完成,程序会暂停执行,直到该IO操作完成。类似于fgets, scanf, read, recv, getchar函数

实例

阻塞read.c
#include "head.h"int main(int argc, const char *argv[])
{char buff[1024] = {0};mkfifo("./myfifo", 0664);int fifofd = open("./myfifo", O_RDONLY);if (-1 == fifofd){perror("fail open fifo");return -1;}while (1){fgets(buff, sizeof(buff), stdin);printf("STDIN : %s\n", buff);memset(buff, 0, sizeof(buff));read(fifofd, buff, sizeof(buff));printf("FIFO : %s\n", buff);}close(fifofd);return 0;
}
阻塞write.c
#include "head.h"int main(int argc, const char *argv[])
{	mkfifo("./myfifo", 0664);int fd = open("./myfifo", O_WRONLY);if (-1 == fd){perror("fail open fifo");return -1;}while (1){write(fd, "hello world", 11);sleep(1);}close(fd);return 0;
}

阻塞IO(Blocking IO)是一种传统的IO操作模式,在这种模式下,当一个IO操作(如读、写)执行时,如果不能立即完成,程序会暂停执行,直到该IO操作完成。这种IO模式具有以下几个特点:

1. 同步性

阻塞IO是同步的,意味着应用程序必须等待IO操作完成才能继续执行后续操作。在执行IO操作时,调用线程会被阻塞,无法继续处理其他任务。

2. 线程阻塞


当IO操作不能立即完成时,调用该操作的线程会被挂起,直到IO操作完成。这会导致线程在IO等待期间无法执行其他任务,从而降低CPU的利用率。

3. 编程模型简单


阻塞IO的编程模型相对简单,易于理解和实现。它不需要复杂的轮询或回调机制,直接通过系统调用来完成IO操作。

4. 适用场景


阻塞IO适用于连接数较少且每个连接需要较长时间处理的场景。在这种场景下,由于连接数不多,线程阻塞对整体性能的影响较小。
阻塞IO也适用于对并发性能要求不高的场景,如简单的文件读写操作或小型网络应用。

5. 缺点


在高并发场景下,阻塞IO的效率较低。因为每个连接都需要一个独立的线程来处理,当连接数增多时,会消耗大量的线程资源,可能导致线程资源耗尽。
线程在等待IO操作完成时处于阻塞状态,无法充分利用CPU资源,降低了系统的整体性能。

6. 改进方式


为了解决阻塞IO在高并发场景下的性能问题,可以采用非阻塞IO(Non-blocking IO)或IO多路复用(IO Multiplexing)等技术。非阻塞IO允许程序在等待IO操作完成时继续执行其他任务,而IO多路复用则允许一个线程同时处理多个IO操作。

综上所述,阻塞IO是一种简单但效率较低的IO操作模式,适用于连接数较少且对并发性能要求不高的场景。在高并发场景下,为了提高性能和资源利用率,可以考虑采用非阻塞IO或IO多路复用等更高效的IO操作模式。

2.非阻塞IO

非阻塞IO(Non-Blocking IO)是一种IO操作模式,其特点如下:

非阻塞特性:程序在发起IO请求后,不会等待IO操作完成,而是立即返回,程序可以继续执行后续操作。这提高了程序的运行效率和响应速度。
同步性:虽然非阻塞IO在发起请求后不会阻塞程序,但它是同步的,因为程序需要定期检查IO操作是否完成。这通常通过轮询或事件通知机制来实现。
适用场景:非阻塞IO适用于需要同时处理多个IO操作的并发环境,以及对IO操作响应时间要求较高的场景。
实现方式:非阻塞IO的实现通常依赖于操作系统的支持,例如通过设置socket为非阻塞模式,或使用特定的系统调用(如select、poll、epoll等)来检查IO操作的就绪状态。

总结来说,非阻塞IO允许程序在等待IO操作完成时继续执行其他任务,提高了程序的并发处理能力和响应速度但CPU占用率高

实现:

1.获取原文件描述属性

2.增加非阻塞属性

3.设置属性

非阻塞read.c

#include "head.h"int main(int argc, const char *argv[])
{char buff[1024] = {0};mkfifo("./myfifo", 0664);int fifofd = open("./myfifo", O_RDONLY);if (-1 == fifofd){perror("fail open fifo");return -1;}//1. 获取文件原有属性	int flag = fcntl(0, F_GETFL);//增加非阻塞属性//flag = flag | O_NONBLOCK;//去掉非阻塞属性flag = flag & (~O_NONBLOCK);//设置属性fcntl(0, F_SETFL, flag);while (1){memset(buff, 0, sizeof(buff));fgets(buff, sizeof(buff), stdin);printf("STDIN : %s\n", buff);memset(buff, 0, sizeof(buff));read(fifofd, buff, sizeof(buff));printf("FIFO : %s\n", buff);}close(fifofd);return 0;
}

非阻塞write.c

#include "head.h"int main(int argc, const char *argv[])
{	mkfifo("./myfifo", 0664);int fd = open("./myfifo", O_WRONLY);if (-1 == fd){perror("fail open fifo");return -1;}while (1){write(fd, "hello world", 11);sleep(1);}close(fd);return 0;
}

3.信号驱动IO

信号驱动IO(Signal-driven IO)是一种异步IO机制,其特点如下:

异步通知:当IO操作准备就绪时,内核通过发送信号(如SIGIO)来通知应用程序。这样,应用程序可以在数据准备好时立即处理,而无需持续轮询或阻塞等待,节省CPU
注册信号处理函数:应用程序需要预先注册一个信号处理函数,用于在接收到SIGIO信号时执行相应的IO操作。
底层驱动支持:信号驱动IO的实现需要底层驱动的支持,驱动在IO操作准备就绪时负责发送SIGIO信号。
适用场景:信号驱动IO特别适用于需要处理大量并发连接且对IO响应时间要求较高的场景,如网络服务器等。

总结来说,信号驱动IO通过信号机制实现异步IO操作,提高了程序的响应速度和并发处理能力。

实现:


1.增加异步属性

2.并联信号和当前进程

3.注册信号

4.信号调用函数

信号驱动read.c

#include "head.h"void handle(int signo)
{char buff[1024] = {0};fgets(buff, sizeof(buff), stdin);printf("STDIN : %s\n", buff);
}
int main(int argc, const char *argv[])
{signal(SIGIO, handle);char buff[1024] = {0};mkfifo("./myfifo", 0664);int fifofd = open("./myfifo", O_RDONLY);if (-1 == fifofd){perror("fail open fifo");return -1;}//1. 获取文件原有属性	int flag = fcntl(0, F_GETFL);flag = flag | O_ASYNC;fcntl(0, F_SETFL, flag);//2.关联当前进程fcntl(0, F_SETOWN, getpid());while (1){memset(buff, 0, sizeof(buff));read(fifofd, buff, sizeof(buff));printf("FIFO : %s\n", buff);}close(fifofd);return 0;
}

信号驱动write.c

#include "head.h"int main(int argc, const char *argv[])
{	mkfifo("./myfifo", 0664);int fd = open("./myfifo", O_WRONLY);if (-1 == fd){perror("fail open fifo");return -1;}while (1){write(fd, "hello world", 11);sleep(1);}close(fd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410952.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLi-LABS通关攻略【41-45】

SQLi-LABS 41关 这一关是堆叠注入 测试闭合 ?id1 //回显错误 ?id1-- //回显错误 ?id1-- //回显正确 所以是数字型的注入 测试堆叠注入,更改Dumb的密码 ?id1;update users set password123456 where usernameDumb-- SQLi-…

不会PS怎么快速抠图?试试这3种方法,抠图干净又高效!

我就不信每个人都会用PS抠图!! 关于抠图技巧,前面高赞已经分享了好多,但,我还是忍不住想向所有小白推荐更“傻瓜式”抠图。 就是那种根本不需要学习就能抠干净的抠图工具,适用于99%的抠图需求&#xff0c…

【数字时序】时钟树延迟偏差——CPPR adjustment

接上一篇文章Innovus的时序报告解读,新版的貌似多了一些信息,比如CPPR Adjustment和Derate。不太清楚这两个是什么概念,搜索之后转载2篇后端工程师的博客如下: 搜到个这个网站好像有很多后端相关的知识点分享一哈: Co…

springboot+vue+mybatis计算机毕业设计电子产品交易系统+PPT+论文+讲解+售后

系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对电子产品交易管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

书店销售内部后台管理系统员工信息部门图书入库账目集成分析销售客户

本系统的设计实施为书店管理系统的运行做基础,为书店的管理提供良好的条件。系统主要实现了:员工信息管理、部门管理、图书管理、入库管理、账目集成分析、销售管理、客户管理。 2.1系统开发工具 本系统主要使用JSP技术对系统进行设计和开发。JSP拥有Jav…

上书房信息咨询:医疗满意度调研

随着人们生活水平的不断提高,医疗服务的需求日益增长。近期,上书房信息咨询受托完成了某市医疗市场的满意度调研,旨在深入了解市民对医疗服务的评价和需求,为提升医疗服务质量提供有力支持。 近年来,某市致力于推进医…

本地生活本地推软件有哪些?手把手教你从零开始提升转化率!

当前,多家互联网大厂在本地生活版块的布局不断深入,让本地生活市场不断焕发新活力的同时,也使得竞争态势日益激烈。在此背景下,对于本地生活服务商而言,无论是想要拓展品牌商家资源,还是想要改善交付效果&a…

Java毕业设计 基于SpringBoot vue药店管理系统

Java毕业设计 基于SpringBoot vue药店管理系统 SpringBoot 药店管理系统 功能介绍 管理员 登录 修改个人资料 密码修改 门店管理 销售业绩 药品管理 进货管理 库存管理 会员管理 员工管理 店长 登录 修改个人资料 密码修改 销售业绩 药品管理 进货管理 库存管…

【设计模式-策略】

定义 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响到使用算法的客户。通过使用策略模式,算法可以在运行时根据需要动态地进行更换,从…

Golang | Leetcode Golang题解之第372题超级次方

题目: 题解: const mod 1337func pow(x, n int) int {res : 1for ; n > 0; n / 2 {if n&1 > 0 {res res * x % mod}x x * x % mod}return res }func superPow(a int, b []int) int {ans : 1for _, e : range b {ans pow(ans, 10) * pow(a…

前端页面调用本地exe,打开exe主界面

一、文件配置 在桌面新建文件Start.txt 复制以下内容,保存后修改后缀名.txt为 .reg。 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Start] "URL Protocol""D:\\Task\\app.exe" "Start Protocol" [HKEY_CLASSES_ROOT\…

第20讲 动画讲解轻松学会STM32的PWM

来源:【STM32】动画讲解轻松学会STM32的PWM_哔哩哔哩_bilibili 基本概念 周期/频率 计算公式:PWM周期1个高电平用时1个低电平用时 PWM的频率1/周期 如图所示此时周期为1ms,即1s内存在1000组这样的高低电平,PWM的频率为1000hz。…

Python自动化办公2.0 课程更新

之前的课程,包含了Python pandassklearn 数据分析,和Stremlit 可视化仪表盘的开发 和一系列自动化项目案例的开发,包括我们封装了ztl-uia 模块,可以同时自动化操控windows 软件和浏览器, 封装的模块,针对为付费学员使…

使用 FinalShell 链接 Centos

1. 安装 FinalShell 下载地址:https://www.hostbuf.com/t/988.html 2. 查看 IP地址。 2.1 通过命令查询IP 输入 ip addr show 查询,输出效果如下截图,其中的 192.168.1.5 就是 IP 地址。 2.2 通过可视化界面查询IP 点击右上角的网络图标…

亲测分享:这个获客工具,精准又好用!

如何高效、精准地获取目标客户成为了每一家企业都面临的重大挑战。传统的获客方式不仅效率低下,而且成本高昂,往往难以达到预期的营销效果。 今天,我就作为一位亲身体验者,向大家分享这个精准又好用的获客工具——易拓客。 随时…

论文辅助笔记:Large Language Models are Zero-Shot Next LocationPredictors

论文理论部分:论文笔记:lunLarge Language Models are Zero-Shot Next LocationPredictors-CSDN博客 2 Data 2.1 Dataset类 2.2 下载文件 2.3 get_dataset 2.4 get_trajectories trajectory_split暂时略去 # save the test dictionary and the true l…

cad导出为jpg图片的方法,分享这三种方法

在工程设计、建筑设计或任何需要使用CAD(计算机辅助设计)软件的领域,将CAD图纸转换成JPG图片格式是日常工作中不可或缺的一环。无论是为了更便捷地在网络上分享设计稿,还是为了在非CAD环境中展示设计成果,掌握CAD到JPG…

CSS3视图过渡动画

概述 网站的主题切换无非就是文字、背景图片或者颜色,我们可以先来看下 Element UI 官网的切换主题的动效: PS:Antdesign UI的主题切换动画也是大同小异。 实现的两种方式 CSS 为主 <script setup> const changeTheme = (e) => {if (document.startViewTransi…

[数据集][目标检测]电力场景红外图像输电线路绝缘子检测数据集VOC+YOLO格式1846张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1846 标注数量(xml文件个数)&#xff1a;1846 标注数量(txt文件个数)&#xff1a;1846 标注…

2024年新算法-基于SBOA-BP混合神经网络的数据预测(Python代码实现)

在今天的数字化时代&#xff0c;机器学习和人工智能领域的不断发展为数据处理和预测提供了强大的工具。其中&#xff0c;BP神经网络&#xff08;反向传播神经网络&#xff09;作为一种经典的网络模型&#xff0c;因其能够处理复杂的非线性问题而备受关注。然而&#xff0c;传统…