《操作系统》- 线程与进程

news2024/12/25 10:11:11

目录

    • 一、进程的概念
    • 二、进程的结构和特征
      • 2.1 进程的结构
      • 2.2 进程的特征
    • 三、线程的概念
    • 四、进程和线程比较
    • 五、线程的实现方式

一、进程的概念

  • 程序放在磁盘上不叫做进程,只有运行起来之后才叫做进程,进程进程就是进行中的程序!
  • 一次运行就会有一个进程,当再次运行的时候就会产生一个新的进程,浏览器就是这样的,而有的应用程序就不是,当已经在运行的时候再次运行会打开上次运行的程序。我们可以打开应用然后通过任务管理器进行观察就可以发现。
  • 进程是操作系统进行资源分配和调度的一个独立单位(或者说是基本单位)

二、进程的结构和特征

2.1 进程的结构

进程主要有控制块(PCB)、数据段、程序段三部分构成,下图当中把这三块比喻成了一个人,也就是进程。

  • 控制块:操作系统就是根据PCB来区分进程的,可以理解为每个进程有一个自己的唯一编号,就好比每个人都有自己的身份证一样,每个进程的PCB都是不重复的。
  • 数据段:每个进程的数据都是不一样的,并且不存在共享,可以理解为就是人的身体
  • 程序段:可以理解为就是磁盘当中存储的应用,以程序员的理解其实就是应用的代码,也就是多个进程可以共享一个程序代码。再通透一点,电脑安装了一个浏览器,却可以打开多个浏览器页面,多个浏览器页面就是多个进程。

PCB的存储信息与分类

2.2 进程的特征

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的
  • 并发性:多个进程可以并发执行
  • 独立性:独立资源分配,每个进程都有自己的内存区域。
  • 异步性:不用等待别的进程处理完成所以他是异步的、相互独立的、互不干扰。

三、线程的概念

线程可以理解为就是从进程当中分裂出来的一个指令集合。一个进程可以包含多个线程。也可以只存在一条线程,并且线程不能单独存在。线程的资源是由进程进行管理的。

我们打开一个应用就是进程,然后应用当中的每一个功能就对应了一个线程。

拿qq举例:打开qq就是一个进程的运行,这个时候在任务管理器当中是可以看得到该进程的,然后打开qq里面的qq空间就是一条线程,然后跟A聊天就又是一个线程,跟B聊天就又是一个线程。

面试的时候经常会问进程线程的区别:

  • 进程是操作系统 资源分配调度 的基本单位
  • 线程是操作系统 运算调度 的最小单位

想不起来的时候就想一下电脑的任务管理器,任务管理器当中显示了进程,并且显示了进程占用的内存CPU等信息。也就是操作系统是给进程分配空间而并不是线程。

线程下还有一个纤程(了解即可)

  • 纤程:线程是在Windows内核中实现的,操作系统会根据系统的调度算法对线程进行调度。 纤程是在用户模式下实现的,内核对纤程一无所知。 纤程是更轻量级的线程,一个线程可以包含一个或多个纤程。

Java 原生没有提供纤程支持,需要依赖于 quasar-core的库,来创建纤程。感兴趣的可以了解一下,据说是多线程与多纤程计算耗时相比较差距是非常大的,多纤程要比多线程快的多。

线程的属性:

四、进程和线程比较

五、线程的实现方式

线程的实现分为两类:用户级线程(User-Level Thread,UTL)和内核级线程(Kernel-Level Thread, KTL)l。内核级线程又称内核支持的线程。

在用户空间完成的线程就是用户级线程、在内核空间完成的线程就是内核级线程。这里的完成,包含了线程的创建、执行、和销毁。

(1)用户级方式

操作系统提供了线程库,线程库包含了创建线程和销毁线程以及执行线程的接口。操作系统根本不知道线程这个东西,他在执行的时候是以进程装载线程指令来执行的。假如某个线程想要操作内核,这时候会通过陷入指令进行中断,一旦中断其他线程都将阻塞。优点:如果线程不访问内核,只是线程切换,效率比较高。因为所有的线程都在用户空间。

  • 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
  • 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行(因为此时只有一个内核级线程)。

