用户线程和内核线程理解

来源:互联网 发布:淘宝1钻店卖 编辑:程序博客网 时间:2024/06/06 06:56

现在SOC多核在嵌入式领域已经随处可见,随着人工智能的兴起,算法实现和集成的业务逻辑也变得更加的复杂,作为一名嵌入式开发工作者,不管是BSP层还是应用层,对于底层进程和线程模型及调度有必要进行较为深入的了解,本文对用户级线程和内核级线程进行了一些总结。

1.用户级线程和内核级线程的区别

用户级线程仅存于用户空间中,其创建、撤销、线程之间的同步与通信功能,都无须利用系统调用来实现。总之,它的实现是和操作系统无关的,用户进程只需要通过线程库来完成线程控制;相反,内核线程的建立和销毁都是由操作系统负责、通过系统调用完成的。从描述的区别上就可以看出,用户级别的线程不用经过内核空间,效率肯定很高,而内核线程是驻留在内核空间的,用户进程在创建使用内核线程时访问内核空间是必不可少的工作,效率上相对较低。既然内核线程效率低,那为什么还要引入他呐?我们知道在线程中经常会用到系统调用,对于用户线程来说,如果系统调用是阻塞的,那么意味着这个线程所属的整个进程都会阻塞住,这就尴尬了,说好的并发性变成了只能共富贵不能共患难了O(∩_∩)O~。这种情况下还是需要请高人出山—内核线程就闪亮登场了,内核线程是在内核空间实现的机制,也就是说它在操作系统那排了号(有线程控制块TCB)。知道了两者的区别了,哪优缺点也就八九不离十了。

2.用户级线程和内核级线程优缺点

用户线程和内核线程看着一个锋芒毕露十分招摇,一个韬光养晦相当内敛,从性格上来说优缺点就一目了然了。

  • 用户线程优点:
    (1) 调度无需内核参与
    (2) 不支持线程的OS中也能实现
    (3) 线程创建、销毁、切换、管理的代价比内核线程少得多
    (4) 每个进程可定制自己的调度算法,线程管理灵活
    (5) 线程能够利用的表空间和堆栈空间比内核级线程多
  • 用户线程缺点:
    (1)资源调度按照进程进行,多个处理器时,同一个进程中的线程只能在同一个处理器下分时复用
    (2)同一进程中通常只能同时有一个线程在运行,否则如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起
  • 内核线程的优点:
    (1)当有多个处理器时,一个进程的多个线程可以同时执行
  • 内核线程缺点:
    (1)由内核进行调度,资源开销相对较大

从上面的分析可以看出来,上层的用户线程优点多缺点也多,而且比较致命,内敛的内核线程则是优点不多(但很重要),缺点也不多(可以宽容)。POSIX thread库在Linux应用程序开发中经常使用,它用的是用户线程还是内核线程呐?

3.Linux系统pthread库创建的是用户线程还是内核线程?

根据上面的概念表面上来看是用户线程,不少人被POSIX thread库给骗了。虽然POSIX thread是个库,但在Linux系统中POSIX thread库在pthread_create创建的时候会调用系统调用clone,接着操作系统帮忙创建内核级线程,所以,Linux系统中pthread创建的是内核线程而非用户线程。而且,pthread在设置线程属性的时候本身不支持设置进程资源竞争的,设置属性接口如下:

功能: 设置线程绑定属性。
头文件: <pthread.h>
函数原型: int pthread_attr_setscope (pthread_attr_t* attr, int scope)
函数传入值:attr: 线程属性。
scope:PTHREAD_SCOPE_SYSTEM(绑定)
PTHREAD_SCOPE_PROCESS(非绑定)
函数返回值得:同1。

Linux只对PTHREAD_SCOPE_SYSTEM属性生效,那么为什么Linux只可以设置作用域为系统级的资源强占而不支持进程级的呐?这就要从Linux不支持单纯的用户线程说起了。Linux操作系统刚开始设计的时候并没有考虑到这么复杂,它仅有多进程多任务的调度,没有线程的概念,后来人们发现每次搞出个进程地址空间都要单独分一下、进程表在内核中切来切去开销太大,业务逻辑太复杂的话会需要很多进程,系统负荷可想而知。这种情况下,线程的概念就被提出,为了让不支持线程的Linux也能用上这样的好东西,Redhat开始了NPTL(Native POSIX Thread Library)工程。NPTL避免了操作系统层面过大的改动,提供了包含一组线程控制操作的函数库。也就是我们现在经常使用的pthread库,这就是为什么说它“骗”我们误以为Linux下创建的是用户线程。为什么我们会被它骗到?因为创建出来的线程看着机制和用户线程表面上没啥毛病,共享代码段、数据段等等都是可以的。但再线程创建的时候却在暗中clone了一个轻量级进程(LWP),也就是pthread创建的线程时内核也会对应的来一个,著名的1:1模型说的就是这个对应关系。

原创粉丝点击