IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念

IO操作底层调用过程|内核|中断|

做后端的程序员都知道我们编写的程序主要分方法程序和IO操作程序。
有什么不一样呢?
方法程序就不多说了。IO程序有什么不同呢?IO操作指的是对硬件设备操作,比如键盘、鼠标、网卡、显卡…
那又有什么区别呢?

那就得说说系统调用
先看下面简单的一个图,cpu主要从内存拉取数据执行,将返回结果返回给内存,是我们程序的执行过程(今天重点不是这)
在这里插入图片描述

  1. 我们的程序分为 系统程序kernel(内核程序,操作系统自带的程序)用户程序(app之类的我们自己放在系统程序)
    系统程序kernel用户程序 都是程序。

系统启动之前两者都是存在磁盘中、系统启动启动之后先调用内核程序操作系统相关程序比如:用户登录等,完成系统启动。
此时内程序会执行在内核空间中,用户程序执行时候是在用户空间
在这里插入图片描述
那么问题来了,为什么分内核和用户空间呢?内核空间有什么用?
内核空间是用来给执行系统程序,操作系统硬件程序,并且给用户程序提供操作设备的方法调用,比如调用系统的IO设备啥的。

但是!!!!!
系统程序执行的时候会开启保护模式GDT** 。

用户程序在用户空间执行,他是访问不了内核空间的数据的,只能访问用户空间数据(因为被保护了),而内核程序执行时可以调用整个内存空间的数据的(可以理解为特权,后面就知道为什么了)。
那为什么要这样呢?
可以理解,内核程序是用来操作系统的程序,如果能被用户程序访问,那操作系统很容易就被恶意破坏了。

在这里插入图片描述

那么问题(老伙伴)它又来了,明明我们程序里面是可以操作IO的啊,怎么说不能呢?而且用户程序都不能访问内核空间咋调用内核程序操作IO呢?

这就是神奇的地方了!!!
在这之前得知道一个知识,相比大家都知道cpu切换,多线程的时候大家都知道cpu会在各个线程里面来回切换,保证线程都能被执行…

那是怎么做的呢?
CPU内部有一个硬件叫做晶振器,他是由直流电进,出来的时候,会产生震动(简单这么理解),
每次震动的时候,会让CPU产生时钟中断
怎么理解中断:CPU停止当前线程的执行,此时将执行信息保存在寄存器中,资源还给内存(保护现场)。
上面这个过程是CPU多线程切换的原理,不仅晶振器可以中断cpu,io操作也可以中断。。。。

在内核程序开始进入内存的时候,会有一个表IDT(中断表) 来记录中断的号码和对应的回调函数记录当前执行的程序。而这个表是放在内核程序里面的。(重点)
在这里插入图片描述
现在回过头来说说为什么用户这边能通过内核程序调用系统IO?
刚才说了不仅时钟中断可以中断CPU,IO操作也会中断CPU
比如:程序中执行System.out.print的时候最终会被编译成 write()+ INT0x80 ,这个write方法就是内核程序让显卡打印的程序,INT0x80 是让CPU中断的指令。(!!!转折点

神奇的过程!!!!
用户程序在执行 System.out.print 之后 等于 最终执行了 write()+ INT0x80 ,当执行到INT0x80的时候,啪 ! CPU被中断了,这个时候CPU就要保存现场,然后把当前执行的程序也就是write() 作为参数放到回调函数里面放到IDT表,保存起来。(记住IDT表是放在内核程序里面的),下一次CPU需要继续执行这个方法时,怎么着?它得冲IDT去调用 回调函数啊,正好执行了write(
)方法(完成了IO操作)。
在这里插入图片描述
以上就是IO操作的一个用户态(用户程序执行时,用户空间的状态)切换成内核态(用户程序执行时,内核空间的状态)的过程。

总结:

  1. 宏观上说,用户程序调用IO设备时,是需要内核程序调用的,所以上面说到了内核程序的作用:向下操作系统设备,向上提供操作设备方法,目的轻量化用户程序,包揽系统调用操作,用户程序不需要再自己写底层调用设备程序。
  2. 用户态切换内核态需要消耗时间,开销大。所以用户程序频发的调用IO会有性能损耗。比如BIO模型中,利用每一个线程对应一个连接,会让cpu来回调度,每次调度就是一次内核态切换,消耗性能。
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我理解了你的问题。首先,CPU(Central Processing Unit)是计算机的核心部件,用于执行指令和控制计算机的操作。它有多个寄存器(Register),用于存储数据和指令。寄存器是CPU内部的存储器,速度非常快,但容量有限。 内核(Kernel Mode)和用户(User Mode)是处理器的两种运行模式。当处理器处于内核时,操作系统有权访问所有硬件资源,包括内存、IO设备和CPU寄存器等。而在用户下,操作系统只能访问受限的资源,不能直接访问CPU寄存器等特权资源。 当操作系统需要执行特权操作时,例如访问硬件资源或进行进程调度等,需要从用户切换内核。这个过程称为系统调用(System Call)或陷入(Trap)。在x86架构中,可以通过软中断(Software Interrupt)或硬中断(Hardware Interrupt)来触发系统调用。在系统调用完成后,操作系统会再次将处理器切换用户。 具体地,当用户程序需要执行一个系统调用时,它会通过软中断指令(int)向CPU发送一个中断请求(Interrupt Request),CPU接收到请求后会暂停当前任务,将中断处理程序(Interrupt Handler)的地址加载到指令指针寄存器(IP)中,并切换内核中断处理程序会执行相应的系统调用,并将结果返回给用户程序。执行完成后,中断处理程序会将控制权交还给用户程序,并将处理器切换用户。 总之,内核用户之间的切换操作系统中非常重要的一部分。在操作系统中,系统调用是实现内核用户切换的主要机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Survivor001

你可以相信我,如果你愿意的话

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值