不同类型的系统调用
进程与操作系统之间的接口由系统调用提供。一般来说,系统调用以汇编语言指令的形式提供。它们也包含在汇编级程序员使用的手册中。
当用户模式下的进程需要访问资源时,通常会进行系统调用。然后它请求内核通过系统调用提供资源。
系统调用的类型
主要有五种类型的系统调用。这些将在下面详细解释:
以下是系统调用的类型:
进程控制
这些系统调用处理进程,例如进程创建、进程终止等。
文件管理
这些系统调用负责文件操作,例如创建文件、读取文件、写入文件等。
设备管理
这些系统调用负责设备操作,例如从设备缓冲区读取、写入设备缓冲区等。
信息维护
这些系统调用处理信息及其在操作系统和用户程序之间的传输。
通信
这些系统调用对于进程间通信非常有用。它们还处理创建和删除通信连接。
以下是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() |
如上所示,存在许多不同的系统调用。其中一些系统调用的详细信息如下:
wait()
在某些系统中,进程可能需要等待另一个进程完成其执行。当父进程创建子进程并且父进程的执行挂起直到子进程执行时,就会发生这种情况。父进程的挂起发生在 wait() 系统调用中。当子进程完成执行时,控制权将返回给父进程。
exec()
此系统调用在正在运行的进程的上下文中运行可执行文件。它替换了之前的可执行文件。这被称为覆盖。原始进程标识符保持不变,因为没有创建新进程,但进程的数据、堆、堆栈等被新进程替换。
fork()
进程使用 fork() 系统调用来创建自身的副本进程。这是操作系统中进程创建的主要方法之一。当父进程创建子进程并且父进程的执行挂起直到子进程执行时。当子进程完成执行时,控制权将返回给父进程。
exit()
程序使用 exit() 系统调用来终止其执行。在多线程环境中,这意味着线程执行已完成。exit() 系统调用之后,操作系统会回收进程使用的资源。
kill()
操作系统使用 kill() 系统调用向进程发送终止信号,促使进程退出。但是,kill 系统调用并不一定意味着杀死进程,它可以具有多种含义。