Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux线程睡眠与读取_Linux_Multithreading_Select_Scheduler_Usleep - Fatal编程技术网

Linux线程睡眠与读取

Linux线程睡眠与读取,linux,multithreading,select,scheduler,usleep,Linux,Multithreading,Select,Scheduler,Usleep,在我的应用程序中,有一个Linux线程需要每10毫秒激活一次, 因此我使用usleep(10*1000)。结果:线程在10毫秒后从不唤醒,但总是在20毫秒后唤醒。好的,它与调度程序时间片、配置等有关。 我试图使用usleep(1*1000)(即1ms),但结果是一样的。线程总是在20毫秒后唤醒 但在同一个应用程序中,另一个线程处理每10毫秒出现的网络事件(UDP数据包)。存在阻塞“recvfrom”(或“select”),当有传入数据包时,它会每10毫秒唤醒一次。 为什么会这样?当没有数据包时,

在我的应用程序中,有一个Linux线程需要每10毫秒激活一次, 因此我使用usleep(10*1000)。结果:线程在10毫秒后从不唤醒,但总是在20毫秒后唤醒。好的,它与调度程序时间片、配置等有关。 我试图使用usleep(1*1000)(即1ms),但结果是一样的。线程总是在20毫秒后唤醒

但在同一个应用程序中,另一个线程处理每10毫秒出现的网络事件(UDP数据包)。存在阻塞“recvfrom”(或“select”),当有传入数据包时,它会每10毫秒唤醒一次。 为什么会这样?当没有数据包时,select是否必须将线程置于“睡眠”状态?为什么它的行为会不同?在没有外部网络事件的情况下,如何使我的线程每隔10毫秒(或多或少)处于活动状态

谢谢,
拉菲

你似乎有一个共同的印象,即这些现代先发制人的多任务处理者都是关于时间片和量子的

事实并非如此

它们都是关于软件和硬件中断的,定时器硬件中断只是可以设置线程就绪并更改运行线程集的众多中断之一。导致网络驱动程序运行的NIC硬件中断就是另一个例子

如果线程被阻塞,正在等待UDP数据报,并且数据报由于运行驱动程序的NIC中断而变得可用,则被阻塞的线程将在NIC驱动程序运行后立即准备就绪,因为驱动程序将向线程发送信号,并在退出时请求立即重新调度。如果您的框没有被更高优先级的线程重载,它将被设置为“立即”运行,以处理现在可用的数据报。此机制提供高性能I/O,与任何计时器无关

计时器中断定期运行,以支持sleep()和其他系统调用超时。它以相当低的频率/高的间隔运行(比如1/10ms),因为这是另一个应该最小化的开销。以更高的频率运行这样的中断会降低计时器粒度,但会增加中断状态和重新调度开销,这在大多数桌面安装中是不合理的

概述:计时器操作的粒度为10ms,但数据报I/O响应速度很快


另外,为什么线程需要每10毫秒激活一次?你投票的目的是什么?

我也会试试其他计时器,谷歌搜索“posix计时器”。提示:
timerfd\u create()
。您使用的是哪个Linux版本?在Linux上,我可以获得1ms精度的计时器。它在MIP32 4Kec CPU上是MV。也许你的MIP32板有50Hz的时钟中断频率?我想轮询USB耳机的10ms音频帧。我正在用ALSA API做这件事。ALSA(在我的硬件上)无法为我提供精确的10毫秒帧,但能够提供20毫秒帧。这些帧需要传递给能够只接受10毫秒帧(小缓冲区)的DSP。因此,我想在一个线程中存储20毫秒的帧,并从另一个线程向DSP提供10毫秒的帧。