1. 系统调用
为了安全应用程序无法直接调用的硬件的功能,而是将这些功能封装成特定的函数。当应用程序需要硬件功能时(例如读写文件),就需要进行系统调用。当进程进行系统调用后就从用户态装换为内核态。
2. 用户态与内核态
我们可以想象cpu只是一个无情的执行代码的工具,并不关心是谁的代码。
(1)用户态:cpu正在执行用户编写的代码。
(2)内核态:由于用户无法操作硬件,必须进行系统调用。系统调用时cpu执行内核代码,那么此时进程处于内核态。
3. 用户态与内核态的区别
在内核创建一个进程时,除了我们所知的在用户内存空间中的(堆,栈)以外,在内核空间中也分配了一个空间(内核栈)。因此,在cpu执行用户代码时使用的是用户栈,而在进行系统调用时(执行内核代码)使用的是内核栈。由于用户空间进程没办法访问到内核空间的数据,在内核栈执行系统调用函数时的过程也不会泄露到用户空间,内核只会在执行完毕后返回结果。
4. 上下文(context switch)
(1)上下文又可以理解为执行的环境。我认为进程执行环境更好理解。
(2)举个例子来说明下:我们高中的时候上很多的课,语文,英语,数学,等等,每次上完课都会有很多作业。现在我们要完成作业,在这个情景之下做出类比。
首先我们拿起了数学,,,我们的大脑将题目逐字的读取并解析,并运算将结题过程一步步的写在作业本上,,,,,(解题过程省略)。在这个过程中我们可能卡壳了实在做不出来,想换个科目来切换一下思路。 那么此时就发生就相当于发生了上下文切换,我们将上一个科目中的信息(比如做到了哪一题,写到了哪一步等等都保存在了我们的大脑中,以便下一次开始做数学的时候能够快速定位到自己完成到哪一行等等这些信息),这些信息能够让我们在发生切换后回到原来的状态称为上下文。
(3)而我们最常见的进程上下而就是进程在发生切换后能后恢复到原来的状态的信息。