操作系统中的系统调用是什么?
系统调用提供了进程和操作系统之间的接口。一般来说,系统调用以汇编语言指令的形式提供。它们也包含在汇编级程序员使用的手册中。当用户模式下的进程需要访问资源时,通常会进行系统调用。然后它请求内核通过系统调用提供资源。
下图显示了系统调用的执行过程:
从该图可以看出,进程在用户模式下正常执行,直到系统调用中断它。然后,系统调用在内核模式下优先执行。系统调用执行完毕后,控制权返回用户模式,可以恢复用户进程的执行。
一般来说,在以下情况下需要系统调用:
- 如果文件系统需要创建或删除文件。从文件读取和写入也需要系统调用。
- 创建和管理新进程。
- 网络连接也需要系统调用。这包括发送和接收数据包。
- 访问硬件设备(如打印机、扫描仪等)需要系统调用。
系统调用的类型
主要有五种类型的系统调用。详细解释如下:
进程控制
这些系统调用处理进程,例如进程创建、进程终止等。
文件管理
这些系统调用负责文件操作,例如创建文件、读取文件、写入文件等。
设备管理
这些系统调用负责设备操作,例如从设备缓冲区读取、写入设备缓冲区等。
信息维护
这些系统调用处理信息及其在操作系统和用户程序之间的传输。
通信
这些系统调用可用于进程间通信。它们还处理创建和删除通信连接。
下面列出Windows和Unix中上述所有类型系统调用的示例:
系统调用的类型 | Windows | Linux |
---|---|---|
进程控制 | 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() |
如上所示,有很多不同的系统调用。其中一些系统调用的详细信息如下:
open()
open() 系统调用用于访问文件系统中的文件。此系统调用为文件分配资源,并提供进程用于引用文件的句柄。多个进程可以同时打开一个文件,也可以限制为一个进程。这完全取决于文件组织和文件系统。
read()
read() 系统调用用于访问存储在文件系统中的文件数据。要读取的文件可以通过其文件描述符标识,并且应该在读取之前使用 open() 打开。一般来说,read() 系统调用接受三个参数:文件描述符、存储读取数据的缓冲区和要从文件中读取的字节数。
write()
write() 系统调用将数据从用户缓冲区写入设备(例如文件)。此系统调用是从程序输出数据的方法之一。一般来说,write 系统调用接受三个参数:文件描述符、存储数据的缓冲区的指针以及要从缓冲区写入的字节数。
close()
close() 系统调用用于终止对文件系统的访问。使用此系统调用意味着程序不再需要该文件,因此缓冲区将被刷新,文件元数据将被更新,并且文件资源将被释放。