【问题标题】:Kernel threads vs Timers内核线程与定时器
【发布时间】:2011-05-21 01:50:10
【问题描述】:

我正在编写一个使用定制的屏幕打印系统的内核模块。基本上每次涉及print 时,都会将字符串插入到链表中。 每隔 X 秒,我需要处理列表并对字符串执行一些操作,然后再打印它们。

基本上我有两种选择来实现这样的过滤器:

1) 定时器(最后会自行重启)

2) 休眠 X 秒的内核线程

当过滤器执行它的工作时,没有其他东西可以使用链表,当然,在插入字符串时,过滤器函数应该等待。

AFAIK 计时器在中断上下文中运行,因此它不能休眠,但是内核线程呢?他们能睡吗?如果是,是否有理由不在我的项目中使用它们?还可以使用什么其他解决方案?

总结一下:我的过滤功能只有3个要求:

1) 必须能够printk

2) 当使用列表时,所有其他试图访问列表的东西都必须阻塞,直到过滤函数完成执行

3) 必须每 X 秒运行一次(不是实时要求)

【问题讨论】:

    标签: linux-kernel kernel


    【解决方案1】:

    每次涉及print 时,都会将字符串插入到链表中

    我真的不知道你的意思是print 还是printk。但是如果你在谈论printk(),你需要分配内存并且你有麻烦,因为printk() 可能在原子上下文中被调用。这使您可以选择使用循环缓冲区(因此,您应该容忍删除一些字符串,因为您可能没有足够的内存来保存所有字符串)。

    每隔 X 秒,我需要处理列表并对字符串执行一些操作,然后再打印它们。

    在那种情况下,我什至不会做内核线程:如果成本不高,我会在print() 中进行处理。

    否则,我会创建一个新的系统调用:

    • sys_get_strings() 或其他东西,会将整个链接列表转储到用户空间(并在复制时从列表中删除条目)。

    这样整个行为由用户空间控制。您可以创建一个每隔 X 秒调用一次系统调用的守护进程。您还可以在用户空间中进行所有昂贵的处理。

    你也可以创建一个新设备说/dev/print-on-screen

    • dev_open 将分配内存,print() 将不再是空操作,而是在设备预分配的内存中提供数据(以防print() 将用于原子上下文等)。李>
    • dev_release 会把所有东西都扔掉
    • dev_read 会给你字符串
    • dev_write 可以在您的屏幕打印系统上做一些事情

    【讨论】:

      【解决方案2】:

      允许kthreads 休眠。 (但是,并非所有 kthread 都为所有客户端提供休眠执行。例如,softirqd 不会。) 但是话又说回来,您也可以使用自旋锁(及其相关成本)并且不使用额外的线程(这基本上是计时器所做的,使用 spinlock_bh)。这真的是一种权衡。

      【讨论】:

        猜你喜欢
        • 2019-11-21
        • 2015-04-14
        • 2013-07-15
        • 1970-01-01
        • 2011-02-02
        • 2022-08-15
        • 2014-02-17
        • 1970-01-01
        • 2015-01-22
        相关资源
        最近更新 更多