某林操作系统——网络系统

什么是零拷贝?

DMA技术:使用一个DMA控制器将数据从硬盘传输到内存,除了一开始调用DMA控制器发起传输,数据搬运全称不需要CPU参与。

发送一段数据到网上如下所示

4次状态切换4次拷贝。

为了加快速度就要减少上下文切换,减少拷贝次数。

mmap+write() 

共发生3次拷贝,4次上下文切换。

sendfile

发生两次上下文切换和两次拷贝。

IO多路复用——select/ poll / epoll

基本socket模型

socket是进程通信的一种方式,服务端的一个socket会被绑定一个ip+端口。

然后等待客户端的connect()。TCP连接的具体去看网络的内容。

如何服务更多的用户?

服务器理论上能服务的客户端的TCP数量=ip*端口数。ip有2^32,端口有2^16,所以最多有2^48个客户端。

这也只是理论。

这受限于两个条件:

        系统内存:每个TCP连接都是要占用一定内存的。

        文件描述符:socket在系统里面也是一个文件,对应一个文件描述符。在linux中,能同时打开的文件描述符数量是有限的。

多进程模型

基于原始的阻塞网络IO,如果要支持多个客户端,可以使用多进程模型,为每个客户端分配一个进程。

服务器的主进程负责监听socket,与客户端连接完成之后调用accept()得到一个“已连接socket”,然后就可以直接fork一个子进程去使用已连接socket和客户端通信。

弊端:客户端数量越多,进程越多,上下文切换也越久。

多线程模型

为了解决多进程上下文切换重的问题,可以使用多线程模型。为了防止创建和销毁线程的开销,使用线程池技术,有一个客户端连接就取一个线程出来去拿一个已连接socket.

弊端:如果要应对1万个客户端就要有1万个线程,操作系统还是抗不住。

I/O 多路复用

一个请求分配一个进程/线程不可行,那就一个进程/线程负责多个socket.

Redis里面也是用到了这个。

为了实现多路复用,需要用到内核提供给用户态的多路复用系统调用select/poll/epoll ,进程可以通过一个系统调用函数从内核中获取多个事件

select/poll/epoll 是如何获取网络事件的呢?在获取事件时,先把所有连接(文件描述符)传给内核,再由内核返回产生了事件的连接,然后在用户态中再处理这些连接对应的请求即可。

select/poll/epoll

select是直接将所有已连接socket放到一个文件描述符集合,然后调用select将其拷贝到内核,让内核检查是否有事件发生,有的话标记socket为可读或可写。然后将其拷贝到用户态,用户态遍历对可读可写的socket进行操作。在linux里面最多只能监听1024个文件描述符。

poll采用链表的形式组织socket,不受1024的数量限制,受文件描述符的数量限制。本质上和select没有区别。操作方法雷同。

epoll

 边缘触发和水平触发

高性能网络模式——Reactor

redis,nginx,netty中都有采用这个模式。

redis高性能的原因有IO多路复用。Reactor模式是对IO多路复用的一个封装。

Reactor 模式主要由 Reactor 和处理资源池这两个核心部分组成,它俩负责的事情如下:

  • Reactor 负责监听和分发事件,事件类型包含连接事件、读写事件;
  • 处理资源池负责处理事件,如 read -> 业务逻辑 -> send;

单Reactor 单进程/线程

Redis6.0之前里面用的就是这个模式,redis性能的瓶颈不在CPU上,所以6.0之前引入了多线程去处理网络IO。 6.0之前是一个线程还要进行IO数据的拷贝,6.0开始主线程就只负责执行命令了。引入了多线程去处理IO数据。

单Reactor 多线程 / 多进程

多Reactor 多进程 / 线程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全防御【防火墙安全策略用户认证综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤 1、打开ensp防火墙的web服务(带内管理的工作模式) 2、在FW1的web网页中网络相关配置 3、交换机LSW6(总公司)的相关配置: 4、路由器相关接口配置&a…

【深度学习入门篇 ⑦】PyTorch池化层

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥是否存在(ArkTS)】

查询密钥是否存在(ArkTS) HUKS提供了接口供应用查询指定密钥是否存在。 开发步骤 指定密钥别名keyAlias,密钥别名最大长度为64字节。初始化密钥属性集。用于查询时指定密钥的属性TAG,比如查询的密钥范围(全量/单个),当查询单个时&#xff…

工时计算软件比较:哪些功能是必需的?

