Tim*_*Tim 14 system-calls interrupt architecture
我正在阅读有关流程管理的维基百科文章。我的重点是Linux。我无法弄清楚系统调用、消息传递和中断之间的关系和区别,它们的概念和目的。它们都是为了进程向内核请求资源和服务吗?
文章中的一些引用和其他一些引用:
操作系统有两种可能的方式在程序执行期间重新获得对处理器的控制,以便操作系统执行取消分配或分配:
- 进程发出系统调用(有时称为软件中断);例如,发生 I/O 请求,请求访问硬盘上的文件。
- 发生硬件中断;例如,在键盘上按下了一个键,或者计时器用完了(用于抢先式多任务处理)。
在用户模式下执行的程序可以通过两种技术请求内核的服务:
Run Code Online (Sandbox Code Playgroud)* System call * Message passing
中断是指示需要注意的异步信号或指示需要更改执行的软件中的同步事件。
硬件中断使处理器保存其执行状态并开始执行中断处理程序。软件中断通常作为指令集中的指令来实现,这会导致上下文切换到类似于硬件中断的中断处理程序。
sak*_*isk 12
所有现代操作系统都支持多任务处理。这意味着系统能够同时执行多个进程;要么是伪并行(当只有一个 CPU 可用时),要么是现在多核 CPU 并行(一个任务/核)。
让我们以只有一个 CPU 可用的简单情况为例。这意味着,如果您同时执行两个不同的进程(比如 Web 浏览器和音乐播放器),系统就无法真正同时执行它们。发生的情况是 CPU 一直在从一个进程切换到另一个进程;但这发生得非常快,因此您永远不会注意到。
现在让我们假设当这两个进程正在执行时,您按下了重置按钮(坏孩子)。CPU 将立即停止正在执行的任何操作并重新启动系统。恭喜:你产生了一个中断。
当您在编程并希望从 CPU 请求服务时,情况与此类似。不同之处在于,在这种情况下,您执行软件代码——通常是执行系统调用(例如fopen打开文件)的库过程。
因此,1 描述了从 CPU 获得注意力的两种不同方式。
大多数现代操作系统支持两种执行模式:用户模式和内核模式。默认情况下,操作系统在用户模式下运行。用户模式非常有限。例如,禁止所有 I/O;因此,您不能从硬盘打开文件。当然,这在现实中永远不会发生,因为当您打开文件时,操作系统会透明地从用户模式切换到内核模式。在内核模式下,您可以完全控制硬件。
如果您想知道为什么存在这两种模式,最简单的答案是保护。基于微内核的操作系统(例如 MINIX 3)的大部分服务都在用户模式下运行,这使得它们的危害较小。单片内核(如 Linux)几乎所有的服务都在内核模式下运行。因此,在 MINIX 3 中崩溃的驱动程序不太可能导致整个系统崩溃,而这在 Linux 中并不罕见。
系统调用是单片内核(共享数据模型)中用于从用户模式切换到内核模式的原语。消息传递是微内核(客户端/服务器模型)中使用的原语。更准确地说,在消息传递系统中,程序员还使用系统调用来引起 CPU 的注意。消息传递仅对操作系统开发人员可见。使用系统调用的单片内核速度更快但可靠性较低,而使用消息传递的微内核速度较慢但具有更好的故障隔离。
因此,2 提到了从用户模式切换到内核模式的两种不同方式。
修改一下,创建软件中断(又名陷阱)的最常见方法是执行系统调用。另一方面,中断完全由硬件产生。
当我们中断 CPU 时(通过软件或硬件),它需要将其当前状态保存在某个地方——它执行的进程以及它在哪一点停止——否则它在切换回来时将无法恢复进程. 这称为上下文切换,它是有道理的:在关闭计算机以执行其他操作之前,您首先需要确保已保存所有程序/文档等,以便您可以从停止执行的点继续下次你打开它:)
因此,3 解释了执行陷阱或中断后需要做什么以及这两种情况的相似程度。
系统调用、消息传递(如维基百科文章中所述)和中断都是导致上下文切换或从用户模式切换到内核模式的事情。您可能知道:
内核模式:程序具有平面或真实的内存视图,程序可以不受限制地直接对所有内存和所有硬件设备进行自由读写。
用户态:程序具有虚拟化的内存视图,程序不能自由读写所有内存,不能直接读写硬件设备。为了获得更多内存或访问硬件设备,用户态程序必须调用内核。系统调用和消息传递是实现此目的的两种方法。
系统调用涉及执行特定的 CPU 指令或指令集,这使 CPU 跳转(首先将返回地址保存在堆栈上)到预定义的地址(不可写入用户模式)并将 CPU 从用户模式移动到内核模式(环3 在英特尔架构中振铃 0)。
硬件中断做很多相同的事情,它们使 CPU 跳转(首先在堆栈上保存返回地址)到一个预定义的地址,并将 CPU 从用户模式移动到内核模式。因此,在许多 CPU 中,相同的机制可以被软件调用(称为“软件中断”),并可用于 CPU 调用。
消息传递意味着(至少对我而言)内核是一个“正在运行的进程”,它将接收消息流,并且存在将发送此类消息的用户模式可访问函数。或者可能是“发送”函数只是将值推送到堆栈上,而下一次内核具有控制权时(如果进程阻塞或发生中断),它会从堆栈中弹出消息并相应地分派到内部例程。
在微内核架构中,实际的“内核”非常小,内核提供的大部分功能都转移到“服务器”进程,所有这些都可能在多 CPU 系统上并发运行,这样的事情可能更多比普通的旧系统调用方法有用。将“消息”解释和路由到适当的内核“服务器”将是微内核的少数工作之一。
消息传递是一个进程向另一个进程发送消息的更高级别的概念。它由系统(内核)调用实现,要求内核将消息传递给其他进程。系统调用要求内核为进程执行各种服务。它们由软件中断/系统陷阱实现,这会导致 cpu 在堆栈上保存一些状态,以便稍后返回,然后切换到内核模式并跳转到内核处理程序。
硬件和软件中断都会导致 cpu 保存状态,切换到内核模式,并跳转到该中断的定义处理程序。不同的是,硬件中断是由外部硬件在需要注意的时候产生的,比如键盘提示某个键被按下。然后键盘处理程序可以去读取键盘 IO 端口,看看按下了什么键,并采取适当的行动,然后返回到被中断的程序。