操作系统 (OS) 中的系统调用

13 Apr 2025 | 12 分钟阅读

系统调用是用户程序与操作系统交互的一种方式。程序请求几项服务,操作系统通过调用一系列系统调用来响应以满足请求。系统调用可以用汇编语言或高级语言(如 CPascal)编写。系统调用是在使用高级语言时操作系统可能直接调用的预定义函数。

在本文中,您将了解操作系统中的系统调用,并讨论它们的类型以及许多其他内容。

什么是系统调用?

系统调用是计算机程序请求其运行的 操作系统 内核服务的的一种方法。

系统调用是程序通过系统与操作系统交互的一种方法。系统调用是指计算机软件向操作系统内核发出的请求。

应用程序编程接口 (API) 连接了操作系统功能与用户程序。它充当操作系统和进程之间的链接,允许用户级程序请求操作系统服务。

只有通过系统调用才能访问内核系统。任何使用资源的程序都需要系统调用。

用户模式与内核模式:在用户模式下,程序无法直接访问硬件资源;它们通过系统调用请求内核模式下的操作。

系统调用通过其可访问的资源来保护系统安全,这些资源是操作系统能够获取的。这是因为系统调用主要将直接硬件控制限制在操作系统本身。

如何进行系统调用?

当计算机软件需要访问操作系统内核时,它会发出一个系统调用。系统调用使用 API 将操作系统服务暴露给用户程序。这是访问内核系统的唯一方法。所有需要资源执行的程序或进程都必须使用系统调用,因为它们是操作系统和用户程序之间的接口。

以下是一些系统调用与用户函数不同的示例。

  1. 系统调用函数可能会创建和使用内核进程来执行异步处理。
  2. 系统调用的权限大于普通子程序。具有内核模式权限的系统调用在内核保护域中执行。
  3. 系统调用不允许使用共享库或任何不在内核保护域中的符号。
  4. 系统调用的代码和数据存储在全局内核内存中。
  5. 系统调用控制进程间通信 (IPC) 和系统资源分配;用户函数通常不控制这些。
  6. 系统调用控制信号、中断和内存保护;用户函数不能直接修改这些。
  7. 系统调用以更高的权限和更严格的安全条件执行;用户函数的权限较低。
  8. 系统调用可能直接使用内核空间资源;用户函数对内核操作没有直接影响。

为什么在操作系统中需要系统调用?

在操作系统中有各种需要系统调用的情况。以下是这些情况:

  1. 当文件系统想要创建或删除文件时,必须需要系统调用。
  2. 网络连接需要系统调用来发送和接收数据包。
  3. 如果要读取或写入文件,则需要系统调用。
  4. 如果要访问硬件设备,包括打印机、扫描仪,则需要系统调用。
  5. 系统调用用于创建和管理新进程。
  6. 它们允许系统程序控制硬件设备——例如,设置参数或读取状态。
  7. 它们强制执行访问控制和权限以保护系统资源。
  8. 用于进程间通信和协调。
  9. 系统调用提供访问系统状态信息和配置数据的机制。

系统调用如何工作?

应用程序运行在称为用户空间的内存区域。系统调用连接到在内核空间运行的操作系统内核。当应用程序创建系统调用时,它必须首先获得内核的权限。它通过中断请求来实现这一点,中断请求会暂停当前进程并将控制权转移到内核。

如果请求被允许,内核将执行请求的操作,例如创建或删除文件。作为输入,应用程序会收到内核的输出。收到输入后,应用程序会恢复过程。操作完成后,内核将结果返回给应用程序,然后将数据从内核空间移动到内存中的用户空间。

一个简单的系统调用可能需要几纳秒才能提供结果,例如检索系统日期和时间。更复杂的系统调用,例如连接到网络设备,可能需要几秒钟。大多数操作系统为每个系统调用启动一个单独的内核线程,以避免瓶颈。现代操作系统是多线程的,这意味着它们可以同时处理各种系统调用。

系统调用类型

通常有五种类型的系统调用。它们如下:

System Calls in Operating System
  1. 流程控制
  2. 文件管理
  3. 设备管理
  4. 信息维护
  5. 沟通

现在,您将逐一了解所有不同的系统调用类型。

1. 进程控制

进程控制是用于定向进程的系统调用。一些进程控制示例包括创建、加载、中止、结束、执行、进程、终止进程等。

