深入理解Linux网络:第三章-内核是如何与用户进程协作的

2023-05-16

本章主要讲用户进程接收并处理数据,主要是介绍,同步阻塞和多路IO复用方案。

同步阻塞

一个进程维护一个链接,同时为了等待数据到来需要阻塞进程,还要切换进程上下文。

  1. 创建Socket
  2. 进入内核态,开始 recv data
  3. 没有当前socket到达的数据时(接收队列里面没有当前socket接收的数据),当前socket 进入等待队列
  4. 修改当前进程状态为 TASK_INTERRUPTIPLE 可中断状态,同时当前进程进入到阻塞状态,等待被唤醒。
  5. 数据包到达网卡(外界数据进来)
  6. 网卡把帧DMA到内存(RingBuffer)
  7. 硬中断通知CPU
  8. CPU 向内核线程发起软中断
  9. 内核线程从RingBuffer上摘下skb(数据包),并创建一个新的skb放上去
  10. 内核线程把数据放到socket接收队列上
  11. 唤醒等待队列上的进程

为什么叫做同步阻塞?

在第3步,socket 进入等待队列中,第4步,修改当前进程状态,然后当前进行就进入阻塞状态,然后就不能执行其他的命令了,需要等待对应socket的数据到来。

为什么会性能低呢?

有两次进程上下文的切换,第4步和第11步。第4步:为了等待当前进行阻塞状态,从CPU上拿下来,第10步:睡眠进程被唤醒执行。进程上下文的切换没有意义的工作。

IO多路复用-epoll

一个进程维护上万条链接,性能高效。

epoll

epoll 对象

  • wait_queue_head_t wq 等待队列链表,软中断数据就绪的时候会通过wq 来找到阻塞在epoll对象上的用户进程。
  • rb_root rbr 一颗红黑树,为了支持对海量链接的高效查找、删除、插入等。通过使用这棵树来管理用户进程下添加进来的所有socket链接。
  • list_head rdlist 就绪的描述符的链表,当有链接就绪的时候,内核会把就绪的链接放到 rdllist 里面,这样应用进程只需要判断链表就能找出就绪链接。

epoll 函数

  • epoll_create : 创建一个epoll对象
  • epoll_ctl : 想 epoll 对象添加要管理的链接
    • 分配一个红黑树节点对象epitem。
    • 将等待事件添加到socket的等待队列中,同时会注册一个 ep_poll_callback 函数,ep_poll_callback 目的是软中断将数据收到socket的接收队列后,会通过这个ep_poll_callback 函数进行回调,会讲当前socket 添加到rdlist(就绪链表中)。
    • 将epitem 插入到epoll 对象的红黑树。
  • epoll_wait : 等待其管理的链接上的IO事件 rdlist 是否有数据(就绪状态的socket)
    • 有就绪状态的socket,返回socket
    • 无就绪状态的socket,当前进程添加到 wq 等待队列中,然后挂起当前进程。等待有数据进来的时候被唤醒。

执行场景

方法名

功能

执行场景

epoll_create

创建一个epoll对象

程序初始化的时候创建

epoll_ctl

想 epoll 对象添加要管理的链接

socket建立链接的时候,socket创建好了,会创建epoll内核对象

epoll_wait

等待其管理的链接上的IO事件 rdlist 是否有数据

1、程序主动初始化的时候会开始epoll_wait 一次

2、等待队列被唤醒的时候会执行

有数据进来时

  1. 将数据保存到socket的接收队列中(这个队列是socket的,不是epoll的)
  2. 找到对应的回调函数,在创建socket的时候就会给这个socket注册一个回调函数(ep_poll_callback) 该过程在上述的epoll_ctl 函数中执行。
  3. 执行回调函数
    1. 通过红黑树找到对应的 epitem。
    2. 将当前 epitem 添加到对应的 epoll 的就绪队列中。
    3. 查看epoll 的等待队列是否有进程等待,如果有就唤醒进程。

问题

同步阻塞IO到底是有哪些开销?

  1. recv 系统调用的时候,如果没有数据了,当前进程就会从当前CPU上拿下来。导致一次进程上下文的切换。消耗cpu
  2. socket有需要就绪状态就要唤醒对应的进程起来处理数据。又一次进程上下文的切换。消耗cpu
  3. 一次请求需要一个进程,一个进程需要不少的内存。消耗内存

