壅闭、非壅闭同样是看主程序执行过程中,对函数调用后的情况来判定。区分壅闭和非壅闭的关键点在于函数调用后 CPU 的使用权是否会被转移。
壅闭:函数调用后,由于 I/O 等操作导致了 CPU 暂停执行本段程序。最常见的是磁盘读写操作导致的 CPU 被切换去执行其他历程。发生壅闭的情况基本上都涉及到系统调用
非壅闭:函数调用后,CPU 不会因为此次调用而被切换去执行其他历程。
2. 举例
写代码的时候会使用到系统调用(RTFW),涉及到磁盘 I/O 的系统调用通常都会产生壅闭,比如read、write、recv等函数。
为什么会产生壅闭呢?
这是因为 CPU 和磁盘的速度差距有如天壤之别导致的(如果 CPU 的速度比作是战斗机,那么磁盘的读写速度就是肯德坤)。为了最大化 CPU 的执行服从,CPU 不会空等着磁盘读写完成,而是切换到其他历程去执行,等磁盘读写完成后再返回来继承执行主程序剩下的代码。由于 CPU 的使用权被转移,导致本程序被暂停执行,这种情况下就说程序由于这个函数调用被壅闭了。
int main(int argc, char* argv[]) {
FILE* file = open("file_path");
int res = read(file); // 此时程序被阻塞 n 秒
process(file); // 后面的程序在 read 函数返回后才能继续执行
int res = write(file);
}
复制代码
非壅闭就是指主程序在函数调用时不会导致 CPU 切换至其他历程上去执行(除非时间片切换)
[code]long sum(int a, int b) { // 调用 sum 求 1-10000 亿的和 long sum = 0; for (int i = a; i