Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C io_submit writes()是否保证按顺序执行?_C_Linux - Fatal编程技术网

C io_submit writes()是否保证按顺序执行?

C io_submit writes()是否保证按顺序执行?,c,linux,C,Linux,Linux中的io_submit()系统调用是否保证多个连续io_submit()通过同一进程提交的每个操作的执行顺序 考虑以下示例: 我在文件描述符上提交了一些write()操作,如: io_prep_pwrite(iocb_ptrs[0],fd,&buf1,buf1_len,buf1_offset); io_prep_pwrite(iocb_ptrs[1],fd,&buf2,buf2_len,buf2_offset); io_submit(ctx,2,&iocb_pt

Linux中的io_submit()系统调用是否保证多个连续io_submit()通过同一进程提交的每个操作的执行顺序

考虑以下示例: 我在文件描述符上提交了一些write()操作,如:

io_prep_pwrite(iocb_ptrs[0],fd,&buf1,buf1_len,buf1_offset);
io_prep_pwrite(iocb_ptrs[1],fd,&buf2,buf2_len,buf2_offset);
io_submit(ctx,2,&iocb_ptrs[0]);
提交第一个io_submit后,流程立即再次提交数据:

io_prep_pwrite(iocb_ptrs[2],fd,&buf3,buf3_len,buf3_offset);
io_prep_pwrite(iocb_ptrs[3],fd,&buf4,buf4_len,buf4_offset);
io_submit(ctx,2,&iocb_ptrs[2]);
如果buf3_偏移恰好与buf1_偏移值相同,是否存在buf1中的数据覆盖buf3中数据的可能性? 考虑到我们有一个多核系统,AIO提交的过程运行在CORE1上。(注意:我们只有一个用户进程)第一次io_submit()发生,core1开始将数据写入磁盘。但随后网络中断发生,core1必须停止第一个io_submit()以参与中断。现在,core2处于空闲状态,它接受第二个io_submit()调用并将数据发送到磁盘。当core1从中断返回时,它将继续处理第一个io_submit(),我要求进程先写入的数据实际上将最后写入



这会发生吗?

我不知道linux异步io的概述发生了什么,但它明确指出“操作是以任意顺序执行的,一个文件描述符可以启动多个操作。”因此,您的紧张似乎是有道理的。

我不知道linux异步io的概述发生了什么,但它清楚地指出,“操作是以任意顺序执行的,可以启动一个文件描述符的多个操作。”因此,您的紧张似乎是有道理的。

我不知道linux异步io的概述发生了什么,但它清楚地指出,“操作是以任意顺序执行的,可以启动一个文件描述符的多个操作。”因此,您的紧张似乎是有道理的。

我不知道linux异步io的概述发生了什么,但它清楚地指出,“操作是以任意顺序执行的,可以启动一个文件描述符的多个操作。”因此,您的紧张似乎是有道理的。

libaio为这个调用提供了一个入口点,而不是使用syscall来实现它。正如rici所指出的,这些操作不能保证以任何顺序执行。@rici我想你在想(POSIX AIO不同于Linux AIO)。尽管如此,您关于不能依赖异步完成顺序的警告仍然非常正确。在内核中,I/O可以重新排序/合并/拆分。在内核下面,异步提交的I/O是否按照提交的顺序完成取决于设备(例如,SCSI允许设备通过它是否支持简单任务或顺序任务进行选择,其中简单意味着命令可以以任何顺序完成)。@anon:问题和我的答案是关于libaio.h中提供的接口,它不是Posix接口。我通过更改Ubuntu的版本名(这避免了Ubuntu的主页服务器将请求转换为一个只与不同编程环境相关的模糊接口)修复了四年前答案中已损坏的链接。@rici-Hmm我明白你的意思,我得到了更正。原来的主页仍然放在“下游”中libaio项目的镜像(例如),但我猜是“io”manpage已经被Ubuntu中另一个项目的io manpage所遮蔽。鉴于这些页面有非常相似的文本,我想知道其中一个页面是否是用另一个项目的复制文本编写的?libaio为这个调用提供了一个入口点,而不是使用syscall来实现它。而rici指出,这些操作不保证在任何情况下都能执行顺序。@rici我想你在考虑(POSIX AIO不同于Linux AIO)。尽管如此,你关于不能依赖异步完成顺序的警告仍然非常正确。在内核中,I/O可以重新排序/合并/拆分。在内核下面,异步提交的I/O是否按提交顺序完成取决于设备(例如,SCSI允许设备通过via选择是支持简单任务,还是支持顺序任务,简单意味着命令可以按任何顺序完成)。@anon:问题和我的答案是关于libaio.h中提供的接口,它不是Posix接口。我通过更改Ubuntu版本名修复了四年前答案中的衰减链接(这避免了Ubuntu的手册页服务器将请求转换为一个只与不同编程环境相关的模糊接口。@rici-Hmm我明白你的意思,我得到了更正。原始手册页仍然在libaio项目的“下游”镜像中进行(如),但我猜是“io”manpage已经被Ubuntu中另一个项目的io manpage所遮蔽。鉴于这些页面有非常相似的文本,我想知道其中一个页面是否是用另一个项目的复制文本编写的?libaio为这个调用提供了一个入口点,而不是使用syscall来实现它。而rici指出,这些操作不保证在任何情况下都能执行顺序。@rici我想你在考虑(POSIX AIO不同于Linux AIO)。尽管如此,你关于不能依赖异步完成顺序的警告仍然非常正确。在内核中,I/O可以重新排序/合并/拆分。在内核下面,异步提交的I/O是否按提交顺序完成取决于设备(例如,SCSI允许设备通过via选择是支持简单任务,还是支持顺序任务,简单意味着命令可以按任何顺序完成)。@anon:问题和我的答案是关于libaio.h中提供的接口,它不是Posix接口。我通过更改Ubuntu版本名修复了四年前答案中的衰减链接(这避免了Ubuntu的manpage服务器将请求转换成一个只与不同编程环境有模糊关联的接口。@rici-Hmm我明白你的意思,我支持你。)