进程和线程的关系

⭐ 作者:小胡_不糊涂

🌱 作者主页:小胡_不糊涂的个人主页

📀 收录专栏:JavaEE

💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

进程&线程

  • [1. 什么是进程](#1. 什么是进程)
  • [2. 什么是线程](#2. 什么是线程)
  • [3. 两者关系](#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. 进程 是资源分配的基本单位,线程是调度执行的基本单位
相关推荐
记录成长java26 分钟前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~30 分钟前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
程序媛小果1 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
小屁孩大帅-杨一凡1 小时前
java后端请求想接收多个对象入参的数据
java·开发语言
java1234_小锋2 小时前
使用 RabbitMQ 有什么好处?
java·开发语言
TangKenny2 小时前
计算网络信号
java·算法·华为
肘击鸣的百k路2 小时前
Java 代理模式详解
java·开发语言·代理模式
城南vision2 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wyh要好好学习2 小时前
SpringMVC快速上手
java·spring
尢词2 小时前
SpringMVC
java·spring·java-ee·tomcat·maven