用户级线程和系统级线程

2023-11-15

在多线程操作系统中,各个系统的实现方式并不相同。在有的系统中实现了用户级线程,有的系统中实现了内核级线程

1.内核级线程:

(1)线程的创建、撤销和切换等,都需要内核直接实现,即内核了解每一个作为可调度实体的线程。

(2)这些线程可以在全系统内进行资源的竞争。

(3)内核空间内为每一个内核支持线程设置了一个线程控制块(TCB),内核根据该控制块,感知线程的存在,并进行控制。

在一定程度上类似于进程,只是创建、调度的开销要比进程小。有的统计是1:10

2.用户级线程:

(1)用户级线程仅存在于用户空间。——>对比内核(3)

(2)内核并不能看到用户线程。——>重要的区别

(3)内核资源的分配仍然是按照进程进行分配的;各个用户线程只能在进程内进行资源竞争。

用户线程运行在一个中间系统上面。目前中间系统实现的方式有两种,即运行时系统(RuntimeSystem)和内核控制线程。

 “运行时系统”实质上时用于管理和控制线程的函数集合。包括创建、撤销、线程的同步和通信的函数以及调度的函数。这些函数都驻留在用户空间作为用户线程和内核之间的接口。用户线程不能使用系统调用,而是当线程需要系统资源时,将请求传送给运行时,由后者通过相应的系统调用来获取系统资源。

内核控制线程:

系统在分给进程几个轻型进程(LWP),LWP可以通过系统调用来获得内核提供的服务,而进程中的用户线程可通过复用来关联到LWP,从而得到内核的服务。

内核线程的优点:

(1)

(2)当有多个处理机时,一个进程的多个线程可以同时执行

缺点:

(1)由内核进行调度

用户进程的优点:

(1)线程的调度不需要内核直接参与,控制简单

缺点:

(1)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用。

===========================================

线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread).后者又称为内核支持的线程或轻量级进程.

用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

 

内核线程:   由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows   NT和2000/XP支持内核线程  
   
   
  用户线程:由应用进程利用线程库创建和管理,不以来于操作系统核心。不需要用户态/核心态切换,速度快。操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少。

Windows NTOS/2支持内核线程。Linux 支持内核级的多线程

=========================================================

了解了一下,用户级线程和内核级线程。

用户级线程:

image

从这张图上面可以看出来,用户级线程的管理是由应用程序的进程来完成的,而不关内核的事。在内核看来还是只有进程的概念,所以线程的调度也就可以通过应用程序自己设定,不用核心态的特权。

但是也就是因为这样,在内核中没有线程的概念,如果一个线程进入内核,然后再系统调用的时候阻塞了,那么,核心只会把它作为整个进程阻塞了,也就是说这个进程中的所有线程都被阻塞了。

线程状态和进程状态是独立的(从何说起?不理解)

优点: 
  线程切换不调用核心 
  调度是应用程序特定的:可以选择最好的算法 
  ULT可运行在任何操作系统上(只需要线程库)

缺点: 
  大多数系统调用是阻塞的,因此核心阻塞进程,故进程中所有线程将被阻塞 
  核心只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上

内核级线程:

image

所有线程管理由核心完成 
没有线程库,但对核心线程工具提供API 
核心维护进程和线程的上下文 
线程之间的切换需要核心支持 
以线程为基础进行调度 
例子:Windows

优点: 
  对多处理器,核心可以同时调度同一进程的多个线程 
  阻塞是在线程一级完成 
  核心例程是多线程的 