(2)内核级方式

内核级线程的线程控制块在内核空间,上面我们提到了进程由控制块(PCB)、数据段、程序段这三部分构成,而线程他也有,只不过线程的控制块是叫做线程控制块(TCB)。内核级方式就是将线程的控制块存放到内核当中,然后处理器直接切换控制块来完成线程的切换。这时候就完成了线程的并行。

  • 优点:当一个用户级线程被阻塞后,别的用户级线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
  • 缺点:一个用户进程会占用多个内核级线程,而内核级线程的切换由操作系统内核完成,需要切换到核心态,因此线程管理成本高、开销大。

本质上内核级方式和用户级方式 两者的区别就是线程的控制块到底是在用户空间还是在内核空间。

(3)特殊的组合方式

这种模型克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点,是上述两种模型的折中方案。

参考:《马士兵操作系统讲解》https://www.bilibili.com/video/BV1Ha411e7D4/

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

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

相关文章

spring boot security使用jwt认证

前言 在前面的几篇文章中: spring boot security快速使用示例 spring boot security之前后端分离配置 spring boot security自定义认证 spring boot security验证码登录示例 基本对常用的基于cookie和session的认证使用场景都已覆盖。但是session属于有状态认证&am…

GAMES101笔记 Lecture10 Geometry1 (Introduction)

目录 Application for Texture(纹理的应用)Environment Map(环境光贴图)Spherical Environment Map(球形环境光贴图)Cube Map(立方体贴图) Texture can affect shading!(纹理可以作用于着色)How to perturb the normal (in flatland)(如何计算法线如何变化呢?)Displ…

《AutoSar实战》读写DID之三:代码实现

文章目录 前言一、检查生成的接口以及数据类型1. 读DID函数接口生成2. 写DID函数接口生成3. 写NvM接口生成4. RAM数组生成 二、代码编写1. 读DID2. 写DID 总结 前言 本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。 DID读写功能实现流程包括如下几点&#…

行走江湖,一最多的行

本篇博客会讲解力扣“2643. 一最多的行”的解题思路,这是题目链接。 本题的思路是:从上到下遍历二维数组,统计每一行1的个数。使用ret数组的第一个元素维护1最多的行的下标,第二个元素维护最多的1的个数。若发现某一行的1的个数比…

kettle取昨天时间设置任意时间变量

文章目录 kettle取昨天时间&设置任意时间变量设置系统信息增加常量计算器设置变量 总结 kettle取昨天时间&设置任意时间变量 kettle 版本7.1,如下图所示: 所需要组件:1 获取系统信息; 2 增加常量; 3 计算器; 4设置变量 结果可以用于…

yolov8源码解读(part2: 检测,分割)

本文解读下图框中的detection部分 和 没有画出来的分割部分。 注意每个模块右上角的数字,它代表第几个模块, 现在检测和分割的输入都是15, 18, 21个模块的输出(图中圆圈处)。 在代码解读的时候会用[15,18,21]提示需要用到15, 18, 21个模块的输出。 yolov8的实例分割用了y…

Pandas包构建DataFrame的几种方式

1. Pandas Pandas是python的一个第三方包,是一个结构化数据工具集,能够更加灵活、快速的对数据进行清洗和处理,适用于单击大数据量的数据分析和数据开发 使用pandas包之前,首先安装 pip install -i https://pypi.tuna.tsinghua.…

【STM32】STM32G系列使用CORDIC模块加速计算

1.前言 STM32G431系列产品内置了CORDIC运算单元,可以用来加速数学计算,如三角函数、取模、开方等。适合大量数据进行相同的运算操作。配合DMA可以大大节省CPU计算开销。 2.CubeMX配置 使用CORDIC模块无需配置参数,若采用DMA方式则只需配置…

JavaWed第三章:JavaScript的全面知识

