什么是上下文切换
系统调用和库调用的区别
1、System Call (系统调用)
计算机系统中有两种模式,一种是用户态,另一种是内核态。在计算机系统中,有不同类型的进程在计算机系统上运行。当用户运行应用程序时,它被称为处于用户模式或计算机处于用户模式。当需要硬件资源时,比如输出内容到控制台,进程向内核发送请求以获取进程访问权限,然后计算机进入内核模式。这些请求是通过使用系统调用(syscall)发送的。计算机经常在这两种模式之间切换。每当任务完成时,计算机就会从内核模式返回到用户模式。这种转换模式称为上下文切换(context switching)。
什么是上下文切换?上下文切换是将CPU的当前状态存储在过程控制块中的过程。
我们可以用以下方式来查看某进程上下文切换的情况
[root@ht6 src]# ls /proc
1 24 .. //24就是某个进程号
[root@ht6 src]# grep ctxt /proc/24/status
voluntary_ctxt_switches: 957790
nonvoluntary_ctxt_switches: 11
[root@ht6 src]# grep ctxt /proc/24/status | awk '{ print $2 }'
957783
11
[root@ht6 src]# watch -n.5 grep ctxt /proc/24/status
[root@ht6 src]# sar -w 1 3
Linux 3.10.0-1160.62.1.el7.x86_64 (ht6.node) 03/13/2023 _x86_64_ (8 CPU)
08:24:10 PM proc/s cswch/s
08:24:11 PM 0.00 158.00
08:24:12 PM 0.00 139.00
08:24:13 PM 0.00 179.00
Average: 0.00 158.67
系统调用是允许用户应用程序请求需要特殊权限的操作的例程。添加系统调用是扩展内核提供的功能的几种方法之一。系统调用和普通函数调用之间的区别只在内核编程环境中才重要。用户模式应用程序通常不会意识到这种区别。操作系统功能以编程库的形式提供给应用程序。例如: glibc库。 在libc.a等库中找到的一组库函数 可以具有执行某些用户模式处理然后在内部启动系统调用的函数。
在其他情况下,系统调用可以直接由库导出,无需任何用户空间代码。
wiki百科的解释
在计算中,上下文切换是存储进程或线程状态的过程,以便稍后可以恢复并恢复执行,然后恢复先前保存的不同状态。[1]这允许多个进程共享一个中央处理器(CPU),并且是多任务操作系统的基本特征. 在传统的 CPU 中,每个进程(一个正在执行的程序)都利用各种 CPU 寄存器来存储数据并保持正在运行的进程的当前状态。然而,在多任务操作系统中,操作系统在进程或线程之间切换以允许多个进程同时执行。对于每个开关,操作系统必须保存当前运行进程的状态,然后加载下一个进程状态,该进程将在 CPU 上运行。这种存储正在运行的进程的状态和后续正在运行的进程的加载的操作序列称为上下文切换。
“上下文切换”一词的确切含义各不相同。在多任务上下文中,它指的是为一个任务存储系统状态的过程,以便可以暂停任务并恢复另一个任务。上下文切换也可能由于中断而发生,例如当任务需要访问磁盘存储时,为其他任务释放 CPU 时间。某些操作系统还需要上下文切换才能在用户模式和内核模式任务之间移动。上下文切换过程会对系统性能产生负面影响
上下文切换有三个潜在的触发器:
1)多任务处理
最常见的是,在某些调度方案中,必须将一个进程切换出 CPU,以便另一个进程可以运行。此上下文切换可以由使自身不可运行的进程触发,例如等待I/O或同步操作完成。在抢占式多任务系统上,调度程序也可能会切换出仍可运行的进程。为了防止其他进程的 CPU 时间不足,抢占式调度程序通常会配置一个定时器中断,以便在进程超过其时间片时触发。此中断确保调度程序将获得执行上下文切换的控制权。
2)中断处理
现代架构是中断驱动的。这意味着如果 CPU 从磁盘请求数据,例如,它不需要忙等到读取结束;它可以发出请求(到 I/O 设备)并继续执行其他任务。当读取结束时,CPU 可以被中断(在这种情况下由硬件向PIC发送中断请求)并呈现读取。对于中断,安装了 一个称为中断处理程序的程序,它是处理来自磁盘的中断的中断处理程序。
当中断发生时,硬件会自动切换一部分上下文(至少足以让处理程序返回到被中断的代码)。处理程序可以保存额外的上下文,这取决于特定硬件和软件设计的细节。通常只更改上下文的最小部分,以最大限度地减少处理中断所花费的时间。内核不会生成或安排特殊进程来处理中断,而是处理程序在中断处理开始时建立的(通常是部分的)上下文中执行。一旦中断服务完成,中断发生前有效的上下文就会被恢复,这样被中断的进程就可以在其正确的状态下继续执行。
3)用户和内核模式切换
当系统在用户态和内核态之间转换时,不需要上下文切换;模式转换本身并不是上下文切换。但是,根据操作系统的不同,此时也可能会发生上下文切换。
2. Library Call(库调用):
库调用是一种使用编程库中定义的特定函数的请求。一个库文件包含代码数据文件、目标文件,打包成一个文件使用。要进行库调用,应首先导入库。库调用可能依赖于系统调用来完成任务。比如:glibc库.
3. glic库
系统调用和库调用的区别:
| 编号 |
系统调用 |
图书馆电话 |
| 1. | 系统调用是程序发出的进入内核模式以访问进程的请求。 | 库调用是程序发出的访问编程库中定义的库函数的请求。 |
| 2. | 在内核模式下,程序可以直接访问内存和硬件资源。 | 在用户模式下,程序不能直接访问内存和硬件资源。 |
| 3. | 在系统调用中,模式被执行或从用户模式切换到内核模式。 | 在库调用中,该模式仅在用户模式下执行。 |
| 4. | 在系统调用中,执行过程速度比库调用慢,因为存在一种称为上下文切换的转换模式。 | 在库调用中执行过程速度比系统调用更快,因为没有上下文切换模式。 |
| 5. | 系统调用是内核提供的进入内核态访问硬件资源的函数。 | 库调用是编程库提供的用于执行任务的函数。 |
| 6. | 系统调用是内核的入口点,因此它们不链接到程序。 | 库函数链接到您的程序中。 |
| 7. | 系统调用不可移植。 | 库调用是可移植的。 |
| 8. | 系统调用比库调用有更多的特权,因为它以监督模式运行。 | 库调用的权限低于系统调用,因为它仅在用户模式下运行。 |
| 9. | 系统调用由系统提供,由系统内核执行。 | 库调用包括 ANSI C 标准库。 |
| 10. | 在系统调用中,所有函数都是内核的一部分。 | 在库调用中,所有库函数都是编程语言标准库文件的一部分。 |
| 11. | 每当程序需要内存或硬件资源时,它会直接向内核发送请求,通过系统调用获得进程访问权。 |
每当程序员或开发人员使用特定的库函数时,程序员必须首先通过将头文件包含到他的程序中来调用或调用库函数。预处理器 (#) 指令有助于包含头文件。一些有用的头文件是:- 1.#include<stdio.h> 2. #include<数学.h> 3. #include<conio.h> |
| 12. |
系统调用的例子是—— 1.叉子() 2.执行() |
图书馆调用的例子是 - 1. fopen() 2.关闭() 3.扫描() 4.打印() |
参考:
https://en.wikipedia.org/wiki/System_call
https://www.geeksforgeeks.org/difference-between-system-call-and-library-call/?ref=rp
https://www.ibm.com/docs/en/aix/7.2?topic=concepts-system-calls
https://www.usenix.org/legacyurl/linux-system-calls-and-glibc
https://en.wikipedia.org/wiki/Context_switch

浙公网安备 33010602011771号