epoll 也是阻塞的?为什么可以提高网络性能?

epoll的执行流程肯定也是阻塞的,在执行epoll_wait 的时候,如果没有就绪的socket,那他就会被阻塞挂起。当时这并不影响他的性能,因为一个epoll 管理上万个链接,所以上万个链接没有就绪状态的情况比较少。所以并不会出现频繁的挂起现象。这其实就是它性能好的关键。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解Linux网络:第三章-内核是如何与用户进程协作的 的相关文章

  • 数据结构——结构体

    结构体是一种复合数据类型 xff0c 定义了一组变量列表 xff0c 这些变量将放在一个内存块中的名称下 它允许通过使用指向结构的一个指针来访问不同的变量 struct structure name data type member1 da
  • python 归并排序

    归并排序 xff08 Merge Sort xff09 是一种典型的递归法排序 它把复杂的 排序过程分解成一个简单的合并子序列的过程 至于怎么得到这个子 序列 xff0c 就得自己调用自己了 归并排序首先要做的就是将数列分成左右两部分 xf
  • ROS学习笔记—— rospy

    所有资料均来自于 https www icourse163 org learn ISCAS 1002580008 learn announce 和 https github com DroidAITech ROS Academy for B
  • XCOM(串口监视器,无单片机)+ESP8266显示心知天气天气信息

    XCOM xff08 串口监视器 xff0c 无单片机 xff09 43 ESP8266显示心知天气天气信息 ESP8266 AT指令显示 这是第一次写博客 xff0c 写的内容尽量通俗易懂贴近生活 PS 写的不好务必不要打我 ESP826
  • Linux编程——交叉编译器基本指令介绍

    Linux编程 交叉编译器基本指令介绍 arm span class token operator span linux span class token operator span gnueabihf span class token o
  • 马尔可夫链蒙特卡洛采样(MCMC)

    首先我们要明确的是马尔可夫链蒙特卡洛采样以下简称MCMC xff0c 它首先是个采样方法 1 采样的目的 采样作为任务 xff0c 用于生成新的样本求和 求积分 比如我们知道样本z的后验分布 我们经常会有一个需求 xff0c 得到目标函数f
  • dlang语法的简单整理

    dlang整理 为什么使用dlang 优点 xff1a 快速 xff0c 开发高效的 xff0c 方便 xff0c 无虚拟机的 xff0c 快速的 xff0c 高性能的 垃圾回收 缺点 xff1a 语法较为复杂 xff0c 支持gc 曾经很
  • docker 搭建基于prometheus的监控体系

    Prometheus是一个时间序列数据库 但是 xff0c 它不仅仅是一个时间序列数据库 它涵盖了可以绑定的整个生态系统工具集及其功能 Prometheus主要用于对基础设施的监控 包括服务器 xff0c 数据库 xff0c VPS xff
  • React回退上个页面及跳转下个页面

    回退上个页面 React 不保存数据 span class token keyword this span span class token punctuation span props span class token punctuati
  • Linux上jar包运行,但是接口测试Connect超时

    工作过程中遇到的 xff0c 这个异常就是连接超时 引起连接超时的问题有很多 xff0c 因为是feign调用超时 xff0c 我第一时间没怀疑是不是我的程序无法访问 xff0c 我一直怀疑是feigin那部分出错了 xff0c 什么跨服务
  • 网络调试助手(pc端)+ESP8266指令

    一 所需软件 链接 xff1a https pan baidu com s 1ycyOSZJOsiIocY3umrG7 g 提取码 xff1a 38f2 链接 xff1a https pan baidu com s 1EUuXUKcvf A
  • AD、PADS、allegro 哪个好用?

    AD PADS allegro 哪个好用 xff1f 用哪个都没问题 xff0c 都能完成任务 xff0c 主要看公司的选择了 AD是元老级的软件了 xff0c 也是PCB设计最先出的软件 xff0c 使用最为广范 在很多操作上都非常的人性
  • 基于python+pyqt5的串口助手

    基于python 43 pyqt5的串口助手 环境 xff1a pycharm python3 8 xff0c pyqt5 xff0c pyserial xff08 需要该节的工程文件 请私信 xff0c 或加VX xff1a Crazzy
  • STM32F4四轴飞行器总结

    xff08 菜鸡一枚 xff0c 记录一些学习的体会 xff0c 并记录了学习时提出的问题 xff0c 便于自己再次查阅 xff0c 若有错误之处 xff0c 希望大佬们指正 xff0c 谢谢 xff09 四旋翼简介 xff1a 嵌入式芯片
  • 详解RTK,RTD,SBAS,WAAS,PPP,PPK,广域差分等技术之间的关系与区别

    RTK与RTD的区别 xff0c 一个是载波相位差分 一个是码差分 xff0c 并且RTK的定位精度要高一些 RTK与PPK的区别 xff0c 一个是实时提供数据信息 xff0c 一个是事后处理 WAAS是SBAS系统一个具体的实例 xff
  • c实现set集合

    集合有点编程语言会带有 xff0c 有的没有 但是我想redis的集合set你一定听说过或者用过 下面咱们用链表来实现set 相信有了前面的基础我们可以很容易的实现set集合 需要引入我的链表的list c和list h 头文件 span
  • 实时单目物体SLAM Real-time Monocular Object SLAM

    2015 摘要 xff1a 我们提出了一个基于对象的实时SLAM系统 xff0c 该系统利用了迄今为止最大的对象数据库 我们的方法包括两个主要部分 xff1a 1 xff09 利用对象刚性约束改进地图并找到其真实比例的单目SLAM算法 xf
  • linux下多线程服务器编程

    前言 xff1a 整个程序的架构就是一开始创建一个线程 xff0c 在这个线程里面做下面几个操作 xff1a 1 调用socket xff0c 创建监听客户端的socket 2 设置socket属性 xff0c 端口可以重用 3 调用bin
  • MavLink简单使用

    参考连接 xff1a https mavlink io zh 整体说明 本文不探究mavlink协议的具体内容 xff0c 只说明如何简单使用 环境 xff1a win10 c c 43 43 MAVLink仓库clone 我们其实clon
  • gazebo支持的载具类型

    类型make指令四旋翼make px4 sitl gazebo具有光流的四旋翼make px4 sitl gazebo iris opt flow3DR Solo xff08 四旋翼 xff09 make px4 sitl gazebo s

