前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发编程基础

并发编程基础

原创
作者头像
kwan的解忧杂货铺
修改2024-08-11 23:08:38
590
修改2024-08-11 23:08:38
举报
文章被收录于专栏:基础

1.CPU 用户态和内核态?

在操作系统中,CPU 的运行模式分为用户态和内核态。

用户态是指 CPU 在执行进程的用户程序时所处的运行模式。在用户态下,CPU 只能访问该进程的用户空间,不能直接访问操作系统的内核空间。用户态下的程序运行速度较快,但是受到一些限制,例如无法直接访问硬件设备、无法执行特权指令等。

内核态是指 CPU 在执行操作系统内核代码时所处的运行模式。在内核态下,CPU 可以访问所有的内存空间和硬件设备,并且可以执行特权指令,例如修改内存映射、切换进程、中断处理等。因此,内核态下的程序具有更高的权限和更广的操作能力,但是运行速度较慢。

当进程需要执行一些需要特权级别的操作时,例如进行 I/O 操作、创建新进程、访问共享内存等,就需要切换到内核态。这时,进程会通过系统调用的方式进入内核态,请求操作系统执行特定的操作。操作系统会根据请求的操作类型进行相应的处理,并返回结果给进程。当操作完成后,进程再次切换回用户态,继续执行自己的程序。

在操作系统中,用户态和内核态的切换需要一定的时间和开销,因此尽可能减少进程在用户态和内核态之间的切换次数,可以提高系统的性能和响应速度。

对比:

操作系统中的内核态(Kernel Mode)和用户态(User Mode)是两个重要的特权级别,用于管理计算机硬件和运行应用程序。它们之间的主要区别包括权限和功能:

  1. 权限
  • 内核态拥有最高的系统权限,可以直接访问和操作计算机的硬件资源,包括内存、CPU、设备驱动程序等。内核态的代码可以执行特权指令,如读写控制寄存器和执行 I/O 操作。
  • 用户态受到限制,不能直接访问硬件资源或执行特权指令。它只能通过操作系统提供的接口来请求内核态执行某些任务。
  1. 功能
  • 内核态执行操作系统的核心功能,包括进程管理、内存管理、文件系统管理、设备驱动程序管理、安全性管理等。内核态的代码负责响应中断、调度进程、分配和释放内存等任务。
  • 用户态执行应用程序和用户级别的任务。这些程序不具备直接访问或操作硬件资源的能力,它们必须通过系统调用(System Calls)等方式请求内核态执行相关操作。
  1. 安全性
  • 内核态的代码通常需要更高级别的安全保护,因为它可以影响整个系统的稳定性和安全性。错误或恶意的内核态代码可能导致系统崩溃或数据损坏。
  • 用户态的代码受到较严格的限制,因此即使应用程序发生错误,也不太可能对整个系统造成严重影响。
  1. 切换开销
    • 从用户态切换到内核态和从内核态切换回用户态都需要切换开销。这包括保存和恢复寄存器状态、修改特权级别等操作。因此,频繁的上下文切换可能会导致性能下降。

内核态和用户态的区别在于权限、功能和安全性。操作系统的设计目标之一是保护内核态免受错误或恶意代码的影响,同时允许用户态的应用程序以受控的方式访问系统资源。这种分层的特权级别有助于确保系统的稳定性和安全性。

image-20230531090531117
image-20230531090531117

2.用户态/内核态切换条件?

当在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成一些用户态自己没有特权和能力完成的操作时就会切换到内核态。

用户态切换到内核态的 3 种方式

(1)系统调用:这是用户态进程主动要求切换到内核态的一种方式.用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作.例如 fork()就是执行了一个创建新进程的系统调用.系统调用的机制是使用了操作系统为用户特别开放的一个中断来实现.

(2)异常:当 cpu 在执行运行在用户态下的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常。

(3)外围设备的中断:当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令是用户态下的程序,那么转换的过程自然就会是由用户态到内核态的切换.如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。

这三种方式是系统在运行时由用户态切换到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的.从触发方式上看,切换方式都不一样,但从最终实际完成由用户态到内核态的切换操作来看,步骤又是一样的,都相当于执行了一个中断响应的过程.系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本一致。

3.用户态切换内核态步骤?

当进程需要执行一些需要特权级别的操作时,例如进行 I/O 操作、创建新进程、访问共享内存等,就需要切换到内核态。下面是用户态切换到内核态的大致步骤:

  1. 用户程序执行系统调用指令,例如 int 0x80(Linux)、syscall(Mac OS X)、Trap(Windows)等,触发 CPU 从用户态切换到内核态。
  2. CPU 从用户态切换到内核态,将当前进程的状态(包括 PC、寄存器、栈指针等)保存在内核栈中,以便后续恢复。
  3. CPU 执行操作系统内核代码,开始进行系统调用的处理。操作系统会根据请求的操作类型进行相应的处理,例如 I/O 操作、进程调度、内存管理等。
  4. 当操作完成后,CPU 从内核态切换回用户态,将之前保存的进程状态恢复。此时,进程重新开始执行用户程序。

需要注意的是,由于用户态和内核态之间的切换需要一定的时间和开销,因此尽可能减少进程在用户态和内核态之间的切换次数,可以提高系统的性能和响应速度。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.CPU 用户态和内核态?
  • 2.用户态/内核态切换条件?
  • 3.用户态切换内核态步骤?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档