我可以使用 openmp 或 pthreads 调用不同线程的相同系统调用吗

Can I invoke same system calls with different threads using openmp or pthreads

我正在开发 nvme-cli 的测试工具(用 c 编写,可以 运行 在 linux 上)。

我有兴趣用 't' 个线程重复 'r' 次 nvme 命令。

下面的代码重复了每个命令和线程,但这里的问题是并行执行时间与串行执行相比非常长。

我找到的原因是

err = nvme_identify(fd, 0, 1, data);

依次调用系统调用ioctl();

#pragma omp parallel for num_threads(5)
 for(i=0; i<rc; i++){
          err = nvme_identify(fd, 0, 1, data);
             if (!err) {
                    if (rf->fmt == BINARY)
                            d_raw((unsigned char *)&rf->ctrl, sizeof(rf->ctrl));
                    else if (rf->fmt == JSON)
                            json_nvme_id_ctrl(data, flags, 0);
                    else {
                            printf("NVME Identify Controller:\n");
                            __show_nvme_id_ctrl(data, flags, 0);
                            }
                    }
            else if (err > 0)
                    fprintf(stderr, "NVMe Status:%s(%x)\n",
                            nvme_status_to_string(err), err);
            else
                    perror("identify controller");

那么我可以知道如何使用 openmp 或 pthreads 获得真正的并行性吗?

您当然可以从不同的线程调用 system calls (listed in syscalls(2))(否则将无法编写在多个线程上执行 IO 的程序,就像大多数多线程 Web 服务器所做的那样)。

但是,某些 ioctl(或其他奇怪的系统调用)可能会阻塞或需要很长时间(几秒或十分之一秒)才能执行。举一个很好的例子,弹出 CDROM 托盘是由一些 ioctl 完成的,它需要一些可见的时间(可能是半秒)来执行(因为它是一些机械动作)。

我猜NVME和SSD技术有关,有些操作比较慢(因为硬件本身就慢)。您的瓶颈可能是硬件本身,那么任何一种并行化都无济于事。可能会发生 - 我真的不知道 - 你可能会在多个线程中使用相同的 ioctl (在同一个文件描述符上)但是 kernel 会序列化它的处理.

当内核正在执行一些阻塞或 long-运行ning ioctl(或任何其他系统调用)时,它使用其调度程序来 运行 其他任务(进程或线程)并做一些被推迟的 locking. Then your process is in a D state (see proc(5) and /proc/self/stat or /proc/1234/stat for process of pid 1234) and don't even handle signals (see signal(7))。