随机推荐

  • YoLov3目标检测代码C++版本运行

    论文地址 xff1a YOLO YOLOv2 YOLO9000 YOLOv3 YOLOv4 YOLO系列权重 配置文件下载地址 xff1a https github com AlexeyAB darknet 代码解读 xff1a Deep
  • C++ ::

    表示作用域 xff0c 和所属关系 是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0c 用法 xff08 name 2 class scope 类作用域符 xff09 xff0c
  • 下载Gazebo模型

    下载Gazebo模型 这时运行下面Gazebo命令 xff0c OK xff0c 错误没有了 xff0c 但怎么是一抹黑啊 xff01 roscore amp rosrun gazebo ros gazebo 首次运行Gazebo xff0
  • Linux 项目实战记录

    1 阻塞 非阻塞 同步 异步 网络IO 典型的一次IO的两个阶段是什么 xff1f 数据就绪和数据读写 数据就绪 xff1a 根据IO操作的就绪状态 阻塞 xff1a 1 调用IO方法的线程进入阻塞状态 xff0c xff08 函数进入wa
  • Mission Planner日志分析

    将找到的不同平台的Mission planner日志分析资源汇总起来以便以后查看 xff1a Pixhawk无人机教程 8 1 在Mission Planner中下载与分析日志 APM 自动拍摄后期POS数据 APM和PIX飞控日志分析入门
  • 关于iai_kinect2中标定数据的个人理解

    iai kinect2 kinect2 bridge data 196605135147 iai kinect2 kinect2 bridge data 299150235147
  • mac地址的作用

    最近读一本关于linux编程的书籍 xff0c 看到一部分很迷茫 xff0c 忽然不知道mac地址的作用 xff0c 既然已经有了ip地址了要mac地址何用呢 xff1f MAC地址是数据链路层的地址 xff0c 如果mac地址不可直达 直
  • putty远程连接服务器,显示超时,网络么有问题

    今天用putty连接阿里云服务器时 xff0c 用ip连接一直显示超时 换了端口号也没用 xff0c 最后 xff0c 重启了一下服务就好了 xff0c 记录一下以免以后碰到
  • CUDA11.x VS2017编译报错MSB3721

    问题原因 xff1a 11 XCUDA版本太高 xff0c 用10版本的就行了 博主电脑是联想拯救者3070显卡 xff0c 于是就按照网上的教程下载了适合我NVIDIA版本11 4的CUDA 按照网上配置弄完之后 xff0c VS2017
  • Ubuntu 使用VNCserver远程连接灰屏问题的解决方案

    问题 xff1a Ubuntu需要使用VNCserver服务提供远程桌面 xff0c 使用TightVNC Viewer远程连接主机 xff0c 发现只能出现三个正常显示的桌面 xff0c 继续开更多的桌面 xff0c 就会发现新开的窗口都
  • opencv-python(六):颜色空间及转换

    0 颜色模式 RGB 模式 百万种颜色 CMYK 模式 四种印刷色 索引模式 256 种颜色 xff09 灰度模式 256 级灰度 xff09 位图模式 两种颜色 xff09 0 1 灰度模式 也就是灰度图 黑白照片 xff0c 每个像素只
  • python爬虫之多线程、多进程爬虫

    一 原因 多线程对爬虫的效率提高是非凡的 xff0c 当我们使用python的多线程有几点是需要我们知道的 xff1a 1 Python的多线程并不如java的多线程 xff0c 其差异在于当python解释器开始执行任务时 xff0c 受
  • Ubuntu16 ROS ORB-SLAM3 intelD435与单目USB_CAM 跑自己的摄像头运行成功记录

    我也是根据其他人的教程来的 xff0c 其实我应该搞错了顺序 xff0c 按道理是先安装ROS xff0c 然后是D435驱动 xff0c 再下载ORBSLAM3 再编译SLAM3的非ROS xff0c 再编译SLAM3的ROS 但是这个顺
  • stm32 驱动ADXL345传感器例程(IIC驱动,可自行改SPI方式)

    stm32 驱动ADXL345传感器例程 xff08 IIC驱动 xff0c 可自行改SPI方式 xff09 前言一 介绍ADXL345传感器二 STM32驱动使用步骤1 配置IIC通信协议2 寄存器初始化配置3 读入数据串口打印 三 成果
  • (6)gazebo打开后黑屏,提示preparing your world

    问题描述 xff1a 运行roscore xff0c 再运行rosrun gazebo ros gazebo xff0c 可以打开gazebo xff0c 但是发现界面会发现一直处于黑屏这种状态 xff0c 提示preparing your
  • 树莓派3B+(64位)安装Ubuntu mate 16.04.2以及彩虹屏解决方案及相关文件

    1 烧录工具 链接 xff1a https pan baidu com s 1c5Vf9zzpCBySEyBNP 7nw pwd 61 1234 提取码 xff1a 1234 2 树莓派3B 43 xff08 64位 xff09 Ubunt
  • [shopee内推] 前端、后端、测试目前公司拉美市场急缺人才

    待遇超级好 薪资超级高 工作地点 xff1a 深圳 可直接发送简历到 xff1a ziwen jiang 64 qq com 可加微信 xff1a JZWen tiger 职位描述 岗位职责 xff1a 1 参与面向东南亚等地区的线上 am
  • mac xcode出现xxx.h没有出现的问题

    mac xcode出现xxx h没有出现的问题 xff0c 在命令行使用g 43 43 lxx编译代码却完全没有问题 xff0c 得出的结论是xcode的配置不到位 找了半个小时没找到莫名的烦躁 xff0c 使用xarman studio
  • 深入理解Linux网络:第二章-内核是怎么接收数据包的?

    关于中断 内核和网络设备驱动都是通过中断的方式来处理的 当然中断分为两种 xff0c 硬中断和软中断 当设备有数据进来了 xff0c 设备首先会触发硬中断 xff0c 因为处理数据需要耗费很长的时间所以CPU肯定是要把耗时的事情交给别人去干
  • 深入理解Linux网络:第三章-内核是如何与用户进程协作的

    本章主要讲用户进程接收并处理数据 xff0c 主要是介绍 xff0c 同步阻塞和多路IO复用方案 同步阻塞 一个进程维护一个链接 xff0c 同时为了等待数据到来需要阻塞进程 xff0c 还要切换进程上下文 创建Socket进入内核态 xf