进程和线程的关系

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏: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.hqwc.cn/news/228687.html

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

相关文章

算法 离散化

整数离散化 适用条件 适用于有序的整数序列该序列的值域很大,该序列的数的个数很少使用的是数的相对大小而非绝对大小 算法思路 原数组 a : 数组下标:0 1 2 3 4 数组元素:1 2 2 5 109 映射数组 : 数组下标&…

SVD recommendation systems

SVD recommendation systems 为什么在推荐系统中使用SVD 一个好的推荐系统一定有小的RMSE R M S E 1 m ∑ i 1 m ( Y i − f ( x i ) 2 RMSE \sqrt{\frac{1}{m} \sum_{i1}^m(Y_i-f(x_i)^2} RMSEm1​i1∑m​(Yi​−f(xi​)2 ​ 希望模型能够在已知的ratings上有好的结果的…

【Rust】所有权的认识

所有权 所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。 Rust 则选择了第三种方式:通过所有权系统管理内…

【浅尝C++】C++类的6大默认成员函数——构造、析构及拷贝构造函数

🎈归属专栏:浅尝C 🚗个人主页:Jammingpro 🐟记录一句:好想摆烂,又好想学习~~ 文章前言:本篇文章简要介绍C类的构造函数、析构函数及拷贝构造函数,介绍每个小点时&#xf…

Mysql中的引擎介绍(InnoDB,MyISAM,Memory)

MySQL引擎就是指表的类型以及表在计算机上的存储方式。 MySQL数据库及其分支版本主要的存储引擎有三种,分别是 InnoDB、MyISAM、 Memory,还有一些其他的,CSV、Blackhole等,比较少见,可以使用SHOW ENGINES语句来查看。结…

【ShardingSphere专题】SpringBoot整合ShardingSphere(一、数据分片入门及实验)

目录 前言阅读对象笔记正文一、ShardingSphere介绍1.1 ShardingSphere-JDBC:代码级别1.2 ShardingSphere-Proxy:应用级别1.3 横向对比图 二、ShardingSphere之——数据分片2.1 基本介绍2.2 分片的形式2.2.1 垂直分片2.2.2 水平分片 2.3 数据分片核心概念…

揭开 BFC 的神秘面纱:前端开发必知必会

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

DS八大排序之直接插入排序和希尔排序

前言 我们前面几期介绍了线性和非线性的基本数据结构。例如顺序表、链表、栈和队列、二叉树等~!本期和接下来的几期我们来详解介绍各个排序的概念、实现以及性能分析! 本期内容 排序的概念以及其运用 常见的排序算法 直接插入排序 希尔排序 一、排序的…

利用Spring Boot构建restful web service的详细流程

本文档构建一个简单的restful webservice, 在官网原文Getting Started | Building a RESTful Web Service (spring.io)的基础上进行操作 文章目录 一、项目创建流程1.1 创建项目1.2 创建资源表示类1.3 创建资源控制类 二、项目运行参考资料 一、项目创建流程 本文的…

Android flutter项目 启动优化实战(一)使用benchmark分析项目

背景描述 启动时间是用户对应用的第一印象,较慢的加载会对用户的留存和互动造成负面影响 在刚上线的B端项目中: 1.提高启动速度能提高整体流程的效率 2.提高首次运行速度能提高应用推广的初体验效果 问题描述 项目刚上线没多久、目前存在冷启动过程存在…

前端面试灵魂提问

1.自我介绍 2.在实习中,你负责那一模块 3.any与unknow的异同 相同点:any和unkonwn 可以接受任何值 不同点:any会丢掉类型限制,可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查,所以在使用一个…

【古月居《ros入门21讲》学习笔记】07_创建工作空间和功能包

目录 说明: 1. 工作空间(workspace) 结构: 2. 创建工作空间和功能包 创建工作空间 编译工作空间 创建功能包 设置环境变量 3. 注意 同一个工作空间下,不能存在同名的功能包; 不同工作空间下,可以存在同名的功…