系统调用、消息传递和中断之间有什么关系?

系统调用、消息传递和中断之间有什么关系?

我正在阅读维基百科文章流程管理。我的重点是 Linux。我无法弄清楚系统调用、消息传递和中断之间的概念和目的之间的关系和区别。它们都是为了进程向内核请求资源和服务吗?

文章中的一些引用和其他一些:

  1. 在程序执行期间,操作系统有两种可能的方式重新获得处理器的控制权,以便操作系统执行取消分配或分配:

    1. 进程发出系统调用(有时称为软件中断);例如,发生 I/O 请求,请求访问硬盘上的文件。
    2. 发生硬件中断;例如,键盘上的某个键被按下,或者计时器超时(用于抢占式多任务处理)。
  2. 在用户模式下执行的程序可以通过两种技术请求内核的服务:

    * System call
    * Message passing
    
  3. 中断是表示需要注意的异步信号,或者是软件中表示需要更改执行的同步事件。

    硬件中断使处理器保存其执行状态并开始执行中断处理程序。软件中断通常作为指令集中的指令来实现,这会导致类似于硬件中断的上下文切换到中断处理程序。

答案1

  1. 所有现代操作系统都支持多任务处理。这意味着系统能够同时执行多个进程;要么是伪并行(当只有一个 CPU 可用时),要么是现在多核 CPU 普遍并行(一个任务/核心)。

    让我们以只有一个 CPU 可用的更简单的情况为例。这意味着,如果您同时执行两个不同的进程(例如网络浏览器和音乐播放器),系统实际上无法同时执行它们。发生的情况是 CPU 一直从一个进程切换到另一个进程;但这发生得非常快,因此你永远不会注意到它。

    现在我们假设当这两个进程正在执行时,您按下了重置按钮(坏孩子)。 CPU 将立即停止正在执行的操作并重新启动系统。恭喜:您生成了一个中断。

    当您正在编程并希望向 CPU 请求服务时,情况与此类似。不同之处在于,在这种情况下,您执行软件代码——通常是执行系统调用(例如fopen打开文件)的库过程。

    因此,1 描述了获得 CPU 注意力的两种不同方式。

  2. 大多数现代操作系统支持两种执行模式:用户模式和内核模式。默认情况下,操作系统在用户模式下运行。用户模式非常有限。例如,禁止所有I/O;因此,您无法从硬盘打开文件。当然,这在现实中永远不会发生,因为当您打开文件时,操作系统会透明地从用户模式切换到内核模式。在内核模式下,您可以完全控制硬件。

    如果您想知道为什么存在这两种模式,最简单的答案就是保护。基于微内核的操作系统(例如 MINIX 3)的大部分服务都在用户模式下运行,这使得它们的危害较小。单体内核(如 Linux)几乎所有服务都在内核模式下运行。因此,在 MINIX 3 中崩溃的驱动程序不太可能导致整个系统瘫痪,而这在 Linux 中并不罕见。

    系统调用是单片内核(共享数据模型)中用于从用户模式切换到内核模式的原语。消息传递是微内核(客户端/服务器模型)中使用的原语。更准确地说,在消息传递系统中,程序员还使用系统调用来引起 CPU 的注意。消息传递仅对操作系统开发人员可见。使用系统调用的单片内核速度更快,但可靠性较低,而使用消息传递的微内核速度较慢,但​​具有更好的故障隔离能力。

    因此,2 提到了从用户模式切换到内核模式的两种不同方式。

  3. 要修改,创建软件中断(也称为陷阱)的最常见方法是执行系统调用。另一方面,中断纯粹由硬件生成。

    当我们中断CPU(无论是通过软件还是通过硬件)时,它需要在某个地方保存它的当前状态——它执行的进程以及它停止的时间点——否则当切换回来时它将无法恢复该进程。这称为上下文切换,它是有道理的:在关闭计算机执行其他操作之前,您首先需要确保保存了所有程序/文档等,以便可以从停止的位置恢复。下次你会打开它:)

    因此,3 解释了执行陷阱或中断后需要做什么以及这两种情况有多么相似。

答案2

系统调用、消息传递(如维基百科文章中所述)和中断都会导致上下文切换或者从用户模式切换到内核模式。您可能知道:

  • 内核模式:程序对内存有一个平面的或真实的视图,程序可以不受限制地直接自由地读/写所有内存和所有硬件设备。

  • 用户模式:程序具有内存的虚拟视图,程序不能自由地读/写所有内存,也不能直接读/写硬件设备。为了获得更多的内存或访问硬件设备,用户态程序必须称呼内核。系统调用和消息传递是实现此目的的两种方法。

系统调用涉及执行特定的CPU指令或指令集,这使得CPU跳转(首先在堆栈上保存返回地址)到预定义的地址(不可写到用户模式)并将CPU从用户模式移动到内核模式(环3 到 Intel 架构中的 Ring 0)。

硬件中断的作用大致相同,它们使 CPU 跳转(首先在堆栈上保存返回地址)到预定义的地址,并将 CPU 从用户模式移动到内核模式。因此,在许多 CPU 中,相同的机制可以由软件调用(称为“软件中断”),并且可以用于 CPU 调用。

消息传递意味着(至少对我来说)内核是一个“正在运行的进程”,它将接收消息流,并且存在一个将发送此类消息的用户模式可访问函数。或者,“发送”函数可能只是将值推入堆栈,下次内核拥有控制权时(无论是进程阻塞还是发生中断),它都会从堆栈中弹出消息并相应地分派到内部例程。

在微内核架构中,实际的“内核”非常小,内核提供的大部分功能都转移到“服务器”进程,所有这些进程都可能在多 CPU 系统上同时运行,这样的事情可能会更多比普通的旧系统调用方法有用。解释“消息”并将其路由到适当的内核“服务器”将是微内核的少数工作之一。

答案3

消息传递是一个进程向另一个进程发送消息的高级概念。它是通过系统(内核)调用来实现的,要求内核将消息传递给其他进程。系统调用要求内核为进程执行各种服务。它们是通过软件中断/系统陷阱实现的,这会导致 cpu 在堆栈上保存一些状态,以便稍后返回,然后切换到内核模式并跳转到内核处理程序。

硬件和软件中断都会导致 CPU 保存状态、切换到内核模式并跳转到为该中断定义的处理程序。不同之处在于,硬件中断是由外部硬件在需要注意时生成的,例如键盘指示已按下某个键。然后键盘处理程序可以读取键盘IO端口以查看按下了什么键,并采取适当的操作,然后返回到被中断的程序。

相关内容