我正在为嵌入式Linux编写一个应用程序,其中5%的处理器时间用于读取文件,95%用于处理它。如果我在一个线程中读取文件并继续在另一个线程中处理,我可以获得一些性能提升吗?
我正在阅读有支持DMA的mmc卡。 Filesize是20mb,它分为2 kb的块。我将从读者线程中排队并在处理器线程中处理它。因此,仅在从队列插入和删除时需要线程同步。
我正在为ARM9编程。
什么应该是快速单线程/多线程。
答案 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)
您需要确定一些事项。
这两项活动可以并行完成吗? 如果硬件/体系结构将导致处理线程 阻止另一个线程然后就没有收获。
您可以预期的最大收益是5%(根据Amdhal定律)。 编码的复杂性值得吗?
我建议您查看更有效的文件处理方法。仔细查看处理线程正在做什么并查看。
答案 4 :(得分:1)
在读取过程中,您可能会因为能够处理数据而获得一些改进,但也必然会有一些开销。与任何优化问题一样,测量是关键。
真正的问题是,为了衡量差异,是否值得实施。对于5%的最大增益,我怀疑答案是否定的,但是由你的时间决定5%的部分潜力与你的时间相比多少。
您的平台是否支持内存映射文件?这样你就可以把读数留给O / S了,它可能做得很好。
答案 5 :(得分:1)
如果按顺序读取数据,则额外的线程可能不值得,因为内核将提前读取文件并将内容缓存在内存中。内存映射文件,除非您正在为嵌入式系统(MMC是内存映射的系统)编写,但变化很小(文件必须在某个时间内加载到内存中,并且这些加载只会被尝试读取而不是显式调用所触发)。
答案 6 :(得分:1)