白癜风疾病 https://myyk.familydoctor.com.cn/2831/schedule_100357_1/.
声明:本人只是分享一些床长人工智能教程相关的免费pdf下载文档而已,并非床长人工智能网校的收费文章。尊重版权,支持原创!
,一背景线程状态切换的代价
的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量参数给内核,内核也需要保护好用户态在切换时的一些寄存器值变量等,以便内核态调用结束后切换回用户态继续工作。
会导致争用不到锁的线程进入阻塞状态,所以说它是语言中一个重量级的同步操纵,被称为重量级锁,为了缓解上述性能问题,从开始,引入了轻量锁与偏向锁,默认启用了自旋锁,他们都属于乐观锁。
所以明确线程切换的代价,是理解中各种锁的优缺点的基础之一。
二用户态和内核态的概念
内核态
可以访问内存所有数据,包括外围设备,例如硬盘,网卡也可以将自己从一个程序切换到另一个程序
用户态
只能受限的访问内存,且不允许访问外围设备占用的能力被剥夺,资源可以被其他程序获取
由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,或者获取外围设备的数据,并发送到网络,划分出两个权限等级用户态和内核态
三用户态与内核态的切换
所有用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情,例如从硬盘读取数据,或者从键盘获取输入等,而唯一可以做这些事情的就是操作系统,所以此时程序就需要先操作系统请求以程序的名义来执行这些操作比如的操作底层都是通过方法来调用操作系统。
这时需要一个这样的机制用户态程序切换到内核态,但是不能控制在内核态中执行的指令。
这种机制叫系统调用,在中的实现称之为陷阱指令
他们的工作流程如下
用户态程序将一些数据值放在寄存器中,或者使用参数创建一个堆栈,以此表明需要操作系统提供的服务
用户态程序执行陷阱指令
切换到内核态,并跳到位于内存指定位置的指令,这些指令是操作系统的一部分,他们具有内存保护,不可被用户态程序访问
这些指令称之为陷阱或者系统调用处理器他们会读取程序放入内存的数据参数,并执行程序请求的服务
系统调用完成后,操作系统会重置为用户态并返回系统调用的结果
当一个任务进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态或简称为内核态。
此时处理器处于特权级最高的级内核代码中执行。
当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。
每个进程都有自己的内核栈。
当进程在执行用户自己的代码时,则称其处于用户运行态用户态。
即此时处理器在特权级最低的级用户代码中运行。
当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。
因为中断处理程序将使用当前进程的内核栈。
这与处于内核态的进程的状态有些类似。
我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态,比如前面提到的程序阻塞和唤醒一个线程时就需要切换到内核态。
补充内核态与用户态在操作系统中的详细执行过程
内核态与用户态是操作系统的两种运行级别,跟没有必然的联系,提供三种级别的运行模式,级别最高,最低。
使用了级别运行用户态,作为内核态,没有使用和。
状态不能访问的地址空间,包括代码和数据。
进程的地址空间,部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。
用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过,等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到,然后进入中的内核地址空间去执行这些代码完成操作,完成后,切换回,回到用户态。
这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。
至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。
四用户态切换到内核态的种方式
系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如实际上就是执行了一个输出的系统调用。
而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如的中断。
异常
当在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
外围设备的中断
当外围设备完成用户请求的操作后,会向发出相应的中断信号,这时会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。
比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。。。。