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来回调度,每次调度就是一次内核态切换,消耗性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Survivor001

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

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

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

打赏作者

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

抵扣说明:

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

余额充值