首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定的页面是否由线程继承?

锁定的页面是否由线程继承?
EN

Stack Overflow用户
提问于 2019-05-24 08:37:22
回答 1查看 128关注 0票数 2

在我的实时系统上,我遇到了一些分页问题,我想知道linux在我的特定情况下应该如何运行。

除其他外,我的应用程序使用pthread_create()生成2个线程,这些线程对一组共享缓冲区进行操作。第一个线程,我们称之为A,从设备中读取数据,对其执行一些计算,并将结果写入其中一个缓冲区。一旦缓冲区满了,线程B将读取所有结果并通过以太网发送到PC,而线程A则写入下一个缓冲区。

我注意到,每当线程A开始写入以前未使用的缓冲区时,我就会丢失一些中断并丢失数据(每个数据包的头中都有一个id,如果增加了不止一个,我就错过了中断)。因此,如果我使用n个缓冲区,在数据采集开始时就会有n个漏掉的中断(因此这个问题肯定是由分页引起的)。

为了解决这个问题,我在所有缓冲区上使用了mlock()和memset(),以确保它们实际上是被分页的。这解决了我的问题,但是我想知道在我的代码中哪里才是正确的地方。在我的主应用程序中,还是在一个/两个线程中?(目前,我在两个线程中都这样做)

根据libc文档(第3.4.2节“锁定内存详细信息”),内存锁不是由使用fork()创建的子进程继承的。那么线程呢?他们是以同样的方式行事,还是从我的主要进程继承那些锁?

关于我的系统的一些背景信息,尽管我认为在这个特定的情况下它并不重要:

  • 它是一个嵌入式系统,由一个带有双核Cortex-A9的SoC驱动,运行Linux4.1.22和PREEMPT_RT。
  • 中断频率为4 4kHz。
  • 线程优先级(如htop所示)对于中断是-99,对于线程A是-98 (对于所有其他中断都高于标准优先级-51 ),对于线程B是-2。

编辑:

我做了一些额外的测试,从不同的线程(以及在主线程中)调用我的页面锁定函数。

如果我将页面锁定在main()中,然后尝试将它们再次锁定在其中一个线程中,那么我希望看到main()有大量的页面错误,但是线程本身没有页面错误(因为页面应该已经被锁定)。然而,htop讲述了一个不同的故事:我看到了大量的页面错误(MINFLT列),用于锁定这些页面的每个线程。

对我来说,这意味着p线程实际上与使用fork()生成的子进程具有相同的限制。如果是这样的话,将它们锁在两个线程(但不是main)中将是正确的过程。

EN

回答 1

Stack Overflow用户

发布于 2019-05-24 14:21:51

线程共享相同的内存管理上下文。如果一个页面驻留在一个线程上,那么它就驻留在同一个进程中的所有线程中。

这意味着内存锁定是每个进程,而不是每个线程.

您可能在第一次写入时仍然会看到一些小错误,因为错误被用来标记页面脏。您也可以通过在锁定后写入每个页面来避免这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56288813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档