图解通用网络IO底层原理、Socket、epoll、用户态内核态······

news2024/10/5 15:45:43

LInux 操作系统中断

什么是系统中断

这个没啥可说的,大家都知道;

CPU 在执行任务途中接收到中断请求,需要保存现场后去处理中断请求!保存现场称为中断处理程序!处理中断请求也就是唤醒对应的任务进程来持有CPU进行需要的操作!

有了中断之后,提升了操作系统的性能!可以异步并行处理很多任务!

  • 软中断(80中断)

由CPU产生的;CPU检查到程序代码段发生异常会切换到内核态;

  • 硬中断

由硬件设备发起的中断称为硬中断!可以发生在任何时间;比方说网卡设备接收到一组报文;对应的报文会被DMA设备进行拷贝到网卡缓冲区!然后网卡就会向CPU发起中断信号(IRQ):

CPU收到信号后就会执行网卡对应的中断处理程序!

内核在系统中断时做了什么事

每种中断都有它对应的中断处理程序;

对应到内核的某一个代码段;

CPU接收到中断后;首先需要将寄存器中数据保存到进程描述符!PCB!

随后切换到内核态处理中断处理程序!执行网卡的程序;

执行完毕之后切换到用户态,根据PCB内容恢复现场!然后就可继续执行代码段了!

硬件中断触发的过程

中断请求寄存器: 保存需要发送中断请求的设备记录!

优先级解析器:中断请求是有优先级之分的,因为CPU不能同时执行多个中断请求!

正在服务寄存器:正在执行的请求!比方我正在打字,这里面记录的就是键盘IRQ1 !

操作系统启动时需要将硬件向量值与处理程序地址进行映射!当硬件发送中断信息时只会发送向量值,通过匹配找到对应的处理程序!

Socket基础

Socket读写缓冲区机制

所谓socket,在底层也无非就是一个对象,通过对象绑定两个缓冲区,也就是数据队列,然后调用系统API对这两个缓冲区的数据进行操作罢了!

发数据;用户态转内核态,将数据拷贝到send缓存区,然后调用write系统调用将数据拷贝到网卡,再由网卡通过TCP/IP协议进行数据包的网络发送!

socket两种工作模式

  • BIO

总结:读数据读不到就一直等,发数据发不了就一直等!

  • NIO

读数据读不到就等一会再读,取数据取不到就等一会再取!

接受端缓冲区打满了,线程又抢占不到CPU去清理缓冲区,怎么办!

最后发送端的数据缓冲区也会被打满!

系统调用;用户态------内核态

  • 系统调用:

int 0X80对应的就是系统调用中断处理程序;向量值为128;system_call;


IRQ是有限的,不可能为每一个系统调用都分配一个向量值,所以统一使用80中断来进行系统调用的路由!

相关视频推荐

linux内核《epoll源码分析》

epoll实战揭秘-支撑亿级IO的底层基石

剖析Linux内核《中断管理技术栈》

学习地址:c/c++ linux服务器开发 /后台架构师

需要C/C++ Linux服务器架构师学习资料加qun579733396获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

为什么要有这两种状态

指令的危险程度不一样;

对于不同的指令,为了保证系统安全,划分了用户空间和内核空间;

linux中:0表示内核态,3表示用户态!

所以:linux在创建进程的时候就会为进程分配两块空间;

用户栈:分配变量,创建对象

内核栈:分配变量!

什么时候进程进行切换至内核态

硬中断;

用户态中代码出现错误也要切换!

进程切换时都做了什么

CPU中存在很多寄存器

这些寄存器保存了进程在进行运算时的一些瞬时数据;如果现在要进行进程切换了;这些数据都需要找个地方保存起来;那么保存到哪里呢?

进程PCB:在OS创建进程的时候同时也会分配一段空间存放进程的一些信息;其中就有一个字段指向一个数据结构;叫做进程控制块PCB:

用来描述和控制进程的运行的一个数据结构——进程控制块PCB(Process Control Block),是进程实体的一部分,是操作系统中最重要的记录型数据结构。

  • PCB是进程存在的唯一标志

  • 系统能且只能通过PCB对进程进行控制和调度

  • PCB记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息

所以:在进程进行切换的时候CPU中的数据保存到了PCB中,供CPU回来时读取恢复!

Linux select 多路复用函数

select就是一个函数:只要传入相应的参数就能获得相应的数据:

1、们所关心的文件描述符fd;

2、描述符中我们关心的状态:读事件、写事件、等

3、等待时间

调用结束后内核会返回相关信息给我们!

做好准备的个数

