6-4. 输入输出缓存

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

1. 探究printf的现象

我们分别在windows系统和linux系统上使用代码做以下操作:

输出"HelloWorld"十次,每次输出后暂停500毫秒。

1.1 windows系统上的代码

//  windows系统
#include <stdio.h>
#include <windows.h>
int main()
{
    for (int i = 0; i < 10; i++)
    {
        printf("Hello World %d", i);
        Sleep(500); //  使用Sleep函数休眠500毫秒
    }
    return 0;
}

在windows系统上,我们使用windows.h头文件中提供的Sleep函数,每次输出后休眠500毫秒。

1.2 linux系统上的代码

//  linux系统
#include <stdio.h>
#include <unistd.h>
int main()
{
    for(int i = 0; i < 10; i++)
    {
        printf("Hello World %d", i);
        usleep(1000 * 500); //  使用usleep函数休眠500毫秒
    }
    return 0;
}

在linux系统上,我们使用unistd.h头文件中提供的usleep函数,每次输出后休眠500毫秒。usleep的单位为1微秒,1000微秒为1毫秒。代码中给usleep传入1000 * 500,表示500毫秒。

两份代码除了休眠使用的函数不同,其他都是一致的,按理说效果也应当一致。我们来看看运行后的具体情况。

1.3 windows系统上的表现

windows下的printf

windows系统上打印出一个HelloWorld后,休眠500毫秒,再打印下一个。

1.4 linux系统上的表现

linux下的printf

linux系统上,休眠5000毫秒,打印出所有HelloWorld

为了解释这个现象我们来学习一下输入与输出缓存。

2. 输入输出缓存区

举一个常见的例子,生活中我们往往会将衣服集满了一桶再洗,而不是只有一两件脏衣服也启动洗衣机导致浪费水电资源。

计算机中也有类似的思想,减少不必要的操作开销。