【问题标题】:how to generate a delay如何产生延迟
【发布时间】:2012-01-03 04:45:26
【问题描述】:

我是内核编程的新手,我正在尝试了解操作系统的一些基础知识。我正在尝试使用我在 20Mhz 微控制器中成功实现的技术来产生延迟。 我知道这是一个完全不同的环境,因为我在我的 2 GHz Core 2 双核处理器中使用 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 处理器如何能立即执行上述代码而没有任何明显的延迟?

【问题讨论】:

    标签: multithreading operating-system kernel delay


    【解决方案1】:

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

    要实际获得 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,它处理延迟以获取更多信息

    【讨论】:

    • 这个链接对我很有帮助。非常感谢
    【解决方案2】:

    要直接回答这个问题,您的编译器可能会看到这些循环没有做任何事情并“优化”它们。

    至于这种技术,看起来您正在尝试做的是使用所有处理器来产生延迟。虽然这可能有效,但操作系统应设计为最大化处理器时间。这只会浪费它。

    我知道这是实验性的,但只是提醒一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2016-10-10
      • 2021-07-29
      • 1970-01-01
      相关资源
      最近更新 更多