国内外主流的10款工时计算软件对比:PingCode、Worktile、蓝凌OA、用友软件、金蝶软件、智能人事、Time Doctor、Toggl Track、Clockify、Harvest。 在选择合适的工时计算软件时,很多企业面临的一个主要痛点是如何找到既能满足功能需求又具有成本效益的解…

虚拟机及其Debian(kali)安装

本机电脑为Windows10系统专业版,在此基础上安装VMware和系统(Kali) 步骤如下 一、安装 VMware Workstation Pro v16.2.4 安装步骤可参照网上博客,该步骤较简单,此处不做讲解。文件中共计两个,其中一个是激活…

YOLOv8白皮书-第Y8周:yolov8.yaml文件解读

本文为365天深度学习训练营中的学习记录博客 原作者:K同学啊|接辅导、项目定制 请根据YOLOv8n、YOLOv8s模型的结构输出,手写出YOLOv8l的模型输出 文件位置:./ultralytics/cfg/models/v8/yolov8.yaml 一、参数配置 # Parameters nc: 80 # n…

android APP在蓝牙模拟键盘扫描条码设备开机时闪退

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

下载安装VSCode并添加插件作为仓颉编程入门编辑器

VSCode下载地址:下载 Visual Studio Code - Mac、Linux、Windows 插件下载:GitCode - 全球开发者的开源社区,开源代码托管平台 仓颉社区中下载解压 cangjie.vsix 插件 打开VSCode 按 Ctrl Shift X 弹出下图 按照上图步骤依次点击选中我们下…

【Unity2D 2022:UI】制作主菜单

一、创建主菜单游戏场景 1. 在Scenes文件夹中新建一个游戏场景Main Menu 2. 为场景添加背景 (1)创建画布Canvas (2)在Canvas中创建新的空游戏物体Main Menu (3)在Main Menu中新建一个图像游戏物体Backgrou…

c++基础(1)

c语言是结构化和模块化的语言,用于处理规模较小的程序。当问题需要高度抽象和建模时,c语言不适合。c是基于c语言产生的,既可以进行c语言过程化程序设计,又可以以抽象数据类型为特点的基于对象的程序设计,还可以进行面向…

pico+unity手柄和摄像机控制初级设置

1、摄像头配置 摄像头模式、floor是追踪原点类型(将根据设备检测到地面的高度来计算追踪原点), Device 模式时,为通常理解的 Eye 模式,不会将根据设备检测到地面的高度来计算追踪原点 选择floor时,修改相…

达梦数据库的系统视图v$recover_status

达梦数据库的系统视图v$recover_status 在达梦数据库(DM Database)中,V$RECOVER_STATUS 是一个系统视图,用于显示数据库的恢复状态信息。这个视图对于数据库管理员来说非常重要,尤其是在数据库发生故障需要进行恢复操…

Claude 3.5 Sonnet模型发布,对比ChatGPT4o孰强孰弱

Anthropic 这家生而为打击 OpenAI 安全问题的公司,正式发布了Claude 3.5 Sonnet模型! 用官网的话就是: 今天,我们推出了 Claude 3.5 Sonnet,这是我们即将推出的 Claude 3.5 型号系列中的第一个版本。Claude 3.5 Sonne…

批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现

本次文章更新内容,图片以及扫描的PDF也可以支持批量提取指定区域内容了,主要是通过截图指定区域,然后使用OCR来识别该区域的文字来实现的,所以精度可能会有点不够,但是如果是数字的话,问题不大;…

在线工具--将Json结构映射为另外一种Json结构

具体请前往:在线工具-将json结构映射为另外一个json结构

Home Assistant在windows环境安装

Home Assistant是什么? Home Assistant 是一个开源的智能家居平台,旨在通过集成各种智能设备和服务,提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备,包括灯光、温度、安全系统、…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷:P1601 AB Problem(高精&#x…

JVM知识点

一、java内存区域与内存异常 1、运行时数据区域 1)程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里 [1] ,字节码…

降本增效CRKD:通过跨模态知识蒸馏增强相机与毫米波雷达目标检测精度

Abstract 在自动驾驶的3D目标检测领域,激光雷达-摄像头(LC)融合是表现最好的传感器配置。然而,激光雷达的成本相对较高,这阻碍了该技术在消费者汽车中的普及。相反,摄像头和雷达已经普遍部署在现有车辆上&…

Springboot整合MyBatis实现数据库查询(二)

目录 第一章、准备1.1)准备数据库表1.2)创建springboot项目,添加依赖1.3)使用mybatis逆向工程 第二章、代码开发2.1)建包并编写代码2.2)application配置文件2.3)设置编译位置 第三章、测试访问3…