持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
IO
计算机组成原理通俗图解
在电脑开机后,会把内核程序加载到内存中
计算机的所有硬件操作都有内核程序来完成,这样APP就不用重复造轮子,需要使用硬件(网卡,硬盘,键鼠等),就要通过内核来完成。
在内核加载到内存后,为了保护内核程序绝对安全,会把内存分为==内核空间==和==用户空间==,并启动保护模式。这样,内核空间可以访问整个内存,但用户空间不能直接访问内核空间
计算机只有一个CPU,但是程序看起来是并行运行的,原因就是CPU时间片,轮流执行APP进程。但是程序里从来没写过有关时间片的东西,所以,轮询执行,是通过中断来完成的。
-
每个线程之间的切换
计算机中会有一个==晶振==,直流电进入,会以一定频率输出,如图上所示。每振一次,会给CPU一个==时钟中断==(作用到一颗针脚上)。此时,CPU不再执行当前线程,会把CPU寄存器的内容,写回当前线程的内存区域(保护现场),清空缓存。
中断有对应的回调程序,回调程序是加载内核后注册的。CPU回去内核中执行回调(比方叫:进程调度),下一次该执行哪个进程,会把要执行的进程的上次状态写回CPU寄存器(恢复现场)
如此往复,==每次切换进程都会重复的写出写入寄存器,产生性能损耗==。如果运行的程序越来越多,那么CPU在进行线程调度的时间要比线程执行的时间占的更多,最后程序就会变慢
-
使用软中断
如果程序用到了硬件,比方说网卡,他需要调用内核程序。此时也会产生一个中断:==软中断==(INT x80)
INT 中断单词前三个字母,x80是一个号码,在中断向量表中一共255个
因为有保护模式存在,程序不能直接访问内核程序,所以要产生系统调用。虽然代码里写的好像是个函数调用,但是编译后,会自动改为系统调用,即==函数名+INT x80==,当CPU读到该指令到CPU寄存器中时,CPU会保护现场,将线程状态写回内存,然后CPU加载内核程序,运行拿到结果,再恢复上次线程,写回结果
这就是线程的==用户态和内核态的切换==,产生性能损耗
-
IO中断
比方说鼠标的移动,每移动一次,都会产生一次IO中断,回调会将鼠标的坐标刷新到程序中