- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一个能够长时间工作而不会屈服的内核线程,基本上是按需将一个 CPU 内核完全专用于它:
int my_kthread(void *arg)
{
while(!kthread_should_stop()) {
do_some_work();
if(sleeping_enabled) msleep(1000);
else {
// What to do here to avoid lockup warnings
// and ensure system stability?
}
}
return 0;
}
当我正在处理的模块被加载时,线程是这样创建的:
my_task = kthread_run(&my_kthread, (void *)some_data, "My KThread")
set_cpus_allowed(my_task, *cpumask_of(10)); // Pin thread to core #10
并在卸载模块时像这样停止:
kthread_stop(my_task);
当 sleeping_enabled
为 true
时一切正常。
否则,线程启动后不久,内核就会提示明显的锁定。起初,我只是为了避免各种警告,例如
BUG: soft lockup - CPU#10 stuck for 22s!
和
INFO: rcu_sched detected stalls on CPUs/tasks: { 10} (detected by 15, t=30567 jiffies)
因为他们倾向于用所有 >20 个内核的转储淹没我的控制台,并且“锁定”是所需的行为。
我试过像这样戳看门狗:
if(sleeping_enabled) msleep(1000);
else touch_softlockup_watchdog();
结合 (echo 1 >/sys/module/rcupdate/parameters/rcu_cpu_stall_suppress)
并且几乎得到了我想要的东西(一个永不休眠的线程成功地完成了我想要的并且控制台中没有垃圾邮件)。
但是,这个“解决方案”不仅让人感觉像是在作弊,而且似乎我完全破坏了某个内核:当通过 rmmod
卸载模块时,整个系统会卡住。控制台开始定期在所有内核上转储软锁定,并带有以下调用跟踪:
[<ffffffff810c96b0>] ? queue_stop_cpus_work+0xd0/0xd0
[<ffffffff810c9903>] cpu_stopper_thread+0xe3/0x1b0
[<ffffffff8108639a>] ? finish_task_switch+0x4a/0xf0
[<ffffffff8169e654>] ? __schedule+0x3c4/0x700
[<ffffffff81080e98>] ? __wake_up_common+0x58/0x90
[<ffffffff810c9820>] ? __stop_cpus+0x80/0x80
[<ffffffff81077e93>] kthread+0x93/0xa0
[<ffffffff816a9724>] kernel_thread_helper+0x4/0x10
[<ffffffff81077e00>] ? flush_kthread_worker+0xb0/0xb0
[<ffffffff816a9720>] ? gs_change+0x13/0x13
与此同时,我的内核线程继续运行(正如它不时打印出的一些控制台消息所证明的那样),因此它从未看到 kthread_should_stop()
返回 true
.
卸载确实工作正常并在我切换到完全不休眠之前停止了线程。现在,我无法在不重新启动的情况下进行迭代修改。
请注意,我在这里简化了很多描述。我正在尝试将这样一个线程(轮询一些硬件寄存器并记录它们的更改)添加到 GPU 驱动程序,因此可能有依赖于模块的原因导致卸载卡住。但是,这不会改变我关于如何最好地实现永不休眠线程的一般问题。
最佳答案
我觉得这个问题和你的问题很相似"whole one core dedicated to single process" ,请查看那里的回复。
关于linux-kernel - 如何实现永不休眠的内核线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24786592/
这个问题在这里已经有了答案: What is the JavaScript version of sleep()? (91 个回答) 关闭 9 年前。 是的,我知道 - 这个问题有成千上万的答案。请
有没有办法使用 native NHibernate linq 提供程序执行以下查询? var result = (from e1 in Session.Query() join e2
上下文:我正在尝试将Grails项目从1.0.3升级到1.3.7,并且遇到了很多问题。我刚得到很多DuplicateMappingExceptions,因为该项目同时具有Hibernate XML文件
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我正在寻找一种重新启动线程的方法,无论是从该线程的上下文内部还是从线程外部,可能是从另一个进程中。 (这些选项中的任何一个都可以。)我知道使整个进程休眠的困难,而且我很确定线程也会遇到同样的困难。但是
C 中是否有任何函数可以检查计算机是否进入 sleep 、休眠 或锁定 并从这些状态唤醒? 在msdn它们为 C#、C++ 提供,但不为 C 提供。我的操作系统是windows7 如下是我用来检查启动
我对 NHibenate 有疑问。当我运行 queryover 时,出现错误“无法解析属性:User.Name of:MegaOnlineChat.Core.Entities.Message”。我做错
我知道这里被问过很多次,也回答过很多次,这不是应该如何完成的方式,但再一次:) 是否有可能以某种方式调用异步函数(例如计时器/ajax 调用),基本上是常见的异步任务并同步等待直到它结束而不会出现 1
我在persistence.xml中有以下内容 com.merc.model.log.EventLogging org.hibernate.ejb.HibernatePersiste
目前我的存储库有 2 个构造函数。当我从我的 mvc 网站调用这些时,我总是调用第一个构造函数,从而打开一个新 session 。我应该在 session 中通过吗?我该怎么做。 public
hibernate session to list conversion Compilation Error occured when java converted into scala..!!
下面的remove()方法导致“超出了GC开销限制”。从A或B或C中删除ABC中存在的关联时。请您告知错误在哪里吗? 注-ABC是A,B,C的映射表 stacktrace如下: Caused by:
昨天我在 webhosting.net 的 Jelastic v2.2.2 上获得了一个试用帐户,并配置了一个最少 0 个 cloudlets 的环境(最多 8 个,即全部动态,无保留)。然后我部署了
设置:Grails 2.5.6和Hibernate 4.3.10 我有一个带有字符串ID的表。事实是,它的值是数字字符串,当我传入诸如get()这样的值时,这似乎使"000000"变得混乱。 域类:
hibernate session to list conversion Compilation Error occured when java converted into scala..!!
我有一个用于 PDA 的应用程序,它有一个长时间运行的进程,我遇到了一个问题,即 PDA 将在该进程完成之前进入休眠状态。 我无法控制 PDA 上的电源设置,有谁知道我的应用程序阻止 PDA 进入休眠
我正在创建一个将安装在 LaunchAgents 文件夹中的守护程序。关于使其 sleep 的一些问题: 因为它是一个 LaunchAgent 项,所以可执行文件会在用户/系统 sleep 时自动 s
我想使用 AsyncTask 创建启动画面。具体来说,在 doInBackground() 方法中,我使用静态方法 Thread.sleep() 并在它创建一个将应用程序重定向到其他 Activity
在我的网站上,我有一个 JavaScript 函数,它执行 AJAX 调用来获取帐户信息,然后打开一个模式,您可以在其中查看和编辑信息。 AJAX 调用用于更改您选择的数据库中的详细信息,然后刷新原始
除非线程告诉我醒来,否则我想睡 X 时间。在下面的示例中,我想休眠 10 毫秒(1/100 秒)或直到 foo 有 2000 个项目。以先到者为准。我该怎么做呢?我编了函数 主线程: pthread_
我是一名优秀的程序员,十分优秀!