在我的实时系统上,我遇到了一些分页问题,我想知道linux在我的特定情况下应该如何运行。
除其他外,我的应用程序使用pthread_create()生成2个线程,这些线程对一组共享缓冲区进行操作。第一个线程,我们称之为A,从设备中读取数据,对其执行一些计算,并将结果写入其中一个缓冲区。一旦缓冲区满了,线程B将读取所有结果并通过以太网发送到PC,而线程A则写入下一个缓冲区。
我注意到,每当线程A开始写入以前未使用的缓冲区时,我就会丢失一些中断并丢失数据(每个数据包的头中都有一个id,如果增加了不止一个,我就错过了中断)。因此,如果我使用n个缓冲区,在数据采集开始时就会有n个漏掉的中断(因此这个问题肯定是由分页引起的)。
为了解决这个问题,我在所有缓冲区上使用了mlock()和memset(),以确保它们实际上是被分页的。这解决了我的问题,但是我想知道在我的代码中哪里才是正确的地方。在我的主应用程序中,还是在一个/两个线程中?(目前,我在两个线程中都这样做)
根据libc文档(第3.4.2节“锁定内存详细信息”),内存锁不是由使用fork()创建的子进程继承的。那么线程呢?他们是以同样的方式行事,还是从我的主要进程继承那些锁?
关于我的系统的一些背景信息,尽管我认为在这个特定的情况下它并不重要:
编辑:
我做了一些额外的测试,从不同的线程(以及在主线程中)调用我的页面锁定函数。
如果我将页面锁定在main()中,然后尝试将它们再次锁定在其中一个线程中,那么我希望看到main()有大量的页面错误,但是线程本身没有页面错误(因为页面应该已经被锁定)。然而,htop讲述了一个不同的故事:我看到了大量的页面错误(MINFLT列),用于锁定这些页面的每个线程。
对我来说,这意味着p线程实际上与使用fork()生成的子进程具有相同的限制。如果是这样的话,将它们锁在两个线程(但不是main)中将是正确的过程。
发布于 2019-05-24 14:21:51
线程共享相同的内存管理上下文。如果一个页面驻留在一个线程上,那么它就驻留在同一个进程中的所有线程中。
这意味着内存锁定是每个进程,而不是每个线程.
您可能在第一次写入时仍然会看到一些小错误,因为错误被用来标记页面脏。您也可以通过在锁定后写入每个页面来避免这种情况。
https://stackoverflow.com/questions/56288813
复制相似问题