操作系统中的系统调用:是什么、类型和示例
什么是操作系统中的系统调用?
系统调用是一种机制,它提供了进程与操作系统之间的接口。它是一种编程方法,计算机程序通过该方法请求操作系统内核的服务。
系统调用通过 API(应用程序编程接口)为用户程序提供操作系统服务。系统调用是内核系统的唯一入口点。

系统调用示例
例如,如果我们想编写一个程序代码,从一个文件读取数据,然后将该数据复制到另一个文件中。程序首先需要的信息是两个文件的名称,即输入文件和输出文件。
在交互式系统中,此类程序执行需要操作系统的一些系统调用。
- 第一个调用是在屏幕上显示提示消息
- 第二个是读取键盘输入的定义两个文件的字符。
系统调用如何工作?
以下是操作系统中系统调用的步骤
如上图所示的系统调用示例图。
步骤 1) 进程在用户模式下执行,直到系统调用中断它。
步骤 2) 之后,系统调用以优先顺序在内核模式下执行。
步骤 3) 系统调用执行完成后,控制权返回到用户模式。
步骤 4) 用户进程在内核模式下恢复执行。
为什么在操作系统中需要系统调用?
以下是操作系统中需要系统调用的情况
- 文件读写需要系统调用。
- 如果文件系统要创建或删除文件,则需要系统调用。
- 系统调用用于创建和管理新进程。
- 网络连接需要系统调用来发送和接收数据包。
- 访问硬件设备(如扫描仪、打印机)需要系统调用。
系统调用类型
以下是操作系统中的五种系统调用类型
- 进程控制
- 文件管理
- 设备管理
- 信息维护
- 通信
进程控制
这些系统调用执行进程创建、进程终止等任务。
函数
- 结束和中止
- 加载和执行
- 创建进程和终止进程
- 等待和信号事件
- 分配和释放内存
文件管理
文件管理系统调用处理文件操作,如创建文件、读写等。
函数
- 创建文件
- 删除文件
- 打开和关闭文件
- 读、写和定位
- 获取和设置文件属性
设备管理
设备管理负责设备操作,如从设备缓冲区读取、写入设备缓冲区等。
函数
- 请求和释放设备
- 逻辑附加/分离设备
- 获取和设置设备属性
信息维护
它处理操作系统和用户程序之间的信息及其传输。
函数
- 获取或设置时间和日期
- 获取进程和设备属性
沟通
这些类型的系统调用专门用于进程间通信。
函数
- 创建、删除通信连接
- 发送、接收消息
- 帮助操作系统传输状态信息
- 附加或分离远程设备
系统调用传递参数的规则
以下是将参数传递给系统调用的通用规则
- 参数应由操作系统推入或弹出堆栈。
- 参数可以通过寄存器传递。
- 当参数多于寄存器时,应将其存储在一个块中,并将块地址作为参数传递给寄存器。
操作系统中使用的重要系统调用
wait()
在某些系统中,进程需要等待另一个进程完成其执行。这种情况发生在父进程创建子进程时,父进程的执行将一直暂停,直到子进程执行完毕。
父进程的暂停会通过 wait() 系统调用自动发生。当子进程结束执行时,控制权会移回到父进程。
fork()
进程使用此系统调用来创建与其自身的副本相同的进程。借助此系统调用,父进程创建子进程,并且父进程的执行将暂停,直到子进程执行。
exec()
此系统调用在已运行进程的上下文中运行一个可执行文件,该文件替换了旧的可执行文件。但是,由于没有构建新进程,原始进程标识符保持不变,但堆栈、数据、头部、数据等被新进程替换。
kill()
kill() 系统调用由操作系统用于向进程发送终止信号,该信号促使进程退出。但是,kill 系统调用不一定意味着终止进程,它可以有多种含义。
exit()
exit() 系统调用用于终止程序执行。特别是在多线程环境中,此调用定义了线程执行的完成。在使用 exit() 系统调用后,操作系统会收回进程使用的资源。
摘要
类别 | 车窗 | Unix |
---|---|---|
进程控制 | CreateProcess() ExitProcess() WaitForSingleObject() |
fork() exit() wait() |
设备操作 | SetConsoleMode() ReadConsole() WriteConsole() |
loctl() read() write() |
文件操作 | CreateFile() ReadFile() WriteFile() CloseHandle() |
Open() Read() write() close!) |
信息维护 | GetCurrentProcessID() SetTimer() Sleep() |
getpid() alarm() sleep() |
沟通 | CreatePipe() CreateFileMapping() MapViewOfFile() |
Pipe() shm_open() mmap() |
保护 | SetFileSecurity() InitlializeSecurityDescriptor() SetSecurityDescriptorGroup () |
Chmod() Umask() Chown() |