总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大。
应用程序的执行需要依托内核提供的资源,包括CPU、存储、IO等,因此内核提供了一个统一的接口,
也就是系统调用,一个应用程序从用户态进入到内核态,就需要执行系统调用。
用户态转化为内核态时,需要执行系统调用,保存现场,也就是保存用户态的寄存器等,
然后去系统调用,并在内核态执行,最后恢复现场。并且由于内核对于用户的不信任,
因此内核需要对用户进行一些额外的检查,这就需要耗费更多的工作了。
用户态和内核态:
1、划分的原因:为了防止用户进程破坏操作系统的稳定,对一些资源的访问进行了等级划分,与系统相关的一些关键性操作必须由高级别的程序来完成,这样可以做到集中管理,减少冲突。
2、两者的区别:内核态和用户态是操作系统的两种运行级别,总共有四种运行级别,分别为 R0、R1、R2和 R3。
内核态权限最高,为 R0 级,用户态权限最低,为 R3 级。
用户态运行用户程序,进程所能访问的内存空间和对象受到很大的限制,所占有的处理机可被抢占;
内核态运行操作系统程序,能访问所有的内存空间和对象,所占有的处理机不可被抢占。
用户态和内核态的切换:
进程大部分时间运行在用户态下 ,在其需要操作系统帮助完成一些用户态特权以外的操作时就会切换到内核态 。
切换到内核态的方式有 : 系统调用(父进程fork一个子进程)、发生异常、外围设备中断。