原创

用户模式和内核模式(线程级)

用户模式和内核模式区分主要是因为,为了计算机系统的正常安全运行,有些硬件资源(如:中断装置)和特权指令是不可以对用户进程开放的,所以区分了两种模式。

内核模式和用户模式

内核空间存放的是操作系统内核代码和数据,是被所有程序共享的,在程序中修改内核空间中的数据不仅会影响操作系统本身的稳定性,还会影响其他程序,这是非常危险的行为,所以操作系统禁止用户程序直接访问内核空间。

要想访问内核空间,必须借助操作系统提供的 API 函数,执行内核提供的代码,让内核自己来访问,这样才能保证内核空间的数据不会被随意修改,才能保证操作系统本身和其他程序的稳定性。

内核模式(Kernel Mode):用户程序调用系统 API 函数称为系统调用(System Call);发生系统调用时会暂停用户程序,转而执行内核代码(内核也是程序),访问内核空间,这称为内核模式(Kernel Mode)。

任务可以执行特权级指令,对任何I/O设备有全部的访问权,还能够访问任何虚地址和控制虚拟内存硬件。

用户模式(User Mode):用户空间保存的是应用程序的代码和数据,是程序私有的,其他程序一般无法访问。当执行应用程序自己的代码时,称为用户模式(User Mode)。

硬件防止特权指令的执行,并对内存和I/O空间的访问操作进行检查,可以通过操作系统中的某种门机制进入内核模式访问。

内核模式和用户模式之间切换

当运行在用户模式的应用程序需要输入输出、申请内存等比较底层的操作时,就必须调用操作系统提供的 API 函数,从而进入内核模式;操作完成后,继续执行应用程序的代码,就又回到了用户模式。

用户模式就是执行应用程度代码,访问用户空间;内核模式就是执行内核代码,访问内核空间(当然也有权限访问用户空间)。

下列表格展示了两种模式切换过程:

用户模式到内核模式 内核模式到用户模式
由中断/异常/系统调用中断用户进程执行而触发 。
1.处理器模式转为内核模式。
2.保存当前进程的PC/PSW值到核心栈。
3.转向中断/异常/系统调用处理程序。
OS执行中断返回指令将控制权交还用户进程而触发。
1.从待运行进程核心栈中弹出PC/PSW值。
2.处理器模式转为用户模式。

内核级线程(KLT)和用户级线程(ULT)

进程是资源拥有的基本单位,进程切换需要保存进程状态,会造成资源的消耗。同一进程中的线程,共享进程获取的部分资源。在同一进程中,线程的切换不会引起进程切换,线程的切换需要的资源少于进程切换,可以提高效率。

内核级线程(Kernel-Level Threads), KLT 也有叫做内核支持的线程。
  • 线程管理的所有工作(创建和撤销)由操作系统内核完成
  • 操作系统内核提供一个应用程序设计接口API,供开发者使用KLT
用户级线程(User-Level Threads ULT)
  • 用户空间运行线程库,任何应用程序都可以通过使用线程库被设计成多线程程序。线程库是用于用户级线程管理的一个例程包,它提供多线程应用程序的开发和运行支撑环境,包含:用于创建和销毁线程的代码、在线程间传递数据和消息的代码、调度线程执行的代码以及保存和恢复线程上下文的代码。
  • 所以线程的创建,消息传递,调度,保存/恢复上下文都有线程库来完成。内核感知不到多线程的存在。内核继续以进程为调度单位,并且给该进程指定一个执行状态(就绪、运行、阻塞等)。
内核级线程特点 用户级线程的特点
1.进程中的一个线程被阻塞,内核能调度同一进程的其他线程(就绪态)占有处理器运行。
2.多处理器环境中,内核能同时调度同一进程的多线程,将这些线程映射到不同的处理器核心上,提高进程的执行效率。
3.应用程序线程在用户态运行,线程调度和管理在内核实现。线程调度时,控制权从一个线程改变到另一线程,需要模式切换,系统开销较大。
1.线程切换不需要内核模式,能节省模式切换开销和内核资源。
2.允许进程按照特定的需要选择不同的调度算法来调度线程。调度算法需要自己实现。
3.由于其不需要内核进行支持,所以可以跨OS运行。
4.不能利用多核处理器有点,OS调度进程,每个进程仅有一个ULT能执行
5.一个ULT阻塞,将导致整个进程的阻塞。

jacketing技术可以解决用户级线程ULT一个线程阻塞导致整个进程阻塞。

jacketing的目标是把一个产生阻塞的系统调用转化成一个非阻塞的系统调用。例如,当进程中的一个线程调用IO中断钱,先调用一个应用级的I/O jacket例程,而不是直接调用一个系统I/O。让这个jacket例程检查并确定I/O设备是否忙。如果忙,则jacketing将控制权交给该进程的线程调度程序,决定该线程进入阻塞状态并将控制权传送给另一个线程(若无就绪态线程咋可能执行进程切换)。

线程实现的组合策略

可以看出,用户级线程和内核级线程都有各自的优点和缺点,在应用上主要表现为:

  • 用户级多线程对于处理逻辑并行性问题有很好的效果。不擅长于解决物理并发问题。
  • 内核级多线程适用于解决物理并行性问题。

组合策略:
由操作系统内核支持内核级多线程,由操作系统的程序库来支持用户级多线程,线程创建完全在用户空间创建,现成的调度也在应用程序内部进行,然后把用户级多线程映射到(或者说是绑定到)一些内核级多线程。

编程人员可以针对不同的应用特点调节内核级线程的数目来达到物理并行性和逻辑并行性的最佳方案。


在这里插入图片描述

参考文章

  • https://blog.csdn.net/winterfeng123/article/details/79788714
  • https://blog.csdn.net/sinat_38104725/article/details/98474760
  • https://blog.csdn.net/winterfeng123/article/details/79784430
  • https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode
  • https://www.kanzhun.com/msh/post/1691.html

关注公众号 ,专注于java大数据领域离线、实时技术干货定期分享!个人网站 www.lllpan.top

在这里插入图片描述

正文到此结束
本文目录