OS复习笔记ch4

引言

上一章,我们学习了进程的相关概念和知识,不知道小伙伴们的学习进度如何,没看的小伙伴记得去专栏看完哦。

线程从何而来

我们之前说过,进程是对程序运行过程的抽象,它的抽象程度是比较高的。
一个进程往往对应一个程序。所以当我们需要登录多个QQ帐户的时候,打开了多个QQ.exe,OS创建了多个对应的进程,在每一个QQ进程中我们可以聊天和传输文件等。

但是,小伙伴们有没有想过这个问题,我们的程序绝大多数都是顺序执行的。只有少数开发语言执行会有异步的问题(比如JavaScript),绝大多数代码是按照我们书写的顺序,从上到下依次执行。
如果是这样的话,一个QQ.exe,它对应了一份代码(将相关的代码看成一个整体),那么它似乎就做不到可以同时聊天和传输文件了。
事实是这样吗?


显然,我们的QQ是十分智能的,它不仅可以一边上传文件、一边聊天、还能一边视频……,按照我们之前的逻辑这不对啊,QQ这一个程序怎么能同时执行多个模块的代码呢?
原因其实很简单,在QQ进程底下,会细分成处理聊天的线程、处理文件的线程、处理视频的线程,它们并发执行,类似于OS的多进程,而这就是我们线程的由来。

进程存在的问题

说到这,可能有小伙伴问了,竟然多线程和OS的多进程很像,为啥要多整了个线程的概念,直接创建进程不就行了吗?


这就不得不提进程存在的问题了

  • 进程创建、切换开销大(服务器的成千上万的请求响应要创建进程、分配资源)
  • 进程通信代价大:经过内核
  • 进程间的并发性粒度较粗,并发度不高。
  • 不适合并行计算和分布式并行计算的需求。

说白了,就是进程的抽象程度比较高,每次进程要做点啥事都要在内核里面执行,来回切换非常麻烦,效率也比较低。

解决方法

在讲解本节之前,就让我们回顾一下进程的两个重要特征


  1. 资源的拥有者——进程包括容纳进程映像的虚拟地址空间
  2. 调度和执行的单位——沿着执行轨迹与其他进程交替执行

以上两个特征独立的,构成进程并发的基础。

很容易想到,之前我们的进程通信、切换等都要经过内核主要是因为他们是调度和执行的基本单位。那为了提高进程切换和通信的效率,我们就要对这个基本单位动一点手脚。

当我们分别对待上述两个特征

  • 将资源的拥有者继续作为进程,即资源分配和保护的基本单位,不需要频繁切换。
  • 然后通过引入线程,作为调度和分派执行的基本单位。
    这样,不就完美解决了上述问题了吗,感觉自己很崇明的样子,嘿嘿。

于是乎,线程继承了进程的一些特征

image.png
其中

  • 线程也有自己ID和控制块(TCB),实现思路和进程很像
  • 具有运行、就绪、阻塞三种基本状态
  • 有线程的上下文,也就是栈、堆、寄存器级别的信息
  • 执行栈,用于存放运行的中间变量
  • 共享所在进程的内存和资源,线程之间并发执行

既然我们的方案这么完美,那么这种设计到底有哪些优点呢?


  • 已有进程内创建一个线程比创建全新进程用时少。
  • 终止一个线程比进程用时少
  • 同进程内线程的切换比进程切换用时少
  • 线程提高了程序间的通信效率
  • 减少并发执行的时间和空间的开销,提高并发程度。
  • 适合多处理器系统。

线程分类

  1. 用户级线程(User Level Thread,ULT):应用程序负责所有线程的管理(内核不知用户级线程的存在)
  2. 内核级线程/轻量进程(Kernel-Level Threads,KLT):由OS管理的线程(类似于进程管理,对应于一个或者多个用户级线程)

ULT

如图所示
image.png
优:

  • 无需用户态/核心态的切换
  • 线程调度算法(线程库)可以针对应用优化

缺:
一个线程发起系统调用而被阻塞,则整个进程中的线程都被阻塞(CPU看不到线程级别,就阻塞给整个进程,而线程的状态来不及发生变化)。

