免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5182 | 回复: 6
打印 上一主题 下一主题

[内核同步] 内核线程和用户线程的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-03 17:29 |只看该作者 |倒序浏览
大家别被标题党骗了,呵呵我是来问问题的,不是传授经验...

最近工作需要刚开始做驱动,读教程时,根据demo试验了多线程的驱动程序。有点问题。就是内核下多线程并不是平分CPU片的,kthread_create建立几个线程,都写个固定数量的for循环,然后发现调用线程的控制函数和用户态时不太一样。

1.只要敢用schedule把CPU交出去,就再也回不来了,调用wake_up_process也不行,是不是必须得用队列才能重启线程。

2.tsleep则是无法将CPU交出去,还是在自己线程里不断打印,执行完for循环后才执行其他线程(这东西和用户态的sleep区别最大)。

3.schedule_timeout回来是可以回来,可是也完全是线性的,thread1交出去就执行thread2,然后再执行回thread1,这样相互切换。不像用户态的执行,大家在都没有占有CPU时,谁先抢到完全是随机的。

请问对这方面比较了解的大侠:

1.是不是内核线程本来就是这个样子的?还是我调用的函数有误,或者是等的时间不够线程从新获取到CPU....这样就不能模拟经典的多线程买票的案例了。
2.多线程同步,是不是只为防止中断的发生,因为感觉也不用担心其他线程抢到CPU?

论坛徽章:
0
2 [报告]
发表于 2012-09-03 19:09 |只看该作者
我也是初学者, 我谈下我的看法:

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上执行.

论坛徽章:
0
3 [报告]
发表于 2012-09-03 19:15 |只看该作者
  1. struct task_struct *kthread_create(int (*threadfn)(void *data),
  2.                                    void *data,
  3.                                    const char namefmt[],
  4.                                    ...)
  5. {
  6.         struct kthread_create_info create;

  7.         create.threadfn = threadfn;
  8.         create.data = data;
  9.         init_completion(&create.done);

  10.         spin_lock(&kthread_create_lock);
  11.         list_add_tail(&create.list, &kthread_create_list);
  12.         spin_unlock(&kthread_create_lock);

  13.         wake_up_process(kthreadd_task);
  14.         wait_for_completion(&create.done);

  15.         if (!IS_ERR(create.result)) {
  16.                 struct sched_param param = { .sched_priority = 0 };
  17.                 va_list args;

  18.                 va_start(args, namefmt);
  19.                 vsnprintf(create.result->comm, sizeof(create.result->comm),
  20.                           namefmt, args);
  21.                 va_end(args);
  22.                 /*
  23.                  * root may have changed our (kthreadd's) priority or CPU mask.
  24.                  * The kernel thread should not inherit these properties.
  25.                  */
  26.                 sched_setscheduler_nocheck(create.result, SCHED_NORMAL, &param);
  27.                 set_cpus_allowed_ptr(create.result, cpu_all_mask);
  28.         }
  29.         return create.result;
  30. }
  31. EXPORT_SYMBOL(kthread_create);
复制代码
内核 kthread_create 函数如上. 先调用
init_completion(&create.done);
初始化完成量,
然后后面等待完成量.
wait_for_completion(&create.done);

其实, 也是基于等待队列的吧.

论坛徽章:
0
4 [报告]
发表于 2012-09-04 13:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-09-04 14:05 |只看该作者
hk2305621 发表于 2012-09-03 19:09
我也是初学者, 我谈下我的看法:

1.只要敢用schedule把CPU交出去,就再也回不来了,调用wake_up_process也 ...


谢谢hk2305621 ,明白了一些,这么看内核程序对线程调度要有很高的要求了。要是不小心一个while(1),整个系统就挂了,只能重启。

论坛徽章:
0
6 [报告]
发表于 2012-09-04 14:14 |只看该作者
没办法 @ 四楼.

我的看法:
Linux 内核完全相信自己,  就像驱动程序一样, 运行在内核态, 那么你敢在里面 while(1), 内核会看成是自己在运行, 完全相信自己, 就简单执行 while(1) 操作. 系统就忙死了.

http://bbs.chinaunix.net/thread-3768683-1-1.html 这个是我之前提出的一个问题. 其实和这个问题类似.

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:57:09
7 [报告]
发表于 2013-02-07 15:50 |只看该作者
回复 1# chxy85
tsleep 是什么? 和sleep有什么区别?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP