如何编写I / O绑定的C程序?

时间:2016-10-17 23:10:25

标签: c linux io operating-system scheduler

我必须编写I / O界限的程序,这将使我的I / O调度程序像以前从未做过的操作系统作业一样工作,但我不知道该怎么做。我已经尝试编写一个简单的C程序来计算大文本文件的行数,但它执行得太快,我无法用它来衡量我的调度程序的有效性。这比我的成绩高出25%,任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:0)

试试这个:

find / | head -n 1000000 | xargs -P 10 wc >/dev/null 2>&1

应该很糟糕。 xargs -P选项使其并行运行。您可以调整选项以获得合适的负载。除了消耗每个文件之外,wc没有做太多其他事情,所以认为它应该主要是IO绑定的。当然还有磁盘缓存。

答案 1 :(得分:0)

上一个答案显示的CPU绑定比我测试中的i / o更多。

我建议使用低级非缓存C例程在每个文件中打开许多文件并寻求疯狂。以下是执行搜索的C代码:

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv) {

    if (argc != 2) {
        fprintf(stderr, "specify a file to read!\n");
        return EXIT_FAILURE;
    }

    int fd = open(argv[1], O_DIRECT);
    if (fd < 0) {
        perror("open error");
        return EXIT_FAILURE;
    }

    off_t size = lseek(fd, 0, SEEK_END);

    for (int i = 0; i < 1000000; i++)                                                                                
        lseek(fd, rand() % size, SEEK_SET);

    close(fd);

    return EXIT_SUCCESS;
}

然后,在shell中,通过find运行文件系统中的每个文件:

find / -exec ./io_bound {} \; 2>/dev/null

在我的系统上它运行良好,可以发现rcu_sched任务:

top - 20:44:48 up 57 min,  1 user,  load average: 0.84, 0.76, 0.59
Tasks: 266 total,   2 running, 264 sleeping,   0 stopped,   0 zombie
%Cpu0  : 10.0 us, 11.3 sy,  0.0 ni, 78.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 10.3 us,  8.3 sy,  0.0 ni, 81.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  : 15.3 us, 15.9 sy,  0.0 ni, 68.4 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 16.4 us, 14.7 sy,  0.0 ni, 68.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16314192 total,  9431208 free,  3312716 used,  3570268 buff/cache
KiB Swap: 15624188 total, 15624188 free,        0 used. 12630464 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
13087 gluckf    20   0    4224    784    708 R   3.3  0.0   0:00.10 io_bound    
    7 root      20   0       0      0      0 S   0.3  0.0   0:03.54 rcu_sched   
 1586 root      20   0  455832  74824  62736 S   0.3  0.5   0:41.49 Xorg        
 2160 gluckf    20   0 1389916 137096  52548 S   0.3  0.8   0:41.27 cinnamon    
 2285 gluckf    20   0  498388  46752  28632 S   0.3  0.3   0:14.15 gnome-term+