驱动调试中断系统僵死问题

今天看了驱动调试中断系统僵死问题


生出了很多疑问!


内核的进程不一致在切换吗?为啥会卡在 while(1) 不出来


如何内核是进行切换的!  那么为啥会不能使用  cTrl  c  结束进程?


还要内核是怎么切换的!感觉在 while(1)中 不出来,这种情况,说明内核是单线程

请先 登录 后评论

3 个回答

星星之火 - 嵌入式工程师
擅长:答疑助手

你怎么就得出是单线程了,linux显然不是。


你看到while 只是任务少,而这个进程又是while(1)  大部分时间占用了资源而已。

你ps看一下

请先 登录 后评论
阿宁笑嘻嘻

我的理解:  如果线程切换的化,我ctrl  c  相关内核线程会接受到信号,然后杀死前台进程,这个为啥就不可以呢

请先 登录 后评论
mshzhylu - 程序员

        内核里面有不同的调度策略,一般用的是时间片轮转。Linux里面的程序一般是主动放弃处理器使用权的,虽然,内核很多进程也是While(1),但是,在循环体中,调用的函数都是阻塞等待的函数,比如read,write,如果没有准备好的数据,就阻塞了。阻塞的结果就是让出处理器的使用权给其他进程跑,有的还故意用sleep来阻塞。但是,你的程序只用了死循环,但是里面都是轮询吧,没有阻塞 来让出处理器,所以,其他的进程都是毫秒级运行,你的程序一直在跑。 不出意外,你用top指令一定能看到你的处理器利用率超过99%。

        关于你说的杀死进程,其实是使用KILL信号,进程捕获到KILL信号后自动上交资源,相当于皇帝“赐死”。有些信号可以被捕获作为回调,有些信号可以被进程忽略,有些信号则是让进程自我结束。CTRL+C本身也是发信号。但是,Ctrl+C是默认设定(如果对代码不做重映射修改的话)杀灭终端进程的。终端就是你开的那个小黑窗口,在小黑窗口里面./xxx运行程序。程序是和那个小黑窗口绑定的,所以你用Ctrl+C是可以杀死的。但是很多程序,比如你写的驱动,是在后台运行的。所以你的Ctrl+C是不管用的。只能先用

ps -aux | grep xxx,打印出你的进程号,然后执行kill -9 xxx进程号,来杀死进程。

请先 登录 后评论
  • 3 关注
  • 0 收藏,347 浏览
  • 阿宁笑嘻嘻 提出于 2020-05-31 21:19

相似问题