- 论坛徽章:
- 0
|
我也是初学者, 我谈下我的看法:
1.只要敢用schedule把CPU交出去,就再也回不来了,调用wake_up_process也不行,是不是必须得用队列才能重启线程。
--> 用 kthread_create 创建的内核线程, 运行在内核态. 你调用 CPU 将 CPU 的使用权交出去, 但是, 线程还是在 TASK_RUNNING 状态. wake_up 是将 task_interrupt 和 task_uninterrupt 状态的进程唤醒. 我记得之前看过内核的代码, 有一些譬如 kblockd 这样的内核线程, 在让出 CPU 前, 都是先将自己的状态置为 TASK_UNINTERRUPT, 然后加入等待队列中. 然后 调用 schedule 这一类的函数.
2.tsleep则是无法将CPU交出去,还是在自己线程里不断打印,执行完for循环后才执行其他线程(这东西和用户态的sleep区别最大)。
--> 内核线程运行在内核态, 直接在 CPU 上运行. 你调用 tsleep, 也没有调度程序来帮你调度其他进程来执行. 用户程序, 调用 sleep 时, 内核会调用 schedule 这一类函数来进行 上下文切换.
3.schedule_timeout回来是可以回来,可是也完全是线性的,thread1交出去就执行thread2,然后再执行回thread1,这样相互切换。不像用户态的执行,大家在都没有占有CPU时,谁先抢到完全是随机的。
--> 内核态, 进程的切换, 都是需要自己调用 schedule 类函数来进行的. 内核不会帮你管理.
请问对这方面比较了解的大侠:
1.是不是内核线程本来就是这个样子的?还是我调用的函数有误,或者是等的时间不够线程从新获取到CPU....这样就不能模拟经典的多线程买票的案例了。
--> 多线程当然可以实现的. 但是得你自己去调用 调度程序实现内核线程之前的调度. 什么时候被唤醒, 什么时候让出 CPU.
2.多线程同步,是不是只为防止中断的发生,因为感觉也不用担心其他线程抢到CPU?
--> 你考虑的是 单CPU吧, 如果多CPU 架构呢, 多个线程在不同的CPU上执行. |
|