linux中什么是时间片

linux中什么是时间片,第1张

时间片,简单来说就是CPU分配给各个程序的时间,使各个程序从表面上看是同时进行的,而不会造成CPU资源浪费。

时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列 等。

假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费 在了管理开销上。

前段时间从windows移植了一个程序到linux上,不知为何性能奇差。查了下原因,发现是由于一个函数ZeroSleep特别耗时,这个函数的代码很简单,如下:

void ZeroSleep()

{

Sleep(0)

}

Sleep(0)作用是用来释放cpu的时间片,避免忙等待。于是想当然的在linux上实现为:

void ZeroSleep()

{

msleep(0)

}

但其实msleep API的源代码如下:

void msleep(unsigned int msecs)

{

unsigned long timeout = msecs_to_jiffies(msecs) + 1

while (timeout)

timeout = schedule_timeout_uninterruptible(timeout)

}

如此一来,即使参数为0,也至少要睡眠一个jiffies单位的时间,因此导致严重的性能问题。

该问题的解决方法是:

既然ZeroSleep的目的是释放cpu资源,那么就可以通过调用schedule()函数替换msleep 。而且实际上msleep本身也是通过调用schedule_timeout_uninterruptible实现的,所以这个做法也是合理的。

http://tassardge.blog.163.com/blog/static/17230170820100275580656/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7384452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存