4

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

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

  2. 页面级别的这种原子性是否仅适用于跨进程,或者也适用于同一进程的线程之间?

4

1 回答 1

1
  1. 不。如果两个进程正在使用共享内存,则进程之间没有隐式锁定。您将必须自己安排这样一个锁(如果锁的所有者被换出,那么您的其他进程将不得不等到所有者被换入并在完成持有该锁时所做的任何事情后释放锁锁)。

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

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

于 2013-01-18T00:01:20.390 回答