在这种情况下我应该在单独的线程中读取文件吗?

时间:2009-11-19 19:11:49

标签: linux multithreading optimization dma

我正在为嵌入式Linux编写一个应用程序,其中5%的处理器时间用于读取文件,95%用于处理它。如果我在一个线程中读取文件并继续在另一个线程中处理,我可以获得一些性能提升吗?

我正在阅读有支持DMA的mmc卡。 Filesize是20mb,它分为2 kb的块。我将从读者线程中排队并在处理器线程中处理它。因此,仅在从队列插入和删除时需要线程同步。

我正在为ARM9编程。

什么应该是快速单线程/多线程。

7 个答案:

答案 0 :(得分:2)

我建议不要使用其他线程。而是使用posix_fadvise()告诉Linux提前读取更多文件。当程序正在处理数据时,内核可以通过DMA读取文件。

这假设内核有足够的可用内存用于数据缓冲。如果您的数据处理使用了所有内存,那么内核将忽略posix_fadvise()。

您需要的确切电话看起来像这样:

while( 1 ) {
  ret = read(fd, buffer, 2*1024);
  if( ret < 0 ) abort();
  if( ret == 0 ) break;
  if( ret != 2*1024 ) abort();
  pos += ret;
  ret = posix_fadvise(fd, pos, 8*1024, POSIX_FADV_WILLNEED);
  if( ret ) abort();
  process(buffer);
}

答案 1 :(得分:1)

唯一可以确定的方法是尝试一下。但听起来好像您需要处理器来读取处理器所需的文件块。由于您受处理器限制,因此您可以预期的最大改进是读取时间的5%。

两个线程需要一个内存缓冲区来保存下一个文件块,以便它可以立即进行处理,而且许多嵌入式系统的可用内存非常有限。

答案 2 :(得分:1)

现在,当您进行读取调用时,程序会在读取数据时阻塞。然后它在完成后再次启动,我假设你的处理代码接管了。被阻止的时间不会通过“时间”显示为“cpu time”,因为在此期间进程处于睡眠状态。 (这取决于DMA是否可用)。

你可能会在整个程序中显示一个挂钟增加的时间来读取该文件,但你的cpu时间不会下降(并且由于同步可能会上升)。

答案 3 :(得分:1)

您需要确定一些事项。

  1. 这两项活动可以并行完成吗? 如果硬件/体系结构将导致处理线程 阻止另一个线程然后就没有收获。

  2. 您可以预期的最大收益是5%(根据Amdhal定律)。 编码的复杂性值得吗?

  3. 我建议您查看更有效的文件处理方法。仔细查看处理线程正在做什么并查看。

答案 4 :(得分:1)

在读取过程中,您可能会因为能够处理数据而获得一些改进,但也必然会有一些开销。与任何优化问题一样,测量是关键。

真正的问题是,为了衡量差异,是否值得实施。对于5%的最大增益,我怀疑答案是否定的,但是由你的时间决定5%的部分潜力与你的时间相比多少。

您的平台是否支持内存映射文件?这样你就可以把读数留给O / S了,它可能做得很好。

答案 5 :(得分:1)

如果按顺序读取数据,则额外的线程可能不值得,因为内核将提前读取文件并将内容缓存在内存中。内存映射文件,除非您正在为嵌入式系统(MMC是内存映射的系统)编写,但变化很小(文件必须在某个时间内加载到内存中,并且这些加载只会被尝试读取而不是显式调用所触发)。

答案 6 :(得分:1)

我写了一篇关于

的文章

Multithreaded File Access

在ddj.com上。它可能会回答你问题的一部分。