1、用户态与内核态
根据进程访问资源的特点,我们可以把进程在系统上的运行分为用户态、内核态
1.1 用户态
- 用户态(user mode) :
当进程执行用户自己的代码时,则该进程处于用户态
。用户态运行的进程可以直接读取用户程序的数据,但是,这时cpu访问资源受限
。
1.2 内核态
- 系统态(kernel mode):
当进程执行系统内核代码时,则该进程处于内核态
。系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制,这时cpu可以访问计算机的所有资源
2、用户态与内核态的转换
2.1 系统调用
用户态进程通过系统调用申请使用系统态级别的资源,并由操作系统程序代为完成
。系统调用使用了操作系统为用户开放的中断来实现,例如Linux的int 80h中断。
在运行的用户态程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。这些系统调用按功能大致可分为如下几类:
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- 文件管理。完成文件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能。
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
2 外围设备的中断
当外围设备接收到用户请求后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令,转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如需要进行硬盘读写操作时,系统会切换到硬盘读写的中断处理程序
3 异常
当CPU在执行用户态程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。