以下是其工作原理的详细介绍

  • 进程创建:每次启动新应用程序时,操作系统都会创建一个进程。然后为其分配一个唯一的进程 ID,并为其提供所有必需的资源,例如内存,以便它可以开始启动。
  • 进程调度:操作系统需要决定哪个进程轮到 CPU。它通过调度算法来实现——有点像确保排队中的每个人都能轮到结账。这可以使事情顺利进行,而无需等待,无论是先到先服务的方法还是优先处理特定任务。
  • 进程执行:进程诞生后,就该运行程序了。操作系统在进程之间切换,确保您的计算机能够多任务处理。想象一下杂耍者抛球:每当一个球落地时,另一个球就会在空中被接住。CPU 就是这样管理各种进程的!
  • 挂起和恢复:有时,会挂起进程以释放资源或让其他更重要的进程运行。系统会保存其状态,以便在恢复时可以从中断处继续,就像在视频游戏中按下暂停按钮一样。
  • 进程终止:每个进程最终都需要终止——它要么完成工作,要么发生错误。在操作系统的情况下,它会简单地从内存中释放该资源并将其丢弃,使一切都变得整洁有序。
  • 进程间通信 (IPC):进程有时需要与其他进程通信。为了实现这一点,操作系统提供了消息传递或共享内存等设施。将两个朋友互相发短信视为进程通信的方式。
  • 同步:有时,进程希望共享资源——例如文件或内存。但是,如果它们都希望同时访问一个资源,情况可能会变得有些混乱。因此,为了防止这种混乱,操作系统使用了信号量和互斥量等工具,它们负责顺利协调一切,以免发生冲突。
  • 死锁处理:死锁是指进程陷入僵局,互相等待资源,人们互相给对方开门,都无法通过。操作系统有避免或解决这些情况的策略,以确保没有任何进程被无限期地死锁。

2. 文件管理

因此,文件管理基本上是指您的计算机如何处理文件的组织和操作。它就像将您的实体文件存放在抽屉里一样:每个文件都需要被创建、打开、编辑,有时甚至被丢弃。操作系统在后台处理所有这些。

好了,让我们稍微分解一下

  • 创建文件:每次保存新文档或程序时,您的计算机都会创建一个文件。它会在硬盘或其他存储设备上为其分配一个位置——就像您将纸质文件放入文件夹一样。
  • 打开文件:要查看或编辑文件,您需要打开它。操作系统会检索它,以便您可以查看或处理它。
  • 读取文件:文件打开后,就可以读取其内容了。无论是文本文件、图像还是其他任何内容,操作系统都会从存储中调取以供查看和处理。
  • 写入文件:每次进行更改时——无论是通过在文档中键入还是调整图片——操作系统都会将这些更改写入文件。
  • 关闭文件:完成操作后,关闭文件会保存所有内容并将其标记为未使用。就像您读完或修改完文档后将其放回文件夹一样。
  • 删除文件:当您认为文件不再需要时,就可以将其删除。操作系统会将其从存储中删除,从而为其他内容腾出更多空间。
  • 控制权限:有时您可能需要控制谁可以访问和编辑某些文件。操作系统允许您为每个文件设置权限,以便您可以选择其他人是否可以运行、修改或打开它。

3. 设备管理

设备管理是一种用于处理设备的系统调用。设备管理的一些示例包括读取设备、写入设备、获取设备属性、释放设备等。设备管理的作用如下:

  • 从设备读取:每当计算机需要从设备读取数据时,无论是从硬盘读取文件还是从键盘输入,操作系统都会处理该请求。它确保数据被正确读取,然后转发到正确的位置。
  • 向设备写入:当您需要将数据导出到设备时,例如将报告文件保存到 USB 驱动器或打印它,操作系统会负责处理,并确保所有数据都以正确的方式写入设备。
  • 获取设备属性:操作系统可以获取有关设备的信息,例如其状态或设置。例如,它可以检查磁盘上的可用空间或无线鼠标的电池电量。
  • 资源分配:操作系统决定设备获得多少系统资源,如内存或处理能力,这样任何设备都不会超出其份额,并且整个系统能够顺利运行。
  • 释放设备:设备完成所有工作后,操作系统会释放设备,即释放为此设备分配的系统资源。本质上,这就像您在使用完 USB 驱动器后将其从计算机中拔出一样安全。
  • 处理中断:设备经常向 CPU 发送信号,称为中断,要求其关注。操作系统会处理这些中断,以便它知道何时有设备需要关注,并按正确的顺序处理它们。

4. 信息维护

