原子在linux中写道

时间:2013-01-17 19:58:40

标签: c linux

在linux上,当写入管道时,如果数据等于或小于内存页面大小(4k至少64位rhel),操作系统可以保证整个写入成功或失败,但是当多个进程同时写入时,不会损坏数据。这也适用于写入常规文件。

  1. 我的问题是,这个原子性是linux虚拟内存的一个特性吗?如果是,请考虑两个进程之间的共享内存情况,其中一个进程在调度程序的写入过程中被换出。虚拟内存子系统是否确保进程正在写入的内存页面也被锁定,以便第二个进程无法写入同一页面?

  2. 此页面级别的原子性是否仅适用于整个流程,还是同一流程的线程之间?

1 个答案:

答案 0 :(得分:1)

  1. 没有。如果两个进程正在使用共享内存,则进程之间没有隐式锁定。你必须自己安排这样一个锁(如果锁的所有者被换掉了,那么你的另一个进程必须等待,直到所有者被交换并在完成任何操作后释放锁,同时持有锁)。

  2. 我不相信页面与其他内存整体不同的隐式(或显式)规则。特定规则适用于写入管道和文件,如果所有数据都适合一个页面,它可以被操作系统写成一个块 - 我想你会发现操作系统对资源有一个锁定它是一次写一页。如果数据大于页面,则当锁定被释放时,另一个进程[或线程]可能已准备好运行,从而从第一个进程“窃取”锁定。不到一页,它在一次锁定运行中完成整个写入。

  3. 但是要清楚,一般来说,内存页面的写入(或读取)没有隐式锁定。它严格适用于某些功能。通常,特定函数还将具有某种锁定,以防止其他进程在同一函数中运行[至少对于给定资源 - 例如一个文件描述符或类似文件 - 很可能一些其他进程可以同时从另一个文件读取到您的进程读取或写入您的文件,但是您的文件对于锁定所持有的某个块大小是原子的,但不是你的“立即编写整个莎士比亚作品”系统调用,因为这可能会阻止其他一些重要的过程。