网络编程——BIO与NIO介绍与底层原理

news2024/9/24 1:14:25

BIO

BIO(Blocking IO) 又称同步阻塞IO,一个客户端由一个线程来进行处理

请添加图片描述

当客户端建立连接后,服务端会开辟线程用来与客户端进行连接。以下两种情况会造成IO阻塞:

  1. 服务端会一直阻塞,直到和客户端进行连接
  2. 客户端也会一直阻塞,直到和服务端进行连接

基于BIO,当连接时,每有一个客户端,服务就开启线程处理,这样对资源的占用时非常大的;如果使用线城市来做优化,当大量连接时,服务端也会面临无空闲线程处理的问题。那么怎么设计才能让单个线程能够处理更多请求,而不是一个。所以NIO就被提出。

NIO

NIO(Non Blocking IO)又称同步非阻塞IO。服务器实现模式为把多个连接(请求)放入集合中,只用一个线程可以处理多个请求(连接),也就是多路复用。

NIO有3大核心组件:

  1. Buffer:缓冲区,buffer 底层就是数组
  2. Channel:通道,channel 类似于流,每个 channel 对应一个 buffer缓冲区
  3. Selector:多路复用器,channel 会注册到 selector 上,由 selector 根据 channel 读写事件的发生将其交由某个空闲的线程处理

请添加图片描述

这样就大大提升了连接的数量,用于接收请求。

NIO目前有三个函数(模型)

  • select
  • poll
  • epoll

Select函数

Select 是Linux提供的一个函数,可以将一批fd一次性传递给内核,然后由内核去遍历,来确定哪个fd符合,并提供给用户空间
请添加图片描述

Select 函数处理过程

  1. 将用户空间的fd数组拷贝到内核空间
  2. 内核空间会遍历fd数组,查看是否有数据到达
    1. 遍历所有fd,将当前进程挂到每个fd的等待队列中
    2. 当设备收到一条消息(网络设备)或填写完文件数据(磁盘设备)后,会唤醒设备等待队列上睡眠的进程,随后当前进程就会被唤醒
  3. 遍历完成后,如果有数据到达,返回有数据到达的fd的数量,并对用户空间的fd标记
  4. 如果无数据到达,则当前进程进入睡眠,当有某个fdI/O事件或当前进程睡眠超时后,当前进程重新唤醒再次遍历所有fd文件
  5. 用户空间再此循环遍历,没有标记fd 不处理,只有标记fd才会去处理

Select存在的问题

  1. fd数量有限制:单个进程所打开的fd是有限制的,通过 FD_SETSIZE 设置,默认1024
  2. fd拷贝耗时:每次调用 select,需要将fd数组从用户空间拷贝到内核空间
  3. 内核空间遍历耗时:内核空间通过遍历的方式,查看fd是否有数据到达,这是一个同步的过程
  4. 找到fd后,返回的是数量,而不是fd本身select返回的是fd的数量,具体是哪个还需要用户自己遍历

Poll函数

Poll 也是Linux提供的内核函数,pollselect 基本是一致,唯一的区别在于它们支持的fd的数量不一致

  • select : 只能监听 1024 个fd
  • poll :无限制,操作系统支持多少,poll 就可以支持多少

Epoll函数

poll解决了select函数的fd数量问题,而epoll解决了selectpoll函数其余问题:

  1. fd数量有限制poll已经解决此问题

  2. fd拷贝耗时:内核空间种保存一份fd数组,无需用户每次都重新传入,只需要告诉内核修改的部分即可

  3. 内核空间遍历耗时:内核空间不再通过遍历的方式找fd,而是通过异步 IO 事件唤醒

  4. 找到fd后,返回的是数量,而不是fd本身:内核空间会通过异步 IO 事件,将fd返回给用户,用户无需在遍历整个fd数组
    请添加图片描述
    因此,epoll提供3 个函数,来处理上述改进的方案:

  5. epoll_create:创建 epoll 句柄

  6. epoll_ctl:向内核空间添加,修改,删除需要监控的fd

  7. epoll_waitepoll_pwait:类似 select 函数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CPP 核心编程9-STL

STL初识 2.1 STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西C的面向对象和泛型编程思想,目的就是复用性的提升大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生了S…

四、文件管理(二)目录

目录 2.0文件控制块和索引结点 2.1目录的结构 2.1.1单级目录结构 2.1.2两级目录结构 2.1.3树形目录结构 2.1.4有向无环图目录结构 2.2目录的操作 2.4文件共享 2.4.1基于索引结点(硬链接) 2.4.2基于符号链(软链接) 2.0文…

前端开发是做什么的?工作职责

想要了解前端从业者的工作职责,需要从一个完整网站应用产生流程入手,一个网站应用从无到有的过程大致如下 : 1)产品经理与甲方反复沟通交流,逐步确定产品需求完成设计草图; 2)产品经理根据需求…

如何在centos上安装nvidia docker

当基于nvidia gpu开发的docker镜像在实际部署时,需要先安装nvidia docker。那么如何安装nvidia docker呢。下面将详细介绍下。 安装原生docker yum -y install docker-io 下载nvidia docker安装包 我下载的是rpm文件,具体见截图 安装nvidia docker…

