网络编程—IO多路复用详解

Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析! 在前面咱们详细叙述了Linux五种IO模型以及Java所提供的三种IO模型支持,对于Java-IO这块内容,阻塞、非阻塞、同步、异步等这些区别就不再聊了,认真看下来本文后自然会有答案,最后是需要重点表明一点: NIO、AIO都是单线程处理多个连接,但并不代表着说永远只有一条线程对网络连接进行处理,这里所谓的单线程处理多个连接,其实本质上是指单条线程接收客户端连接。从上述这段话中应该可以得知:本质上对于客户端的网络连接照样会启动多条线程处理... 阅读详情

假如你想了解IO多路复用,那本文或许可以帮助你
本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。

基础知识

IO多路复用涉及硬件、操作系统、应用程序三个层面,了解这些知识是很有帮助的。
假如已经了解,可直接跳过

Linux系统中断

中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。

硬中断

通过硬件产生相应的中断请求,称为硬中断。
我们的硬件设备如:鼠标、键盘、网卡、磁盘等,假如想要让CPU处理它们的数据(如按下键盘、移动鼠标、处理网卡缓冲区的报文数据等)都需要通过中断控制器(一个硬件设备)向数据总线中发送中断请求(IRQ Interrupt ReQuest的缩写),CPU收到IRQ后会将当前进程信息保存到进程描述符中,然后在中断向量表中找到对应中断处理程序的地址,然后执行中断处理程序,在执行完处理程序后,从进程描述符中恢复原进程。

简化以上过程:外设 ==> 中断控制器 ==> CPU ==> 挂起当前进程 ==> 中断向量表 ==> 中断处理程序 ==> 恢复原进程。

软中断

软中断是在通信进程之间通过模拟硬中断而实现的一种通信方式。软中断仅在当前运行的进程中产生。
我们经常用到的系统调用就是一个软中断,因为中断向量号为0x80故又称80中断。

下面会解释系统调用到底做了什么

系统调用

上面说过,系统调用是一种软中断。那么操作系统为什么要给我们提供系统调用呢?以及系统调用用户态和内核态:用户态网络协议栈

我们知道操作系统本身也是一个程序,我们平时写的程序都跑在操作系统之上,计算机的硬件资源都是由操作系统内核进行管理的。假如我们需要使用某一硬件的资源,是不能直接访问的。因为为了提高操作系统的稳定性和安全性,应用程序需要和系统程序分开。CPU将程序执行的状态分为了不同的级别,从0到3,数字越小,访问级别越高。0代表内核态,在该特权级别下,所有内存上的数据都是可见的,可访问的。3代表用户态,在这个特权级下,程序只能访问一部分的内存区域,只能执行一些限定的指令。这就把内存分为了用户态和内核态。
由于内存分为用户态和内核态,当我们需要访问操作系统的内部函数时,就需要使用系统调用了,为了规范操作系统提供的系统调用,IEEE制定了一个标准接口族,被称为POSIX(Portable Operating System Interface of Unix)。比如一些常用的接口:fork、pthread_create、open等。

系统调用过程

下面叙述一下系统调用的过程是怎样的,要求知道大概流程。

  1. 进程A请求系统调用(80中断),此过程会将系统调用号放入eax寄存器,并往ebx、ecx、edx、esi,、edi寄存器放入参数
  2. 栈切换:当前栈从用户栈切换到内核栈(用户态和内核态使用的是不同的栈),关于Linux的栈可以看此文:Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈当前栈指的是ESP寄存器的值所指向的栈,ESP的值位于用户栈的范围,那程序的当前栈就是用户栈,反之亦然。
    寄存器SS的值指向当前栈所在的页。因此,将用户栈切换到内核栈的过程是:将当前ESP、SS等寄存器的值存到内核栈上。
    将ESP、SS等值设置为内核栈的相应值。
  3. 通过中断向量表找到system_call的地址(0x80的地址)
  4. <开始system_call>将用户态的一些寄存器信息保存在自己的堆栈即内核堆栈上(system_call 中的save_all实现)save_all是一个宏,它将依次压入: %es %ds %eax %ebp %edi %esi %edx %ecx %ebx
  5. system_call根据eax寄存器的调用号找到特定的系统函数指针,并在寄存器中读取参数
  6. 执行特定的系统函数
  7. 将执行结果保存到eax寄存器中
  8. 恢复之前保存的寄存器
  9. 执行iret,从中断程序返回<system_all结束>iret是汇编指令,将原来用户态保存的现场恢复回来,包含代码段、指令指针寄存器等。这时候用户态进程恢复执行。
  10. 栈切换:当前栈要从内核栈切换回用户栈
  11. 运行进程A,进程A往eax寄存器中读返回数据