KLT

如图所示
image.png

优:

  • 内核可以同时在多处理器上调度进程的多个线程
  • 一个线程被阻塞,内核可调度其他线程
  • 内核例程也可以是多线程(比如,openEuler的2号进程)

缺:
同一个进程中一个线程切换到另一线程需要内核的模式切换。

两者结合

将ULT映射到KLT,在某些OS,例如Solaris系统是这样
image.png
取ULT和KLT的两者所长,有点像CO里面的组相联映射,既获得了仅有用户级线程的开销,又获得了仅有内核级线程的并发度,中庸之道妙哉妙哉。

多核和多线程(拓展)

多核系统的多线程支持
image.png

这里的speedup,f是程序并行部分占比,f/N是放在N个核上的时间,1-f是不可并行的时间。
这个公式表明,当增加更多的处理器时,总体的速度提升受到程序可并行化部分的比例的限制。如果 𝑓是一个较小的数,即使增加了很多处理器,总的速度提升也可能不大;如果 𝑓接
近1,也就是说程序几乎完全可以并行化,那么增加更多的处理器会显著提高速度。

image.png

图(a)–不考虑系统开销,1 - f = 0%、2%、5%、10%的各组对比实验,符合上述公式
图(b)–考虑系统开销,1 - f = 0%、2%、5%、10%的各组对比实验。
实际上,即使是完全可以并行化的程序(𝑓=1),并行处理的速度提升也不会接近处理器的数量 𝑁。这表明有一个性能的上限,即不管你有多少处理器,速度提升永远不会无限大。因为处理器的数量增多开销也会增大,比如增加处理器之间的通信、同步等,并行执行的额外成本。

此外,由于引入了多核,程序可以设计有了更多的可能,比如多线程,多进程,或者像Java这种一个进程多个线程,以及多个并行实例。

小结

image.png本章节的知识和内容一般会和进程放在一起去考察,涉及到的概念也比较多,小伙伴们要像糖葫芦那样多串一串,这样有助于形成一个良好的知识体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:静态成员变量和静态成员方法

