OS复习笔记ch4

news2024/12/23 15:57:18

引言

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

线程从何而来

我们之前说过,进程是对程序运行过程的抽象,它的抽象程度是比较高的。
一个进程往往对应一个程序。所以当我们需要登录多个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.coloradmin.cn/o/1625048.html

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

相关文章

LabVIEW专栏九、类的应用

一、类的应用 接上一章"类" 类在项目中,一般会在类的私有成员簇内,包含一个数据类型为参数类的队列。 例如网口类,里面实际会包含很多信息,有IP地址和端口等等参数。这些参数如果不放在队列引用中缓存下来,…

【热门前端【vue框架】】——vue框架和node.js的下载和安装保姆式教程

👨‍💻个人主页:程序员-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

FPM 快速报表开发

背景: 使用FPM开发报表时,如果报表字段过多,页面拖拽等操作不方便 报表数量过多时,新建应用操作步骤较为繁琐 更习惯通过少量代码而非页面操作去实现功能 处理: 将FPM报表开发简化为类似GUI端ALV的开发过程:&#xff…

大模型微调之 使用 LLaMA-Factory 微调 Llama3

大模型微调之 使用 LLaMA-Factory 微调 Llama3 使用 LLaMA Factory 微调 Llama-3 中文对话模型 安装 LLaMA Factory 依赖 %cd /content/ %rm -rf LLaMA-Factory !git clone https://github.com/hiyouga/LLaMA-Factory.git %cd LLaMA-Factory %ls !pip install "unsloth…

力扣数据库题库学习(4.25日)

1484. 按日期分组销售产品 问题链接 思路与分析 编写解决方案找出每个日期、销售的不同产品的数量及其名称。 每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。我来分析一下,这里的题目要求其实就是统计不同日期下的销售产品数&#xf…

excel文件导入dbeaver中文乱码

1.将excel文件进行另存为,保存类型选择【CSV】 2.选择【工具】–>【web选项】–> 【编码】–> 【简体中文(GB18030)】 3.在DBeaver进行数据导入 直接导入应该就可以,如果不行的话按下面处理。 选择【导入数据——选择cs…

【3GPP】【核心网】【4G】LTE中S1-MME流程字段分析(二)

1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 承接上文 目录 6. PDN Connectivity 7. PDN Disconnection 8. EPS Bearer resource allocation 9. EPS Bearer r…

Gin+WebSocket实战——在线聊天室WebSocketDemo详细使用教程

文章目录 仓库地址项目简介如何使用 仓库地址 Github:https://github.com/palp1tate/WebsocketDemo 欢迎star!😎 项目简介 利用 GinWebSocket 实现的在线聊天室Demo项目,支持加入/离开聊天室广播、给其他用户发送消息等。 如何…

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log,看到某个库报出大量的错误 提示无法连接到ASM实例,这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的,这又是给我挖了什么坑? 报错为ORA-01017​用户名密码不对?​what? 登陆o…

【线性代数 C++】求逆矩阵

对于 n n n阶矩阵 A A A,如果有 n n n阶矩阵 B B B,使 A B B A E ABBAE ABBAE,则说 A A A是可逆的,并把 B B B称为 A A A的逆矩阵. A A A的逆矩阵记作 A − 1 A^{-1} A−1,则 B A − 1 BA^{-1} BA−1.若 ∣ A ∣ ≠…

如何3分钟,快速开发一个新功能

背景 关于为什么做这个代码生成器,其实主要有两点: 参与的项目中有很多分析报表需要展示给业务部门,公司使用的商用产品,或多或少有些问题,这部分可能是历史选型导致的,这里撇开不不谈;项目里面也有很多C…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 🌞前言 🏞️1. 单元测试的理论基础 🌊1.1 单元测试是什么 🌊1.2 单元测试的好处 🌊1.3 单元测试的要求 🌊1.4 测试框架-Junit4的介绍 🌊1.5 单元测试为什么要mock 🏞️…

【自然语言处理】InstructGPT、GPT-4 概述

InstructGPT官方论文地址:https://arxiv.org/pdf/2203.02155.pdf GPT-4 Technical Report:https://arxiv.org/pdf/2303.08774.pdf GPT-4:GPT-4 目录 1 InstructGPT 2 GPT-4 1 InstructGPT 在了解ChatGPT之前,我们先看看Instr…

线性代数-行列式-p1 矩阵的秩

目录 1.定义 2. 计算矩阵的秩 3. 矩阵的秩性质 1.定义 2. 计算矩阵的秩 3. 矩阵的秩性质

Apache Doris 2.x 版本【保姆级】安装+使用教程

Doris简介 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于…

数据挖掘实验一

一、实验环境及背景 使用软件: Anaconda3 Jupyter Notebook 实验内容: 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国(USA)、瑞典&…

Linux系统安全与应用【一】

目录 1.账号安全控制 1.1 系统账号清理 1.2 密码安全控制 1.3 命令历史限制 1.4 命令总结 2.系统引导和登录控制 2.1 使用su命令切换用户 2.2 限制使用su命令的用户 3.可插拔式认证模块PAM 3.1 linux中的PAM安全认证 3.2 PAM认证原理​编辑 3.3 PAM认证的构成 3.4 P…

UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动

UEFI安全启动模式下安装ubuntu的nvidia显卡驱动 实践设备:华硕FX-PRO(NVIDIA GeForce GTX 960M) 一、NVIDIA官网下载驱动 1.1在浏览器地址栏输入https://www.nvidia.cn/drivers/lookup/进入网站,接着手动驱动搜索,并…

GPB | RegVar:基于深度神经网络的非编码区突变功能预测新方法

Genomics, Proteomics & Bioinformatics (GPB)发表了由军事医学研究院辐射医学研究所张成岗研究员、周钢桥研究员和卢一鸣副研究员团队完成的题为“RegVar: Tissue-specific Prioritization of Noncoding Regulatory Variants”的方法文章。我们的“…

Linux常用监控命令(笔试面试常考)

1.、free命令 [rootRocky8-node1 ~]# free -htotal used free shared buff/cache available Mem: 1.7Gi 1.1Gi 69Mi 31Mi 554Mi 436Mi Swap: 2.0Gi 258Mi 1.7Gi free命令是Linux系统中用…