如何产生延迟

时间:2011-11-21 17:35:59

标签: multithreading operating-system kernel delay

我是内核编程的新手,我正在尝试理解一些操作系统的基础知识。我试图使用我在20Mhz微控制器中成功实现的技术来产生延迟。 我知道这是一个完全不同的环境,因为我在我的2 GHz Core 2 duo处理器中使用了linux centOS。 我已经尝试了以下代码,但我没有得到延迟。

#include<linux/kernel.h>
#include<linux/module.h>

int init_module (void)
{
        unsigned long int i, j, k, l;

        for (l = 0; l < 100; l ++)
        {
                for (i = 0; i < 10000; i ++)
                {
                        for ( j = 0; j < 10000; j ++)
                        {
                                for ( k = 0; k < 10000; k ++);
                        }
                }
        }

        printk ("\nhello\n");

        return 0;
}

void cleanup_module (void)
{
        printk ("bye");
}

当我在尽可能快地插入模块后进行dmesg时,字符串“hello”已经存在。如果我的计算是正确的,上面的代码应该给我至少10秒的延迟。 为什么不起作用?有什么与线程有关吗? 20 Ghz处理器如何在没有任何明显延迟的情况下立即执行上述代码?

2 个答案:

答案 0 :(得分:2)

编译器正在优化你的循环,因为它没有副作用。

要实际获得10秒(非忙)延迟,您可以执行以下操作:

#include <linux/sched.h>
//...

unsigned long to = jiffies + (10 * HZ); /* current time + 10 seconds */

while (time_before(jiffies, to))
{
    schedule();
}

或更好:

#include <linux/delay.h>
//...

msleep(10 * 1000);

如果发生短暂延误,您可以使用mdelayndelayudelay

我建议你阅读Linux Device Drivers 3rd edition chapter 7.3,其中涉及更多信息的延迟

答案 1 :(得分:1)

要直接回答这个问题,很可能你的编译器发现这些循环没有做任何事情并且“优化”它们。

至于这种技术,你想要做的就是使用所有处理器来创建延迟。虽然这可能有效,但应设计操作系统以最大化处理器时间。这只会浪费它。

我知道这是实验性的,但只是抬头。