当前位置: 首页 > 面试题库 >

如果两个不同的进程同时在同一文件上调用写系统调用,会发生什么情况

尤博达
2023-03-14
问题内容

操作系统是否正确处理?

还是我必须打电话给flock()?


问题答案:

虽然OS不会崩溃,并且文件系统不会被破坏,呼叫write()
保证的广告是原子的,除非有问题的文件描述符是一个管道,数据的写入量PIPE_MAX字节或更少。标准的相关部分:

尝试写入管道或FIFO具有几个主要特征:

* 原子/非原子:如果一个操作中写入的总量未与任何其他进程的数据交错,则写入是原子的。当有多个作者将数据发送到单个读者时,此功能很有用。应用程序需要知道可以自动执行多大的写请求。此最大值称为{PIPE_BUF}。IEEE
Std
1003.1-2001的这一卷并未说明对{PIPE_BUF}个字节以上的写请求是否是原子的,而是要求对{PIPE_BUF}个字节或以下字节的写请求是原子的。


[…]

因此,原则上,您必须与同时进行的写程序锁定,否则您的写数据可能变得混乱和混乱(即使在同一写操作中),或者您可能有多个写操作相互覆盖。但是,有一个例外-
如果您通过O_APPEND,则您的写入实际上将是原子的:

如果设置了文件状态标志的O_APPEND标志,则应在每次写操作之前将文件偏移量设置到文件的末尾,并且在更改文件偏移量和写操作之间不得进行任何中间文件修改操作。

尽管对于非O_APPEND写入或同时读取而言,这不一定是原子的,但如果所有写入器都使用O_APPEND,并且在执行之前以某种方式进行了同步read,则应该可以。



 类似资料:
  • 我开始在Spring Boot中使用Webflux进行反应式Java编程。 我遇到了一个场景,很难被动地执行某个数据库调用。 如果我在Mono中执行单个阻塞数据库调用,会发生什么? 代码看起来像这样。。。 现在是的,我知道有一个简单的方法可以被动地做到这一点。这不是我要问的问题(事实上,真正的代码要复杂得多)。 我真正想知道的是,同步数据库调用将对我的性能产生什么影响。整个方法是否仍然是异步非阻塞

  • 当两个线程同时调用相同的静态方法时会发生什么?例如: 第一个线程现在调用someMethod()。第二个线程从现在起0.5秒后调用someMethod()(第一个线程仍在处理数据)。 我知道someMethod()可以同步。但如果它不同步,会发生什么呢?

  • 据我所知,两个不相等的对象可以具有相同的哈希代码。当添加或从HashMap java中检索时,将如何处理这个问题?

  • 问题内容: 在具有并发访问的程序中使用映射时,是否需要在函数中使用互斥体来 读取 值? 问题答案: 读者众多,没有作家可以: https://groups.google.com/d/msg/golang- nuts/HpLWnGTp-n8/hyUYmnWJqiQJ 一个作家,没有读者是可以的。(否则,地图不会太好。) 否则,如果至少有一个作家,而作家或读者至少还有一个,那么 所有 读者 和 作家都

  • 问题内容: 在某个线程上调用an 时,该线程会发生什么? 问题答案: 目标线程是“中断的”。通常,在该线程中设置一个标志,该线程可以查看该标志(带有)。如果目标线程当前在某些I / O上被阻塞,则分别使用an 或an 唤醒它。 线程中断是微调线程的一种温和方法。它是用来给线程有机会退出 干净 ,而不是,这更像是一支突击步枪射击的线程。

  • 问题内容: 在Go中,使用或阻止并发访问共享对象。但是,在某些情况下,我只是对变量或对象字段的最新值感兴趣。或者我喜欢写一个值,不在乎另一个go例程以后会覆盖它还是之前已经覆盖它。 更新: TLDR;只是不要这样做。这不安全。阅读答案,评论和链接的文档! 这里有两个变量和一个示例程序,其中似乎都使用当前Go运行时产生的“正确”的输出: 预期的输出如下: 的任意组合和这个程序正确的输出。接收任何其他