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

假如你想了解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等等。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值