`
cloudeagle_bupt
  • 浏览: 533875 次
文章分类
社区版块
存档分类
最新评论

进程,轻量级进程,内核线程,用户线程的区别关系

 
阅读更多

进程,轻量级进程,内核线程,用户线程的区别关系

在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。

线程有自己的私有数据:程序计数器,栈空间以及寄存器。

Why Thread?(传统单线程进程的缺点)

1. 现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。

2. 传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。

3. 如果采用多进程的方法,则有如下问题:
a. fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。
b. 各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。

多线程的优缺点

多线程的优点和缺点实际上是对立统一的。

支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程要访问的数据需要一些同步技术。

三种线程——内核线程、轻量级进程、用户线程

内核线程

内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。

轻量级进程[*]

轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。这种模型实际上就是恐龙书上所提到的一对一线程模型。在这种实现的操作系统中,LWP就是用户线程。

由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。

轻量级进程具有局限性。首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在usermode和kernel mode中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。

注:

1 LWP的术语是借自于SVR4/MP和Solaris 2.x。

2 有些系统将LWP称为虚拟处理器。

3 将之称为轻量级进程的原因可能是:在内核线程的支持下,LWP是独立的调度单元,就像普通的进程一样。所以LWP的最大特点还是每个LWP都有一个内核线程支持。

用户线程

LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。而这里的用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。

上图是最初的一个用户线程模型,从中可以看出,进程中包含线程,用户线程在用户空间中实现,内核并没有直接对用户线程进行调度,内核的调度对象和传统进程一样,还是进程本身,内核并不知道用户线程的存在。用户线程之间的调度由在用户空间实现的线程库实现。

这种模型对应着恐龙书中提到的多对一线程模型,其缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。

加强版的用户线程——用户线程+LWP

这种模型对应着恐龙书中多对多模型。用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多需要的用户线程。操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。

小结:

很多文献中都认为轻量级进程就是线程,实际上这种说法并不完全正确,从前面的分析中可以看到,只有在用户线程完全由轻量级进程构成时,才可以说轻量级进程就是线程。

分享到:
评论

相关推荐

    Linux下的LWP(轻量级进程)、进程、线程、用户级线程、内核线程

    本文主要讲解了Linux下的LWP(轻量级进程)、进程 、线程、用户级线程、内核线程的概念、区别与联系、优缺点、发展等相关内容。 本文来自于CSDN,由火龙果软件Linda编辑、推荐。 再看正文之前我要先强调一下几点: ...

    进程 线程 轻量级线程1

    线程的执行是由系统内核来管理的,通常被称为内核线程或者k-线程。不同于由操作系统内核调度的线程,轻量级线程由应用级线程调度程序来负责调度。轻量级线程也有它的缺点

    linux多线程及网络编程

    内核线程,在有的系统上称为LWP(Light Weight Process,轻量级线程),运行在内核空间,由内核调度;用户线程运行在用户空间,由线程库来调度。当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程。...

    哈工大 操作系统 实验8 内核级线程

    11级本人自写的作业, 于实验八截至后第一天上传; 没采用轻量级风格的线程, 而是仿造windows solaris的风格. 应该好使, 欢迎讨论, 联系方式在下载包内.

    Java与线程.pdf

    线程是比进程更轻量级的调度执行单位,它可以将一个进程的资源分配和执行调度分开,既可以共享进程资源,又可以独立调度。线程的实现有两种方式:用户线程和内核线程。 用户线程是在用户态中实现的,不需要内核的...

    疯狂内核之——进程管理子系统

    1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与...

    Java线程实现与安全

    首先并发并不是我们通常我们认为的必须依靠线程才能实现,但是在Java中并发的实现是离不开线程的,线程的主要实现有三种方式:使用内核线程(KernelThread,KLT)实现使用用户线程实现使用用户线程加轻量级进程混合...

    linux系统编程之线程.zip

    LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间。 独居(进程);合租(线程)。 ...

    uThreads:用C ++实现的并发用户级线程库

    用户级线程是轻量级线程,它们在内核线程之上执行以提供并发性和并行性。 内核线程是使用处理器所必需的,但是它们具有以下缺点: 每个挂起/恢复操作都涉及内核上下文切换线程抢占会导致额外的开销线程优先级和高级...

    操作系统答案2.doc

    一般来说,用户线程之间的上下文切换 涉及到用一个用户程序的轻量级进程(LWP)和用另外一个线程来代替。这种行为 通常涉及到寄存器的节约和释放。 4.3在哪些情况下使用多内核线程的多线程方案比单处理器系统的单个...

    一个进程池的服务器程序

    总的来说,思想是让子进程accept并处理请求,父进程通过子进程发来的信息控制请求数与子进程数之间的关系。 代码如下: 代码如下: #include #include #include #include #include #include #include #...

    ernest-dzf#docs#线程进程1

    处理器竞争:可以在全系统范围内竞争处理器资源使用资源:唯一使用的资源是内核栈和上下文切换时保持寄存器的空间调度:调度的开销可能和进程自身差不多昂贵轻量级进程轻量

    深入理解linux内核

    注意为英文版 【目录信息】前言第一章 绪论 Linux与其他类Unix内核的比较 硬件的依赖性 Linux版本 操作系统基本概念 ...Linux中的分页 第三章 进程 进程、轻量级进程和线程 进程描述符 进程切换 创建进程 撤销进程

    多线程编程指南

    多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。在系统级别内,程序并排执行,系统分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。然而在每个应程序的内部,...

    轻量级MenuetOS

     免费的MENUET就是这么一个简单的Linux内核操作系统。最令人吃惊的是,这个专门安装在一张1.44寸软盘上的操作系统竟然可以实现图形操作界面。这个用汇编语言写成的32位操作系统具有结构清晰、利于编程、快速、稳定...

    leetcode伪代码-go-anywhere:关于go的代码、文档和想法

    以many-to-many为例,在实现上需要在用户线程和内核线程之间提供称为轻量级进程(lightweight process, LWP)的中间数据结构。 对于用户线程库而言,LWP就像是一个虚拟处理器,应用程序可以在其上调度用户线程运行。每...

    meerkat:轻量级嵌入式 Web 服务器

    极其轻量级,内核不到 40kB,运行时占用空间很小 支持单线程或多线程使用的异步、非阻塞内核 稳定、成熟且经过测试,在持续改进和完善方面投入了数年的人力物力 注意:Meerkat 不支持 HTTPS、CGI、SSI、

    machina-x86:用于 x86 机器(32 位)的轻量级内核和操作系统

    用于 x86 机器(32 位)的轻量级内核和操作系统,其构建速度快、简单且可扩展。 Machina 正在开发中,还不能使用,但打算提供一个图形模式的 CLI,支持 GUI。 特征 在 32 位保护模式下运行 多线程支持 内核通过串口...

Global site tag (gtag.js) - Google Analytics