静态成员变量 C中的静态成员变量是属于类而不是类的实例的变量。这意味着无论创建了多少个类的实例,静态成员变量都只有一个副本,并且可以被所有类的实例共享。 让我们来看一个示例: class RolePlayer { public://静态成员变量static int …

值得让英伟达CEO黄仁勋亲自给OpenAI配送的AI服务器!一文带你了解算力,GPU,CPU!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

怎么办,孟德尔随机化连锁不平衡跑不了!这里有本地连锁不平衡分析方法

大家都知道,孟德尔随机化很大程度依赖于国外的服务器。 最近我们发现孟德尔随机化常用的TwoSampleMR包的clump函数经常报错,这是由于服务器访问人群超时造成的现象,当线上版本失效。 很多人做孟德尔随机化,就卡在clump上。 于是我…

OpenStack云计算(十)——OpenStack虚拟机实例管理,增加一个计算节点并进行实例冷迁移,增加一个计算节点的步骤,实例冷迁移的操作方法

项目实训一 本实训任务对实验环境要求较高,而且过程比较复杂,涉及的步骤非常多,有一定难度,可根据需要选做。可以考虑改为直接观看相关的微课视频 【实训题目】 增加一个计算节点并进行实例冷迁移 【实训目的】 熟悉增加一个…

牛客NC199 字符串解码【中等 递归,栈的思想 C++/Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/4e008fd863bb4681b54fb438bb859b92 相同题目: https://www.lintcode.com/problem/575 思路 解法和基础计算器1,2,3类似,递归参考答案C struct Info {string str;int stopindex;Info(str…

AOC vs. DAC:哪个更适合您的网络需求?

在现代网络通信中,选择合适的连接线缆对于数据传输的稳定性和速度至关重要。两种常见的线缆类型是 AOC(Active Optical Cable) 和 DAC(Direct Attach Cable)。本文将详细介绍这两种线缆的特点、优势和适用场景&#xf…

Aigtek:介电弹性体高压放大器在软体机器人研究中的应用

近年来软体机器人的研究成为目前机器人研究领域的热点,由于软体材料的自由度可以根据需求自由变化,因此软体机器人有着极高的灵活性,而且软体机器人因其材料的柔软性有着很好的人机交互性能和安全性。它的出现成功解决了传统的刚性机器人人机…

JavaScript云LIS系统概述 前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS(云实验室信息管理系统)是一种结合了计算机网络化信息系统的技术,它无缝嵌入到云HIS(医院信息系统)中,用于连…

《异常检测——从经典算法到深度学习》27 可执行且可解释的在线服务系统中重复故障定位方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

Oracle 监控 SQL 精选 (一)

Oracle数据库的监控通常涉及性能、空间、会话、对象、备份、安全等多个层面。 有效的监控可以帮助 DBA 及时发现和解决问题,提高数据库的稳定性和性能,保障企业的数据安全和业务连续性。 常用的监控指标有: 性能指标: 查询响应时间…

抽象工厂模式(Redis 集群升级)

目录 定义 Redis 集群升级 模拟单机服务 RedisUtils 模拟集群 EGM 模拟集群 IIR 定义使⽤接⼝ 实现调⽤代码 代码实现 定义适配接⼝ 实现集群使⽤服务 EGMCacheAdapter IIRCacheAdapter 定义抽象⼯程代理类和实现 JDKProxy JDKInvocationHandler 测试验证 定义 …

Mockaroo - 在线生成测试用例利器

简介:Mockaroo 是一个无需安装的在线工具,用于生成大量的自定义测试数据。它支持多种数据格式,如JSON、CSV、SQL和Excel,并能模拟复杂的数据结构。 历史攻略: 测试用例:多条件下编写,懒人妙用…

ChatGPT付费创作系统V2.8.4独立版 WEB+H5+小程序端 (新增Pika视频+短信宝+DALL-E-3+Midjourney接口)

小狐狸GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT!无限多…

网盘——文件重命名

文件重命名具体步骤如下: 目录 1、具体步骤 2、代码实现 2.1、添加重命名文件的槽函数 2.2、关联重命名文件夹信号槽 2.3、添加重命名文件的协议 2.4、添加槽函数定义 2.5、服务器 2.6、添加重命名文件的case 2.7、客户端接收回复 3、测试 3.1、点击重命…

debian配置四叶草输入法

效果展示 一、前言 在linux下体验比较好的输入法只有两款:搜狗输入法、四叶草输入法。 ubuntu下可以成功配置搜狗输入法,但debian下从来没有成功过。 今天在用fcitx5 四叶草时发现VNC远程输入法会失灵,于是改用了ibus 四叶草&#xff0c…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器,在item中添加了很多的控件,这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候,及容易不小心就把数据给修改了而不自知。所有,我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

原生微信小程序中案例--仿boss区域树选择列多选功能

1. 需求描述: 区域三级列表, 有添加,编辑,删除功能。 选择父级分类,其下子类全部选中,当前分类后加标志显示全字样取消选中子类,其父类分类后标志显示选中数量若子类全部选中,除当…

对2023年图灵奖揭晓看法

2023年图灵奖揭晓,你怎么看? 2023年图灵奖,最近刚刚颁给普林斯顿数学教授 Avi Wigderson!作为理论计算机科学领域的领军人物,他对于理解计算中的随机性和伪随机性的作用,作出了开创性贡献。这些贡献不仅推…

【stomp 实战】spring websocket源码分析之握手请求的处理

上一节【搭建一套websocket推送平台】我们通过一个项目,实现了一套推送平台。由于spring框架对于websocket的支持和stomp协议的良好封装,我们很容易地就实现了websocket的消息推送功能。虽然搭建这么一套推送系统不难,但是如果不了解其底层原…

Spring Cloud Alibaba Sentinel 使用

初识Sentinel Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址: home | Sentinel 需要了解的概念 簇点链路 在学习 Sentinel 的使用之前,我们有必要首先了解一下簇点链路。当请求进入微服务时,首先会访Controller、Service、Ma…