哪些已经做好准备;有了这些返回信息,我们就可以调用合适的IO函数!这些函数就不会再被阻塞了;-

函数详解

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, timeval *timeout)
    
- maxfdp1 readset 和 wirteset中的最大有数据位
- readset  bitmap结构的位信息;保存我们需要读取的socket序号;
- writeset 写数据信息
- exceptset 异常信息

select函数这里不再细讲,可以翻看以前的文章

将函数需要的参数准备好之后调用select;

select进行80中断;将rset数据拷贝到内核中;查询对应的状态之后设置rset对应的位置值,

完成后又拷贝到用户态中的rset;这样一来rset里面的位信息就代表了哪些socket是准备好了的!

随后遍历这些位信息就可以调用read或wirte进行缓冲区的操作了!

缺点

可以看到,while死循环中每次执行都将rset重新置位;然后循环重新SET位信息;随后才会发起请求!过程较为繁琐且重复!

select多路复用器底层原理分析

epoll函数

了解到select的缺点后发现:select每次得到数据都要进行复位,然后又进行重复的步骤去内核中获取信息;感觉就是很多时间都花在重复的劳动上,为了解决这个问题,linux在2.6引入epoll模型,单独在内核区域开辟一块空间来做select主动去做的事,select是主动查,epoll则是准备数据,线程来了直接取就行了;大大提升了性能

既然是函数,看看相关的函数实现:

实现思路:

在内核创建一块空间;总所周知;linux下一切皆文件;所以所谓创建的空间也就是一个文件描述符fd,然后这个文件结构中有两个指针指向另外两个地址空间:事件队列、就绪队列

事件队列:存放已经建立所有socket连接

就绪队列:准备就绪的socket;也就是read或write的时候不用阻塞的socket;

其实epoll就像一个数据库;里面有两个数据表;一个放连接列表;一个放准备就绪的连接列表;

既然有这两个队列;就要涉及到增删查;这就是另外两个函数的来由;

创建epoll空间
int epoll_create(int size);


int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

对事件队列进行增删改:

epfd : epoll的文件描述符号:因为内核中可能有多个epoll

op : 参数op有以下几个值: EPOLL_CTL_ADD:注册新的fd到epfd中,并关联事件event; EPOLL_CTL_MOD:修改已经注册的fd的监听事件; EPOLL_CTL_DEL:从epfd中移除fd,并且忽略掉绑定的event,这时event可以为null;

fd : 表示socket对应的文件描述符。

epoll底层原理解析

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

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

相关文章

Mac 使用Docker安装Elasticsearch、Kibana 、ik分词器、head

安装ElasticSearch 通过docker安装es docker pull elasticsearch:7.8.1 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

减调食谱攻略:美味低卡又健康

早餐主要求质,也就是求营养,更确切的说是“均衡的营养,多重的营养元素”确保每天早餐不重样就差不多了。 早餐主食:蛋羹、糖心水煮蛋,皮蛋瘦肉粥、南瓜粥、小米粥,蒸煮玉米、南瓜、芋头、红薯,…

深度神经网络——什么是深度强化学习?

除了无监督机器学习和监督学习之外,人工智能创造的另一种常见形式是强化学习。除了常规的强化学习之外, 深度强化学习 由于它结合了深度学习和强化学习的最佳方面,因此可以带来令人惊讶的令人印象深刻的结果。让我们具体看看深度强化学习是如…

李廉洋:6.6黄金原油怎么看?今日行情分析及最新策略。

黄金消息面分析:美指走强未能抑制金价升势。黄金价格大幅上涨,在美国公布喜忧参半的经济数据后,金价与周二的走势发生180度大转弯,这些数据可能保证美联储设定的借贷成本降低。美国10年期基准国债收益率下跌3个基点,至…

项目进度管理必备:15款最佳项目进度跟踪工具推荐

15好用的款主流项目进度管理软件:PingCode、Worktile、Trello、Tower、Asana、Smartsheet、Teambition、ClickUp、Wrike、Monday.com、Notion、禅道、飞书、云效、蓝凌。 严格的进度管理有助于更好地控制项目进展,提升团队效率,最终实现项目成…