缺点: 
  在同一进程内的线程切换调用内核,导致速度下降


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用户级线程和系统级线程 的相关文章

  • STM32 ST-LINK Utility介绍、下载、安装、使用方法

    STM32 ST LINK Utility介绍 下载 安装 使用方法 原文如下 xff1a https blog csdn net ybhuangfugui article details 52597133
  • PAUSE: command not found

    system pause 相当于从程序里调用 pause 命令 继而暂停 必须添加 stdlib h 或 cstdlib 头文件 但只适合DOS或Windows 不合适合Linux 这就是出现 sh PAUSE command not fo
  • #if defined和#if !defined(c语言的宏定义)

    因为对于一个大程序而言 我们可能要定义很多常量 不管是放在源文件还是头文件 那么我们有时考虑定义某个常量时 我们就必须返回检查原来此常量是否定义 但这样做很麻烦 if defined宏正是为这种情况提供了解决方案 举个例子 如下 defin
  • Unity3D开发小贴士(十四)JsonUtility

    Json是现在非常常用的数据格式 因为 Net的版本问题 所有没有很方便的方法可以直接在Unity里面使用C 官方的Json库 于是Unity3D自己提供了自己的一套Json工具 JsonUtility 参考下面的示例 using Unit
  • c++: ini 文件解析(依赖库:inifile)

    Initialization File 初始化文件 是 windows 系统配置文件所采用的存储格式 统管 windows 的各项配置 文件会以不同的扩展名 如 ini cfg conf 等 用来配置应用软件以实现不同的需求 可以用来存放软
  • C++ :JSON 解析系统(依赖库:jsonCpp)

    JSON JavaScript Object Notation JavaScript 对象表示法 定义 存储和交换文本信息的语法 类似 XML 比 XML 更小 更快 更易解析 属于轻量级的文本数据交换格式 使用 Javascript语法来
  • DUF – 适用于 Linux、BSD 和 macOS 的跨平台磁盘使用/免费实用程序

    随着数据的指数级增长 管理存储和分析磁盘使用情况已成为系统管理员和日常计算机用户的一项基本任务 了解磁盘空间的利用方式有助于您优化系统并就存储分配做出明智的决策 DUF 即磁盘使用 空闲实用程序 是一款功能强大的跨平台工具 旨在帮助您做到这
  • 在android编程中使用实用程序类

    我对实用程序类有一点了解 但对需求略有疑问 如果我在我的应用程序中使用实用程序类而不是在我的主活动中使用该类 我是否必须创建该类的对象 或者我可以直接在我的主活动中导入该类吗 如果我没有表达清楚的话 我很抱歉 简而言之 我想清楚的是 基本上
  • 实用程序类..好还是坏?

    我一直在读到 通过在代码中使用静态类 单例来创建依赖项是一种不好的形式 并且会产生问题 紧密耦合和单元测试 我遇到的情况是 我有一组没有与之关联的状态的 url 解析方法 并且仅使用该方法的输入参数执行操作 我相信你对这种方法很熟悉 在过去
  • 使用 unix 实用程序删除连续的重复行

    这表面上听起来很简单 但实际上要复杂一些 我想使用 unix 实用程序删除连续的重复项 保留原始内容 但是 我还想保留在原始内容之后不立即出现的其他重复内容 例如 如果我们有以下几行 O B O B C D T V O B 我希望输出是 O
  • 有没有一种方法可以使用宏来检测是否包含标准标头?

    我想做一个相当于boost swap在我的环境中 可以或不可以包含标准标头 取决于项目许可和其他内容 我想让部分代码受到警卫检测器的保护 让我们考虑一个编译单元 项目特定的 前述的潜力包括 include
  • wget 中的递归下载如何工作?

    wget 用于镜像站点 但我想知道该实用程序如何下载该域的所有 URL wget r www xyz com wget如何下载域xyz的所有URL 它是否像爬虫一样访问索引页面并解析它并提取链接 简短回答 通常 是的 Wget 会抓取所有
  • Typescript 仅从重载中选择特定方法(传递给Parameters

    背景 所以我在从重载的函数获取特定参数时遇到问题 例如 someLib d ts type Component
  • 通过jquery获取对象数组的索引

    我有以下数组 var array id aa description some description id bb description some more description id cc description a lot of d
  • List::Util - 减少 - 长度 - 编码 - 问题

    为什么第一个reduce 示例得到错误的结果 test txt BE bb bbbbbbbbbbbbbbb aaaaaa test pl usr bin env perl use warnings use 5 012 use open en
  • 如何以编程方式操作 Windows 桌面图标位置?

    几年前 我天真地尝试编写一个小应用程序来保存我战术性放置的桌面图标 因为当某些事件重置它们时 我厌倦了将它们拖回原来的位置 在花费了太多时间未能找到一种方法来查询 更不用说保存和重置 我的图标的桌面位置后 我放弃了 有人知道 Windows
  • mongo.exe 有更好的 shell [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 实施“more”Unix实用程序命令

    我正在努力实施more命令 我想知道如果有管道我该如何理解 例如 如果我从 shell 中输入 cat file1 file2 more 我怎样才能在 more 的实现中处理这个问题 并且是实施more可以开源吗 实际上 我无法成功读取 s
  • 为什么我不应该有一个单一的整体实用程序库?

    我们有一些通用库 C 但我想这不是特定于平台或语言的 我们称它们为 A B 和 C 库 A 引用了 B 和 C 库 B 引用了第三方 DLL 库 C 是独立的 三个独立项目背后的想法是 每个库都有不同的功能 但随着时间的推移 库 A 或多或
  • 用于编译/反编译二进制数据文件的通用实用程序或库?

    我有各种二进制文件格式 我需要将其转储为某种文本格式 编辑然后重新编译 可能是二进制格式的稍微不同的版本 当然 我可以用 C C 编写一堆实用程序代码来完成这种事情 并且可能利用一个库来处理文本方面的事情 XML 或 JSON 或其他 但这

随机推荐

  • Altium designer20(AD20)安装教程

    一 教程是基于本人在安装过程中的截图 步骤都非常详细 PDF教程文档 AD 20安装 提取码 u8mm AD20下载链接 AD20安装包 提取码 v7t6
  • KDD Cup竞赛介绍

    转自 http huzhyi21 blog 163 com blog static 1007396200981534952541 KDD Cup简介 KDD Cup is the annual Data Mining and Knowled
  • Win10系统VS2019+Cmake+gflags2.2.2环境配置

    1 gflags 1 1 简要介绍 gflags是google开源的一套命令行参数解析工具 使用C 开发 具备Python接口 可以替代getopt gflags使用起来比getopt方便 但是不支持参数的简写 例如getopt支持 lis
  • LLM-项目详解-KnowLM:信息抽取大模型

    GitHub zjunlp KnowLM Knowledgable Large Language Models Framework 随着深度学习技术的快速发展 大型语言模型如ChatGPT在自然语言处理领域已经取得了显著的成就 然而 这些大
  • c++的构造函数初始化列表

    C 类构造函数初始化列表 构造函数初始化列表以一个冒号开始 接着是以逗号分隔的数据成员列表 每个数据成员后面跟一个放在括号中的初始化式 例如 class CExample public int a float b 构造函数初始化列表 CEx
  • PCB设计误区-电源是不是必须从滤波电容进入芯片管脚(终结篇)

    PCB设计误区 电源是不是必须从滤波电容进入芯片管脚 终结篇
  • Mysql架构和InnoDB存储引擎流程

    一 整体架构和流程 二 流程图解析 这一共分为四个步骤 1 前台操作触发Mysql服务器执行请求 2 InnoDB存储引擎 缓冲池中完成更新的基本操作 3 Redo Log和BinLog保证事务的可靠性 4 将事务的操作持久化 一 a 前台
  • 在TypeScript使用React forwardRef

    React forwardRef 用于获取子结点的DOM元素引用 当结合TS使用时 需要注意类型断言 import forwardRef useEffect from react const Test forwardRef
  • Verilog十大基本功8 (flipflop和latch以及register的区别)

    来自1 https www cnblogs com LNAmp p 3295441 html 第一次接触Latch是在大二学习数电的时候 那时候Latch被翻译成锁存器 当时还纠结着锁存器和寄存器的区别 要是当时我知道他俩的英文名叫latc
  • Unity3D 画线函数(实现和虚线)

    1 若只需要在调试场景Scene里查看 不需要在Game运行场景看到 可以使用 Debug Draw 这个函数一般在Update Fixed Update LateUpdate里调用 并且不能设置材质 不过可以指定颜色 例子如下 void
  • 蓝牙之十八- bluetooth pair

    蓝牙之十八 bluetooth pair 在蓝牙核心规范2 1之后 蓝牙配对除了传统的PIN Code Pairing方式外 新增了Secure Simple Pairing配对方式 根据核心规范4 2 简单配对主要有两种目的 蓝牙配对过程
  • BDTC2014中国大数据技术大会

    2014中国大数据技术大会32位核心专家演讲PDF下载汇总 重磅资料 下载地址 http download csdn net detail zhongwen7710 8295907 2014中国大数据技术大会32位核心专家演讲PDF目录题目
  • 学习笔记 JavaScript ES6 声明方式const(一)

    今天学习ES6当中定义常量 先来复习下ES5当中是如何定义常量的 通过如下方法在一个对象上定义新的属性来定义一个常量 见如下代码 这个方法有3个参数 第1个参数是在哪个对象上定义属性 第2个参数是属性名称 第3个参数是对象 Object d
  • 孩子学习机器人法则

    现在社会学习机器人的好处有很多 由于小孩子正处于增长知识 发挥自身应有能力的年纪 格物斯坦表示让小孩子学习一门理论前沿性和实用性都较高的机器人编程教育对小孩子未来发展是非常有益的 首先机器人教育不是孤立存在的 机器人技术是多种学科综合的学科
  • Vue 使用 axios post请求后台数据时 404

    今天遇到Vue 使用 axios post请求后台数据时 404 使用postman 就能获取到 网上找了大半天 终于找到了解决方法 传送门 https www jianshu com p b10454ed38ba 转载于 https ww
  • C语言的一个正则表达式pcre

    1 简介 在C C 中 一个比较好的正则表达式是pcre 被很多工具 包括一些商用工具 使用 2 源码下载 安装 2 1 下载 可以从官网http www pcre org 下载 为方便学习 已放在这里http download csdn
  • ctf.show web入门(信息搜集) 1~20

    目录 web1 源码 web2 源码 web3 抓包 web4 robots web5 index phps web6 解压源码泄露 web7 git泄露 web8 svn泄露 web9 vim缓存 web10 cookie web11 域
  • 快速排序全部算法

    快速排序 cpp 定义控制台应用程序的入口点 include stdafx h include stdlib h include stdio h define MAXSIZE 10 typedef struct int keyWord in
  • 代码随想录算法训练营第13天

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 算法训练营第13天 栈与队列总结 347 前 K 个高频元素 使用堆 基本思路 堆 使用大顶堆还是小顶堆 python 中的heapq 347 前 K 个高频元素 这道题的代
  • 用户级线程和系统级线程

    在多线程操作系统中 各个系统的实现方式并不相同 在有的系统中实现了用户级线程 有的系统中实现了内核级线程 1 内核级线程 1 线程的创建 撤销和切换等 都需要内核直接实现 即内核了解每一个作为可调度实体的线程 2 这些线程可以在全系统内进行