Operating System-Thread(3)用户空间和内核空间实现线程
http://www.cnblogs.com/Brake/archive/2015/12/02/Operating_System_Thread_Part3.html
本文主要内容:
操作系统用户空间和内核空间简介
在用户空间实现线程
在内核空间实现线程
用户空间和内核空间线程混合使用
一、用户空间和内核空间简介
用户空间:User space,内核空间:Kernel Space。这两个是操作系统的重要概念之一,今天为了线程做一下简单的介绍:
内核空间用于运行操作系统核心组件,比如内存管理组件,IO交互组件,文件管理、中断管理组件等,同时驱动程序(Driver)也运行在内核空间。
用户空间,用于运行普通应用程序。
示意图:
二,在用户空间实现线程
用户空间的线程由进程通过一些已有的Library进行创建,非系统调用(system call)内核对此毫无知晓。实现如下图所示。
在用户空间实现线程,线程运行在运行时系统中(run-time system)。内核对此一无所知,对于内核来说,它这是在处理一个单线程的进程而已。在用户空间实现线程时,每一个进程针对自己的线程维护了一个线程表(Thread Table),该表保存了线程运行的各种变量,比如寄存器,PC,状态等等,线程表用进程的运行时系统来维护,当一个线程被block,她的当前运行状态会被保存在线程表中,当再次启动时,也会读取线程表中已经保存的状态,从该状态进行再次运行。
2.1 优势
线程的创建有run-Time system通过调用现有的Library的Procedure完成,创建和销毁进程的开销非常小。
因为内核对线程没有感知,用户空间的线程可以运行在不支持线程的操作系统中
因为线程由同一个运行时进行维护,在同一个进程内部,线程的切换没有必要和内核大交道,所以线程之间的切换的开销非常小,没有Context Switch,也没有内存缓存的刷新重置。
用户空间的线程可以自定义调度算法,程序员完全可以自己写一套针对自己程序的线程调度算法
2.2 劣势
因为对于内核来说,不管进程里面有多少个线程,内核任然按照单线程进程来处理这个进程,所以统一时间一个进程里面只能有一个线程运行,就算有多个cpu空闲,也只能有一个线程运行,所以无法最大限度的使用资源
当然由于只能有一个线程运行,当某一个线程被block后,整个进程都会被block。
对于单进程的系统,用户态的线程如果有一个启动,就会永远运行,无法被切换到另外一个线程,这里还是与第一条有关,对于CPU来说,这个进程就只有一个线程,另外因为是单进程,也就不会有中断(trap、Interrupt)让cpu切换到其他进程的请求。当然这个问题用户可以实现自己的算法进行调度和改善(在run-time system中实现)
三、在内核空间实现线程
内核空间的线程全部有操作系统内核创建,实现如下图所示。
内核线程同样有线程表(Thread table),不过这个线程表是保存在内核中,其功能和用户空间线程表的功能一样,都是用于保存线程的数据。线程的调度由操作系统内核来实现。
内核线程和用户空间线程基本从性能各方面来说基本是相反地
3.1 优势
线程表包含所有进程的线程,所有一个进程的可能有多个线程同时在多个cpu上同时运行
一个线程被block不会导致整个进程被block,CPU会看是不是有其他线程可以运行。
3.2 劣势
1。创建线程消耗非常大,需要在用户空间和内核之间切换。
2。当然发生线程的Context切换时,程序也要从用户态和内核态之间互相切换,开销大
四、用户空间和内核空间线程混合使用
上面的两种线程的实现方式都有明显的优缺点,最好的方案其实就是将两者结合,一个程序可以既有用户空间的线程,也可以用内核空间的线程。
具体实现方式是,内核线程可以在其之上有一部分用户空间的线程。内核只调度内核的线程。
至于什么样的比例,怎么实现。 又回到程序=数据结构+算法这个话题了。。。
Operating System-Thread(3)用户空间和内核空间实现线程的更多相关文章
- Linux系统调用具体解释(怎样从用户空间进入内核空间)
系统调用概述 计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同一时候执行的多个进程都须要訪问这些资源,为了更好的管理这些资源进程是不同意直接操作的,全部对这些资源的訪问都必须有操作系统控制. ...
- Linux用户空间与内核空间(理解高端内存)
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...
- Linux用户空间与内核空间
源:http://blog.csdn.net/f22jay/article/details/7925531 Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针 ...
- linux 用户空间与内核空间——高端内存详解
摘要:Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对 ...
- Linux内存管理--用户空间和内核空间【转】
本文转载自:http://blog.csdn.net/yusiguyuan/article/details/12045255 关于虚拟内存有三点需要注意: 4G的进程地址空间被人为的分为两个部分--用 ...
- linux内存管理--用户空间和内核空间
关于虚拟内存有三点需要注意: 4G的进程地址空间被人为的分为两个部分--用户空间与内核空间.用户空间从0到3G(0xc0000000),内核空间占据3G到4G.用户进程通常情况下只能访问用户空间的虚拟 ...
- linux用户空间和内核空间(内核高端内存)_转
转自:Linux用户空间与内核空间(理解高端内存) 参考: 1. 进程内核栈.用户栈 2. 解惑-Linux内核空间 3. linux kernel学习笔记-5 内存管理 Linux 操作系统和驱 ...
- 如何看待Linux操作系统的用户空间和内核空间
作为中央核心处理单元的CPU,除了生产工艺的不断革新进步外,在处理数据和响应速度方面也需要有权衡.稍有微机原理基础的人都知道Intel X86体系的CPU提供了四种特权模式ring0~ring3,其中 ...
- 用户空间和内核空间通讯之【Netlink 中】
原文地址:用户空间和内核空间通讯之[Netlink 中] 作者:wjlkoorey258 今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的.我们依旧是在2.6 ...
随机推荐
- ASP.NET 省市县三联动 (包含用户控件)
将压缩文件下载解压后,将用户控件拖到解决方案里,直接可以拖到需要用到的页面里 使用: 数据库是最新的(父子级关系表结构----Region2016.sql) 右键记事本打开,放在sqlServerl里 ...
- JavaMelody - 常用配置
一直没怎么关注javaMelody这个东西. 自己写东西的时候想弄点监控,于是把javaMelody装进去了. 看了文档几乎全是法语,在此记录一些常用的配置. 首先依赖添加如下: <depend ...
- 2 duplicate symbols for architecture“文件冲突”
我在配置第三方库拷贝示例文件中的库文件到新项目完成相关配置之后报下面的错误: 错误的原因是在解决问题之后发现的(第三方库的项目示例demo中的 要拷贝到自己项目中的库 并不需要全部添加到自己 ...
- PHP · MySQL函数
连接名=mysql_connect("主机","用户名","密码"); 连接名=mysql_qconnect("主机", ...
- IDEA 的 properties 文件的属性字段如何链接到调用的文件
想要达到的效果: ctrl + 鼠标点击:弹出如下所有使用的文件 问题: 有些 IDEA 使用 ctrl + 鼠标点击不能看到使用的文件. 解决办法: ctrl + 鼠标点击,然后选择设置按钮 然后 ...
- C# 值类型 引用类型
CLR 定义了两种类型,ReferenceTypes引用类型 和 ValueTypes 值类型.我们定义的各种Class都是引用类型,而我们用的decimal int 之类是值类型. 他们有什么区别呢 ...
- 关于Dubbo异常之Data length too large
最近几日发现生产环境项目打出的日志,每天都在30~50G以上,寻找多次发现问题: 首先查看日志只看到大批量的json数据输出,这是方法查询后的返回值输出,期初以为是自己打了logger,结果寻找多次, ...
- HBuilder开发App Step1——环境搭建,HelloMUI 以及真机调试
No1. 必须搭建java环境 只需要最基础的java环境,也就是cmd下可以运行java和javac即可, 具体教程请自行百度,都会有很详细的教程,这里不重点介绍. No2. 下载安装HBuilde ...
- 微信小程序发布一个月,世界并没有什么不同
从某种意义上说,在张小龙身上,最可怕的事情莫过于微信小程序发布一个月,一开始的大红大紫居然渐归沉寂,曾经的风光无限已无人谈起,世界并没有什么不同. 这真像一场噩梦,一切都可怕地颠倒了.一款微信的战略级 ...
- web 学习资源
学习 https://skills.bugbank.cn/ https://github.com/JnuSimba/MiscSecNotes 靶场 http://skysec.top/2018/01/ ...