目录 前言 一.JavaScript的简介 💖概念 💖学习内容 二.JavaScript的引入方式 💖内部脚本 💖外部脚本 三.JavaScript的基础语法 💖语法的书写 💖变量 ✨ 全局变量 ✨局部变量 ✨常量 &a…

Vue3使用$refs获取节点生产环境undefined-使用getCurrentInstance-ctx应改用proxy

vue3项目,在使用refs获取节点,开发环境正常,生产环境报错 console.log(getCurrentInstance()) internalInstance.ctx, internalInstance.proxy 开发环境正常-生产环境报错 internalInstance.ctx 生产环境获取不到值 ctx打包后在生产环境下是获…

激光SLAM(一):点云基础知识

点云基础知识 一、激光雷达介绍1. 机械旋转式雷达2. 固态雷达 二、测量模型与点云1. Range-Azimuth-Elevation(RAE)- XYZ2. 点云的Packets表示3. 点云的鸟瞰图表示4.Range Image5.TSDF 三、点云的近邻关系Brute-force KNN栅格、体素KD-tree寻找近邻四叉树…

Visual Studio Code系列--CMake Tools使用说明

一、目的 在linux系统上开发程序,一般都是使用vimgccgdb进行的;但是为了开发效率我们也会使用Visual Studio Code进行开发,毕竟有界面的开发调试还是更加友好一些。 老牌程序员肯定都知道make构建工具,但是其晦涩的语法还是难住不…

二十一、数值操作(二)

目录 七、数值查找 1、Excel实现 2、Python实现 八、区间切分 1、Excel实现 2、Python实现 九、插入新的行或列 1、Excel实现 2、Python实现 十、行列互换 1、Excel实现 2、Python实现 十一、索引重塑 十二、长宽表转换 1、宽表转换为长表 (1&#x…

如何提升软件质量及开发效率

如何提升软件质量及开发效率 文章目录 如何提升软件质量及开发效率1、简介2、软件质量模型3、需求分析4、软件设计5、项目管理1.1 版本管理1.2 项目结构规范 6、编码规范7、代码评审8、软件调试9、软件测试 1、简介 保证软件质量,是一个贯穿整个软件生存周期的重要…

Java利用朴素贝叶斯分类算法实现信息分类

目录 贝叶斯分类算法 代码实例 数据集data.txt代码实现输出结果使用场景 贝叶斯分类算法 贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Nave Bayes,NB)分类算法可以与决策树和神…

项目管理考核积分指标库大全V3.0

近期热文:大咖来袭!中国PMO&PM大会议程隆重发布,三城联动 北京、上海、深圳三地同步进行,两天近70位项目管理大咖专家齐聚一堂,交流分享。各路高手汇聚一处,互相学习。精心的圆桌设计,穿插…

uniapp打包白屏问题

【bug】:浏览器运行正常,模拟器、真机运行只有tab栏显示,或者完全白屏。打包也是白屏。 【控制台报错信息】: 注意:app不支持dom操作 【解决办法】:在main.js里修改 render函数是vue通过js渲染dom结构的…

前端vue入门(纯代码)20

总以为自己还很年轻,却忽略了岁月的脚步,当身边的一道道风景变成了回忆,才忽然发现,风景依然在,而人已非少年。!!! 【22.求和案例--纯Vue版本】 太简单了,直接上代码案…

Squid代理服务器

Squid代理服务器 一、Squid相关知识 1.功能 Squid 主要提供缓存加速、应用层过滤控制的功能。 2.工作机制 1.代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。 2.将获得的网页数据(静态 Web 元素)保存到…

js:使用typed.js实现打字动画效果

效果预览 目录 实现方式一: 原生JS实现实现方式二&#xff1a;typed.js实现 实现方式一: 原生JS实现 <div id"code"> 我感到未尝经验的无聊&#xff0c;是自此以后的事。我当初是不知其所以然的&#xff1b; 后来想&#xff0c;凡有一人的主张&#xff0c;得…