C/C++Linux后台服务器开发高级架构师学习视频 点击 linux服务器学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。

system_call的部分代码

// system_call的开头部分
......
SAVE_ALL	// 保存寄存器
3D模型文件格式全解析:从STL到glTF,10种主流格式与转换实战指南 在三维数字内容创作与工程制造领域,3D模型文件格式是数据交换与协作的基石。其核心原理在于以不同的数据结构(如三角网格、NURBS曲面、边界表示等)对三维物体的几何、外观及场景信息进行编码。理解这些格式的技术特性,对于保障数据完整性、提升工作流效率具有关键价值,广泛应用于3D打印、游戏开发、影视动画及工业设计等场景。例如,面向增材制造的STL格式以其极简的三角面片结构成为行业通用语,而支持丰富材质与动画的FBX格式则在影视游戏管线中扮演核心角色。本文聚焦于STL、OBJ、FBX、3MF、STEP等10种主流格 阅读详情

相关推荐

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1105

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1877

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

如何在 Ubuntu 24.04 LTS 上安装 SSH 服务器?

Ubuntu是一个基于Debian的开源Linux操作系统,由Canonical Ltd.开发和维护。Ubuntu致力于提供用户友好、稳定且安全的操作系统环境,适用于个人用户、企业和服务器等不同场景。Ubuntu 24.04 LTS是Ubuntu发布的一个长期支持版本,LTS代表长期支持(Long Term Support)。这意味着Ubuntu 24.04 LTS将获得长达5年的安全更新和维护支持,使其成为企业和个人用户的理想选择。

网络技术联盟站 5888

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

孤独的单刀 5475

图文详解秋叶ComfyUI整合包开启密码访问教程(附内网穿透实战经验) ComfyUI密码、ComfyUI-Login、ComfyUI内网穿透、秋叶整合包、ComfyUI安全防护

想远程访问 ComfyUI(跨设备或公网)不希望任何人随意使用或篡改服务需要给 ComfyUI 添加登录验证机制只要按照本文教程,安装插件,并设置好用户名密码,你就能把服务加上一道强力的门槛。📌配合ngrokfrp等内网穿透工具使用公网域名推荐启用 HTTPS(SSL证书可以用宝塔/ZeroSSL 申请)密码可以设置复杂一些,定期更换更安全📬如果你在配置过程中遇到问题,欢迎评论区留言交流,或者私信我,后续我也会更新更多 ComfyUI 插件教程、安全部署经验等内容。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2731

YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu

将ELSA中的函数Φ\PhiΦ用具有可学习参数α\alphaα和β\betaβ的网络层表示为LxiαβCαxixi0σβxixi≥0Lxi​αβCαxi​σβxi​​xi​0xi​≥0​,结合标准的Rectified Linear UnitsRxi0xi0xixi≥0Rxi​0xi​​xi​0xi​≥0​,得到可学习激活函数Fxiα。

Limiiiing的博客 2117

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 腾讯跟阿里两位王者之间的对比
下一篇: 数据库底层设计(MYSQL索引的数据结构)
Linux服务器开发
博客等级 码龄7年 610粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值