操作系统 系统调用与库调用之间的区别
在本文中,您将了解系统调用与库调用之间的区别。但在讨论区别之前,您必须了解系统调用和库调用。
什么是系统调用
它是进程与操作系统之间进行通信的方法。它是一种编程方法,使计算机程序能够向操作系统的内核请求服务。系统调用通过 API(应用程序编程接口) 向用户程序提供操作系统的服务。内核系统的唯一入口点就是系统调用。
计算机系统中有两种模式可用:内核模式和用户模式。在计算机系统中,会执行各种类型的程序或应用。程序在内核模式下可以直接访问硬件资源和内存,内核模式比用户模式更有特权。在用户模式下,程序无法直接访问内存和硬件资源。大多数程序在用户模式下运行。当一个程序需要硬件资源和内存时,它会向内核发送一个系统调用请求。随后,模式从用户模式切换到内核模式。工作完成后,模式从内核模式切换回用户模式。因此,这种模式转换也被称为上下文切换。
UNIX系统中主要有两个系统调用,如下所示:
- fork()
- exec()
fork()
它用于启动一个新进程,同时保持现有进程运行。当特定进程调用 fork() 时,它会复制一个进程。结果就是有两个进程,第一个进程是父进程,第二个进程是子进程。
exec()
它用于启动一个新进程并替换旧的运行进程。因此,在调用 exec() 之后,只有新的进程存在。
什么是库调用
它是向编程库发出使用某个函数的请求。库文件包含代码、数据和目标文件,这些文件存储在一个文件中供使用。在执行库调用之前,必须导入库文件,而库调用可能依赖于系统调用。
在C编程中,用户可以通过在程序中添加头文件来使用库函数。预处理指令 (#include) 有助于添加头文件。用于执行输入和输出操作的各种函数被包含在 stdio.h 头文件中。如果要打开一个文件,可以使用 fopen() 函数,如果要关闭文件,可以使用 fclose() 函数。而 printf() 函数用于将格式化输出传输到标准输出设备,而 scanf() 函数用于从标准输入设备读取格式化输入。
此外, “math.h” 头文件还提供了执行数学计算的函数。 “time.h” 头文件包含计算时间和日期的函数。 “string.h” 头文件包含操作字符串的函数。
系统调用和库调用的主要区别
在这里,你将了解系统调用和库调用之间的主要区别。系统调用和库调用之间的几个不同之处如下:
- 系统调用是允许你进入内核模式并访问硬件资源的内核函数。另一方面,库调用是由编程库提供的用于完成任务的函数。
- 在系统调用函数中,模式从用户模式切换到内核模式。另一方面,在库调用函数中没有模式切换。
- 系统调用比库调用执行时间长。另一方面,库调用执行时间比系统调用快。
- 系统调用中的所有函数都是内核的一部分。另一方面,库调用中的所有库函数都是编程语言的标准库文件的一部分。
- 它是一个程序访问内核模式中的进程的请求。另一方面,库调用是一个程序访问编程库中提供的库函数的请求。
系统调用和库调用之间的对比
在这里,你将了解系统调用和库调用之间的对比。系统调用和库调用之间的主要区别如下:
系统调用 | 库调用 |
---|---|
所有函数都是系统调用中内核的一部分。 | 所有库调用中的库函数都是编程语言的标准库文件的一部分。 |
它是内核的入口点。因此,它不与程序链接。 | 它与你的程序链接。 |
系统调用的执行时间比库调用长。 | 库调用的执行速度比系统调用快。 |
存在模式切换,即模式从用户模式切换到内核模式。 | 没有模式切换。 |
它是一个允许你进入内核模式并访问硬件资源的内核功能。 | 它是一个编程库提供的执行任务的函数。 |
它在内核模式下执行。 | 它在用户模式下执行。 |
它是程序以内核模式访问进程的请求。 | 它是程序对编程库中的库函数的请求。 |
它不可移植。 | 它是可移植的。 |
这些由系统提供,并由系统内核实现。 | 这些添加到ANSI C标准库中。 |
系统调用的示例包括: Fork() Exec() |
库调用的示例包括: Fopen() Fclose() Printf() Scanf() |
结论
系统调用在内核空间执行,而库调用在用户空间执行。库调用是编程库提供的函数。相比之下,系统调用是允许您进入内核模式并访问硬件资源的内核函数。库调用可以依赖系统调用来完成任务。一些系统调用的实例包括 cd(),fork() 。一些库调用的例子包括 fopen(),fprintf() 。