Android音频进阶之1.0到14.0音频焦点变化(七十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

小白学linux | 使用正则表达式审计ssh登录ip地址

Ubuntu /var/log/auth.log记录了所有与身份验证相关的事件,包括SSH登录尝试 grep -i "failed password" /var/log/auth.log | \awk {if($11 ~/^[0-9]\.[0-9]\.[0-9]\.[0-9]$/)print $11 ; else print $13} | \uniq -c | sort -nr -k1 RedHat系发行版 /va…

MK米客方德 SD NAND与文件系统:技术解析与应用指南

随着数字存储技术的飞速发展,SD NAND(贴片式T卡)已成为我们日常生活中不可或缺的存储工具。我们将深入探讨SD NAND的文件系统,特别是SD 3.0协议支持的文件系统类型,以及它们在实际应用中的作用和用户可能遇到的问题。 MK米客方德的…

微前端之旅:探索Qiankun的实践经验

theme: devui-blue 什么是微前端? 微前端是一种前端架构方法,它借鉴了微服务的架构理念,将一个庞大的前端应用拆分为多个独立灵活的小型应用,每个应用都可以独立开发、独立运行、独立部署,再将这些小型应用联合为一个完…

[pixi.js] 入门简单案例 简易时钟

老实说pixi虽然之前拿来做个几个简单的游戏,但是是好久前的了,又忘了,现在算是重新入门。 官网版本已经更新到v8去了,而react相关的pixi库pixi-react 虽然支持react18 但还是v6-v7的版本,既然已经看了v8的文档&#xf…

解决富文本中抖音视频无法播放的问题——403

问题 富文本中的抖音视频无法播放,资源状态码是403禁止访问打开控制台,可以看到在项目中打开,数据请求的请求头多了一个Referer: http://localhost:3000/而复制链接在新窗口直接打开,请求头中并不会携带Referer 解决方案 在ind…

书客护眼大路灯Sun再次引领先锋,守护青少年视力健康!

在这个信息化高速发展的时代,我们的眼睛承受着前所未有的压力。每年的护眼日,不仅是提醒我们关注眼睛健康的时刻,更是全社会共同努力,为青少年营造健康用眼环境的契机。 “守护明亮视界,预防近视从我做起”。随着国内青…

【Vue2源码学习分析】

# 文件结构 源码目录 # 调试环境搭建 安装依赖: npm i安装rollup: npm i -g rollup修改dev脚本,添加sourcemap,package.json "dev": "rollup -w -c scripts/config.js --sourcemap --environment TARGET:web- full-dev",运行开发命令…

SkyWalking之P0业务场景输出调用链路应用

延伸扩展:XX业务场景 路由标签打标、传播、检索 链路标签染色与传播 SW: SkyWalking的简写 用户请求携带HTTP头信息X-sw8-correlation “X-sw8-correlation: key1value1,key2value2,key3value3” 网关侧读取解析HTTP头信息X-sw8-correlation,然后通过SW…

Linux网络编程:网络层协议|IP

目录 前言: 1.IP协议 1.1.IP协议格式 1.2.网段划分 1.2.1.知识引入 1.2.2.IP地址划分和子网掩码 1.3.IP地址分类 1.3.1.特殊IP地址 ​编辑 1.3.2.私有IP和公网IP 1.3.3.浅谈NAT技术 1.4.路由 1.4.1.什么是路由 1.4.2.路由表 1.5.网络层数据切片和组装…

Allegro导入DXF文件

阿里狗导入DXF文件 点击File–>Import–>DXF,注意DXF file那边不能使用中文路径和文件名以及非法字符,DXF units一般为mm,结构那边一般都用mm制作图,右边三个选项只需要勾选中间那个,意思是以增加的形式导入&am…

jail管理器CBSD实践@FreeBSD

CBSD介绍 CBSD是为FreeBSD jail子系统、bhyve、QEMU/NVMM和Xen编写的管理层。该项目定位为一个综合解决方案的单一集成工具,用于使用预定义的软件集以最少的配置快速构建和部署计算机虚拟环境。 虽然CBSD没有提供额外的操作系统级功能,但它极大地简化了…

Codeforces Round 951 (Div. 2) F. Kostyanych‘s Theorem(思维题 交互好题)

题目 交互题&#xff0c;n&#xff08;n<1e5&#xff09;个点的完全图&#xff0c;无向的&#xff0c;初始恰好删了n-2条边 每次询问可以输入一个d&#xff1a;? d 交互器会输出一个当前度>d的点v&#xff0c; 如果有多个这样的点&#xff0c;输出度最小的&#xff…

搭建自己的DNS服务器

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

STM32-呼吸灯仿真

目录 前言: 一.呼吸灯 二.跑马灯 三. 总结 前言: 本篇的主要内容是关于STM32-呼吸灯的仿真,包括呼吸灯,跑马灯的实现与完整代码,欢迎大家的点赞,评论和关注. 接上http://t.csdnimg.cn/mvWR4 既然已经点亮了一盏灯,接下来就可以做更多实验了, 一.呼吸灯 在上一个的基础上…