word如何给论文加引用文献

给论文加引用文献其实差不多就是加了个链接,通过点击链接跳转到文末最后展示引用文献额作者,论文名等等信息,给论文加引用文献只要有一下几步: 一、设置参考文献标号字体格式 对于论文中的文献,首先设置论文前序号的…

redis基础6——缓存穿透、缓存击穿、缓存雪崩

文章目录一、缓存穿透(双库为空)1.1 基础概念1.2 解决办法1.2.1 业务层校验1.2.2 设置key过期时间1.2.3 布隆过滤器1.2.3.1 原理1.2.3.1.1 哈希函数使用1.2.3.1.2 布隆过滤器数据结构1.2.3.1.2.1 映射函数执行过程1.2.3.1.2.2 布隆过滤器的误判率1.2.3.2…

华为机试 - 最大化控制资源成本

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你设计算法帮他们解决一个任务混部问题: 有taskNum项任务,每个任务有开始时间&#xf…

数字图像处理实验(一)|图像的基本操作和基本统计指标计算

文章目录一、实验目的二、实验主要仪器设备三、实验原理(1)将一幅图像视为一个二维矩阵。(2)利用MATLAB图像处理工具箱读、写和显示图像文件。(3)计算图像的有关统计参数。(4)改变图像尺寸、旋转图像、裁剪图像四、实验内容(1)用imwrite写入图像(2) 用imread读入一幅图像(自选)…

opencv c++ 图像形态学操作

1、图像的形态学操作 包括图像的腐蚀、膨胀、开、闭、形态学梯度、顶帽、黑帽、分支主题、结构元素等操作。 具体概念参考:(41条消息) 图像处理-形态学处理_Gooddz的博客-CSDN博客_图像处理 形态学 1.1、膨胀 用33的核去扫描二值图像,当核与图像中的前景…

[附源码]JAVA毕业设计仟侬堂茶具网站(系统+LW)

[附源码]JAVA毕业设计仟侬堂茶具网站(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&a…

LeetCode中等题之查找和替换模式

题目 你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。 如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。 &#xff0…

Git(第二篇)——Git的常见操作

Git(第二篇)——Git的常见操作 目录Git(第二篇)——Git的常见操作一、Git版本控制介绍组成结构图命令速查常用命令二、下载并安装GIT设置字体查询git三、码云上的操作码云配置环境注册账号登录码云创建仓库创建远程仓库(在码云官网…

通讯录管理系统

目录 1.系统需求 2.创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1设计联系人结构体、设计通讯录结构体 5.2main函数中创建通讯录 5.3封装添加联系人函数 5.4测试添加联系人 6.显示联系人 7.删除联系人 7.1封装检测联系人是否存在 7.2删除联系人,测试删除联…

当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?

大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。 那你有没有想过一个问题,那就是当我们执行 java -jar 命令后,到底底层做了什么就启动了我们的 SpringBoot 应用呢? 或者说一个 S…

Redux使用详解(一) Redux的核心思想与基本使用

Redux 理解javascript纯函数 函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的范式,所以也有纯函数的概念; 在react开发中纯函数是被多次提及的; 比如react中组件就被要求像是一个纯函数(为什么…

使用STM32F103C8T自制freejoy控制板

1. 软件准备 1.1 STM公司的官方工具: STM32 ST-LINK Utility 已经更名为 STM32CubeProgrammer STSW-LINK004 - STM32 ST-LINK utility (replaced by STM32CubeProgrammer) - STMicroelectronics 1.2 FreeJoyConfiguratorQt V1.7.1 这个是刷好固件后的配置、调…

D-025 DP硬件电路设计

DP硬件电路设计1 简介1.1 DP接口分类1.2 DP接口和HDMI接口的区别1.3 DP接口的优势2 硬件层3 接口定义4 原理图设计1 简介 Display是一种新型的标准化的数字式视频接口标准,其支持的功能与HDMI相似,但是其目标是作为HDMI的补充,而非取代。DP …

红队渗透靶场之SickOs1.1

靶场考察知识 shellshock漏洞 shellshock即unix系统下的bash shell的一个漏洞, Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞, 向环境变量值内的函数定义后添加多余的字符串会触发此漏洞, 攻击者可利用此漏洞改变或绕过环境限制,以执行任意的sh…

Notepad++ ,json 、xml 格式化插件安装不了 和 github 网站访问不了 最佳解决方案

文章目录1.背景:2. 解决方法:方法一:修改hosts方法二: 通过 Watt Toolkit 加速1.简介:2.安装步骤:1.背景: 最近notpad 安装 JSON 和 xml 格式化工具安装不上,发现插件的地址 github…

docker之数据卷(Data Volumes)dockerfile

这里写目录标题宿主机与容器之间的文件拷贝数据卷数据卷容器Dockerfile自定义centos,具备vim及ifconfig作用(体会学习Dockerfile的意义)自定义tomcat8(熟悉几乎所有的Dockerfile命令)宿主机与容器之间的文件拷贝 引言…