当前位置: 首页 > news >正文

进程和线程的关系

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

进程&线程

  • 1. 什么是进程
    • PCB
  • 2. 什么是线程
  • 3. 两者关系

在这里插入图片描述

1. 什么是进程

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
简单地说,进程就是操作系统提供的一种 “软件资源” 。我们计算机正在运行中的程序就可以成为“任务”,也叫做“线程”。

现在大多数用到的系统都属于“多任务操作系统”,也就是同一时刻,可以同时运行多个任务
在这里插入图片描述

上图中的每个进程在运行时,都需要给它分配一定的系统资源。
也就可以说,进程是系统分配资源的基本单位。

在这里插入图片描述

当然也有 “单任务操作系统”,比如:很久之前手机就是同一时刻只能运行一个任务。

但是进程在进行频繁创建和销毁的时候,开销是很大的 ,因为要不断地申请资源(CPU,硬盘,内存…)和释放。

而申请内存的时候,又是很麻烦的,先要指定一个大小,然后系统内部把各种大小的空闲内存,通过一定的数据结构给组织起来。当实际申请的时候,就需要去这样的空间中进行查找,找到个大小合适的空闲内存分配过来。

而线程的存在就是为了解决该问题!

PCB

PCB–进程控制块抽象(PCB Process Control Block)
计算机内部要管理任何现实事物,都需要将其抽象成⼀组有关联的、互为⼀体的数据。在 Java 语⾔中,我们可以通过类/对象来描述这⼀特征。

PCB也就表示了进程信息的结构体。

PCB的重要属性:

  1. pid–是进程身份标识,同一个机器、同一时刻,每个进程的pid是唯一的
  2. 内存指针–指向进程使用的内存存放位置
  3. 文件描述符–进程使用的硬盘的相关信息
    支持进程调度的重要属性:
  4. 状态–就绪状态、运行状态、死亡状态、阻塞状态
  5. 优先级–每个进程执行的优先顺序
  6. 记账信息
  7. 上下文–PCB中的数据结构

“保存上下文” 就是把CPU的关键寄存器中的数据保存到内存中(PCB的上下文属性中)
“恢复上下文” 就是把内存中的关键寄存器中的数据加裁到CPU的对应寄存器中

2. 什么是线程

⼀个线程就是⼀个“执⾏流”。每个线程之间都可以按照顺序执⾏⾃⼰的代码。多个线程之间“同时”执⾏着多份代码。

线程在进程的基础上做了改进,保持独立调度执行,省去了“分配/释放资源”带来的额外开销。

在这里,我们也使用PCB来描述一个线程,在PCB中有一个属性–内存指针
对多个现成的PCB的内存指针,指向的是同一个内存空间。
在这里插入图片描述
但并不是随便几个线程就可以共享资源,我们把能够共享资源的这些线程,放在线程组中。

3. 两者关系

进程与线程是包含关系。每个进程都可以包含一个\多个线程。

在这里插入图片描述

在有线程之前,进程是资源分配的基本单位,也是调度执行的基本单位。
现在,进程只需要专注于资源分配就可以了,调度执行由线程来负责。

进程与线程是同时创建的吗?
在创建进程时,资源就已经分配。
因为一个进程中至少要有一个线程,也就可以说是,在创建第一个线程的同时,进程也就出来了。

总结:

  1. 进程是包含线程的
  2. 每个进程的内存是相互独立、互不干扰的
  3. 每个线程是一个独立的执行流可以执行一些代码,并且单独的参与到cpu调度中,每个线程有自己的一份资源(状态、上下文、优先级、记账信息)
  4. 每个进程有自己的资源,进程中的线程共用这一份资源(内存空间和文件描述符表)
  5. 同一个进程中的线程之间,可能会相互干扰引起线程安全问题
  6. 线程并非越多越好,要能够合适。如果线程太多了,调度开销可能非常明显,
  7. 进程和进程之间不会相互影响
  8. 如果同一个进程中的某个线程抛出异常,是可能会影响到其他线程会把整个进程中的所有线程都异常终止
  9. 进程是资源分配的基本单位,线程是调度执行的基本单位
http://www.lryc.cn/news/246763.html

相关文章:

  • YOLOv5全网独家改进:NanoDet算法动态标签分配策略(附原创改进代码),公开数据集mAP有效涨点,来打造新颖YOLOv5检测器
  • 原生DOM事件、react16、17和Vue合成事件
  • 基于HTML+CSS+JavaScript的登录注册界面设计
  • BUUCTF [MRCTF2020]Ez_bypass 1
  • 基于Apache部署虚拟主机网站
  • 大数据平台/大数据技术与原理-实验报告--部署全分布模式HBase集群和实战HBase
  • 手写字符识别神经网络项目总结
  • 八、Lua数组和迭代器
  • 平凯星辰 TiDB 获评 “2023 中国金融科技守正创新扬帆计划” 十佳优秀实践奖
  • 运算符展开、函数,对象,数组,字符串变化 集合
  • NI自动化测试系统用电必备攻略,电源规划大揭秘
  • ky10 server arm 在线编译安装openssl3.1.4
  • 外网IP和内网IP的区别
  • Jquery动画特效
  • Tableau连接到mysql数据库,配置驱动
  • HuggingFace学习笔记--AutoModel的使用
  • Kafka常见面试问题
  • 学习知识回顾随笔(远程连接MySQL|远程访问Django|HTTP协议|Web框架)
  • 一、TIDB基础
  • 【微软技术栈】使用新的C#功能减少内存分配
  • Linux shell编程学习笔记29:shell自带的 脚本调试 选项
  • 分享几个可以免费使用GPT的网站
  • 一. BEV感知算法介绍
  • Scala如何写一个通用的游戏数据爬虫程序
  • 前端命名规范总结
  • Vue学习笔记-搭建Vuex
  • Ajax技
  • Co-DETR:DETRs与协同混合分配训练论文学习笔记
  • ELk部署,保姆级教学超详细!!!
  • 计算机毕业设计springboot+vue高校田径运动会报名管理系统61s38