信息维护是用于维护信息的系统调用。信息维护的一些示例包括获取系统数据、设置时间/日期、获取时间/日期、设置系统数据等。日常活动中的常见信息维护是:

  • 获取系统数据:它获取有关系统本身的信息,例如 CPU 或内存使用情况、网络状态等。它会记录所有正在使用的资源。
  • 设置系统数据:操作系统可以在需要时更改与系统相关的一些配置,例如更改系统行为、更新配置、设置用户偏好等。
  • 检索时间或日期:操作系统可以检索系统的当前时间。这用于许多应用程序,例如文件时间戳、日志记录和调度。
  • 设置时间或日期:系统可在需要时更新当前时间和日期;因此,可以将准确的时间和日期附加到文件或进程,或与外部时钟同步。
  • 系统日志和审计:操作系统维护有关错误、系统性能或用户操作的事件日志和活动记录。主要用于调试和监控系统。

5. 沟通

通信是一个用于通信的系统调用。通信的一些例子包括创建、删除通信连接、发送、接收消息等。通信涉及的关键活动如下:

  • 建立通信链路:操作系统通过通信通道连接两个进程或设备。连接可以使用套接字、管道或共享内存执行;因此,它有助于这两个进程或设备之间的轻松通信。
  • 关闭通信链路:通信进程完成后,操作系统会拆除或删除链路;资源将被释放,系统不受影响。
  • 操作系统确保一个进程或系统发送的消息或数据能够到达目标收件人,无论是本地的还是网络上的。
  • 接收消息:接收进程获取由另一个进程发送的数据。操作系统管理传入的消息,并确保它被传递给正确的接收者。
  • 管理通信协议:操作系统管理规则和通信协议,这些协议使数据能够以适当的格式和顺序进行发送和接收。

Windows 和 Unix 系统调用的示例

Windows 和 Unix 系统调用有各种示例。它们如下表所示:

过程WindowsUnix
流程控制CreateProcess()
ExitProcess()
WaitForSingleObject()
Fork()
Exit()
Wait()
文件操作CreateFile()
ReadFile()
WriteFile()
CloseHandle()
Open()
Read()
Write()
Close()
设备管理SetConsoleMode()
ReadConsole()
WriteConsole()
Ioctl()
Read()
Write()
信息维护GetCurrentProcessID()
SetTimer()
Sleep()
Getpid()
Alarm()
Sleep()
沟通CreatePipe()
CreateFileMapping()
MapViewOfFile()
Pipe()
Shmget()
Mmap()
保护SetFileSecurity()
InitializeSecurityDescriptor()
SetSecurityDescriptorgroup()
Chmod()
Umask()
Chown()

这里,您将简要了解一些方法

open()

open() 调用允许进程开始访问存储在文件系统中的文件。因此,它可以按需分配资源并返回一个文件描述符,该文件描述符成为用于访问或读取文件的句柄。

多个进程可以打开同一个文件,或者对文件的访问可能只属于一个进程,具体取决于文件系统的设计和权限。在对文件执行任何读取或写入操作之前,需要执行文件 open() 系统调用。

read()

它用于从文件系统中的文件获取数据。它通常接受三个参数:

  • 文件描述符。
  • 用于存储读取数据的缓冲区。
  • 要从文件中读取的字节数。

要读取的文件的文件描述符可用于标识它,并在读取之前使用 open() 打开它。

wait()

在某些系统中,一个进程可能必须等待另一个进程完成执行才能继续。当父进程创建子进程时,父进程的执行会暂停,直到子进程完成。wait() 系统调用用于暂停父进程。一旦子进程完成执行,控制权就会返回给父进程。

write()

它用于将用户缓冲区中的数据写入设备(如文件)。此系统调用是程序生成数据的一种方式。它通常接受三个参数:

  • 文件描述符。
  • 指向保存数据的缓冲区的指针。
  • 要从缓冲区写入的字节数。

fork()

进程使用 fork() 系统调用创建自身的克隆。这是操作系统中创建进程最常见的方式之一。当父进程生成子进程时,父进程的执行会暂停,直到子进程完成。一旦子进程完成执行,控制权就会返回给父进程。

close()

它用于结束文件系统访问。调用此系统调用时,表示程序不再需要该文件,缓冲区将被刷新,文件信息将发生更改,并因此释放文件资源。

exec()

当可执行文件替换已执行进程中的早期可执行文件时,会调用此系统函数。由于没有创建新进程,旧进程标识保持不变,但新进程替换了数据、堆栈、数据、头部等。

exit()

exit() 是一个用于结束程序执行的系统调用。此调用表示线程执行已完成,这在多线程环境中尤其有用。操作系统在使用 exit() 系统函数后会回收进程使用的资源。