进程 VS 线程(javaEE篇)

news2024/9/21 2:37:44
  • 🍁 个人主页:爱编程的Tom
  • 💫 本篇博文收录专栏:JavaEE初阶
  • 👉 目前其它专栏:c系列小游戏     c语言系列--万物的开始_ 等              
  • 🎉 欢迎 👍点赞✍评论⭐收藏💖三连支持一下博主🤞
  • 🧨现在的沉淀就是对未来的铺垫🎨 

前言 

本篇博客将讲述进程调度的基本过程,熟悉进程与线程之间的关系,掌握并理解进程以及线程更深层的含义

  • 什么是进程/任务(Process/Task) 

通俗的来讲:即电脑里运行的可执行文件

进程是操作系统对⼀个正在运行的程序的⼀种抽象

也可以理解为,可以把进程看做程序的⼀次运行过程;

同时,在操作系统内部,进程⼜是操作系统进行资源分配的基本单位。 

  • 如何管理进程 

想知道如何管理进程,首先就要了解其预备知识,

进程控制块(Process Control Block),就是PCB

PCB的相关属性:

pid:进程的id,即进程标识符

内存指针:指向进程执行所需要的指令位置(在内存中)

文件描述符表:记录打开的文件,用于跟踪进程打开的所有文件和I/O资源。每个进程都有一个文件描述符表,它是一个数组,其中每个元素都是一个文件描述符,这些文件描述符是整数,用于标识进程打开的文件和其他I/O资源(如管道、套接字等)。

  • 管理进程的过程 

1. 创建进程

  • 系统调用:操作系统提供系统调用(如forkexec)用于创建新进程。fork创建一个当前进程的副本,exec用新的程序替换当前进程的内存空间。
  • 进程控制块(PCB):创建进程时,操作系统会初始化一个进程控制块(PCB),其中包含进程的状态、程序计数器、寄存器、内存管理信息、I/O状态信息等。

2. 进程调度

  • 调度算法:操作系统使用调度算法决定哪个进程获得CPU时间。常见调度算法包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度、轮转调度(RR)等。
  • 上下文切换:当调度器选择一个新进程运行时,操作系统会进行上下文切换,保存当前进程的状态并加载新进程的状态。

3. 进程同步

  • 信号量和互斥锁:用于解决进程间的同步问题,防止多个进程同时访问共享资源导致数据不一致。信号量可以实现复杂的同步机制,互斥锁用于保护临界区。
  • 条件变量:结合互斥锁使用,使线程能够等待某个条件成立,再继续执行。

4. 进程通信

  • 管道(Pipe):用于在父子进程间通信,数据以字节流的形式在进程间传递。
  • 消息队列:允许进程通过消息的形式进行通信,支持复杂的消息传递机制。
  • 共享内存:多个进程可以直接访问同一块内存,实现高速数据共享。
  • 信号:用于通知进程某个事件的发生,如定时器到期、中断等。

如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这⼀概念的初衷

这样便带来了进程之间互相具备”隔离性 (Isolation)"

5. 进程终止

  • 正常终止:进程完成任务后,自行终止,调用exit系统调用。
  • 异常终止:进程发生错误或收到某个信号(如SIGKILL)被强制终止。
  • 父进程等待:父进程可以调用waitwaitpid等待子进程终止,并获取其退出状态。

  • 进程调度的基本过程 

并行+并发的模式,支持多任务,简单来说,进程调度就是CPU如何给不同的进程分配资源的问题

与下面的一些属性有着密不可分的联系

状态

就绪状态:随时可以在CPU上执行

阻塞/等待状态:无法在CPU上执行,需等待其它进程执行完毕 

优先级:允许谁的进程先执行,时间上的顺序,涉及到一些进程调度算法 

上下文:

  • 保存当前进程状态:操作系统保存当前正在运行的进程的状态(如寄存器值、程序计数器等)到该进程的PCB中。
  • 加载新进程状态:从被选中的新进程的PCB中恢复该进程的状态,使其能够继续执行之前暂停的操作。
  • 切换内核栈和内存映射:必要时,切换内核栈和内存映射,以确保新进程能够正确访问其内存空间和资源。

记账信息:记录系统资源分配的多少,以及进程调度的时间和内容 

接下来简单地讨论一下线程是什么 

  • 什么是线程

⼀个线程就是⼀个"执行流".每个线程之间都可以按照顺序执行自己的代码.多个线程之间"同时"执行着多份代码. 线程是现代操作系统中一个基本的执行单元。它是一个轻量级的进程,也称为轻量级进程(Lightweight Process, LWP)。一个进程可以包含一个或多个线程,它们共享进程的资源(如内存、文件描述符等),但每个线程都有自己独立的运行栈、程序计数器和寄存器。线程的引入主要是为了提高程序的并发性和性能。

我们知道,频繁地创建和销毁进程会导致开销非常大

要想解决这个问题,我们可以使用以下两个方法:

进程池

预先创建一定数量的进程,并将这些进程保留在一个池中,以便在需要执行并发任务时可以重复使用这些进程

轻量级的进程---线程:

由于线程共享进程资源的特性,可以降低开销,实现并发编程

  • 进程和线程的简单例子 

这里我们举一个简单的例子来分辨一下进程和线程

  • 进程

想象一个餐馆有多个独立的厨房,每个厨房是一个进程。每个厨房有自己独立的设备、食材和厨师队伍。不同厨房之间互不干扰,每个厨房独立处理各自的订单。

  • 独立资源:每个厨房有自己独立的炉灶、锅碗瓢盆和食材储备。厨房之间不能直接共享资源(需要特殊安排,如外送食材)。
  • 独立运行:每个厨房独立接单和处理订单,即使一个厨房出现问题(如火灾),不会直接影响其他厨房的正常运行。
  • 开销大:每个厨房需要配备完整的设备和人员,所以开设和维持多个厨房的成本较高。

  • 线程

现在想象一个餐馆有一个大厨房,厨房里有多个工作台,每个工作台是一个线程。工作台共享整个厨房的资源(如炉灶、冰箱、食材等),但是每个工作台由不同的厨师处理不同的订单。

  • 共享资源:所有工作台共享同一个厨房的资源,厨师们可以直接使用公共资源(如冰箱里的食材、灶台等)。
  • 协作运行:如果一个工作台需要等待某个资源(如锅),其他工作台仍然可以继续工作,但需要协调和避免争抢资源(如使用不同的时间段)。
  • 开销小:所有工作台共享一个厨房的资源和设备,新增一个工作台的成本较低。

  • 进程和线程的区别和联系

  • 区别

  • 进程是包含线程的.每个进程⾄少有⼀个线程存在,即主线程。
  • 进程和进程之间不共享内存空间.同⼀个进程的线程之间共享同⼀个内存空间. 比如每个客户来银行办理各自的业务,但他们之间的票据肯定是不想让别⼈知道的,否则钱不就被其他⼈取⾛了么。⽽上⾯我们的公司业务中,张三、李四、王五虽然是不同的执 行流,但因为办理的都是⼀家公司的业务,所以票据是共享着的。这个就是多线程和多进程的最⼤区别。
  • 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
  • ⼀个进程挂了⼀般不会影响到其他进程.但是⼀个线程挂了,可能把同进程内的其他线程⼀起带走(整 个进程崩溃).

更具体的一些区别如下: 

资源管理

  • 进程:每个进程有自己独立的地址空间和资源,包括内存、文件描述符等。进程之间不共享内存,通信需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等。
  • 线程:线程是进程的子单位,同一进程内的所有线程共享进程的地址空间和资源,包括内存、文件描述符等。这使得线程之间的数据共享和通信更加直接和高效。

创建和销毁

  • 进程:创建和销毁进程的开销较大,因为操作系统需要分配和回收独立的资源。通常使用forkexec系统调用创建进程。
  • 线程:创建和销毁线程的开销较小,因为线程共享进程的资源。通常使用线程库(如POSIX线程库pthread或Java的Thread类)创建线程。

执行方式

  • 进程:进程是独立运行的,每个进程都有自己的程序计数器、堆栈和寄存器。进程切换涉及上下文切换,开销较大。
  • 线程:线程是进程中的独立执行单元,每个线程有自己的程序计数器、堆栈和寄存器,但共享进程的全局变量和堆内存。线程切换的开销比进程切换小。

通信方式

  • 进程:进程间通信(IPC)较复杂,需要借助操作系统提供的机制,如管道、消息队列、共享内存、信号等。
  • 线程:线程间通信更加直接,因为线程共享进程的地址空间,可以通过共享变量进行通信。需要使用同步机制(如互斥锁、条件变量)防止竞争条件。

错误隔离

  • 进程:进程间相互独立,一个进程的崩溃不会影响其他进程。这提供了良好的错误隔离。
  • 线程:线程间不完全独立,一个线程的崩溃可能导致整个进程的崩溃。错误隔离较差。

  • 联系    

  • 并发性:进程和线程都是用于实现并发性的方法,可以在单核和多核处理器上并行执行多个任务。
  • 调度:操作系统调度器负责管理进程和线程的执行,决定哪个进程或线程在何时运行。
  • 资源使用:进程和线程都消耗系统资源,如CPU时间、内存等。操作系统需要合理分配这些资源,确保系统稳定运行。
  • 状态转换:进程和线程都有生命周期,包括创建、就绪、运行、等待和终止等状态。操作系统通过调度和上下文切换管理这些状态转换。

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

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

相关文章

一.4 处理器读并解释储存在内存中的指令

此刻,hello.c源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在硬盘上。要想在Unix系统上运行该可执行文件,我们将它的文件名输入到称为shell的应用程序中: linux>./hello hello, world linux> shell是一个命令…

YOLOv10改进 | 添加注意力机制篇 | 添加FocusedLinearAttention助力yolov10实现有效涨点(含二次创新PSA机制)

一、本文介绍 本文给大家带来的改进机制是Focused Linear Attention(聚焦线性注意力)是一种用于视觉Transformer模型的注意力机制(但是其也可以用在我们的YOLO系列当中从而提高检测精度),旨在提高效率和表现力。其解决了两个在传统线性注意力…

博美犬插画:成都亚恒丰创教育科技有限公司

​博美犬插画:萌动心灵的细腻笔触 在浩瀚的艺术海洋中,有一种艺术形式总能以它独有的温柔与细腻,触动人心最柔软的部分——那便是插画。而当插画遇上博美犬这一萌宠界的明星,便诞生了一幅幅令人爱不释手的作品,成都亚…

云计算【第一阶段(28)】DNS域名解析服务

一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析(Domain Name System Resolution)是互联网服务中的一个核心环节,它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…

DNS隧道

dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell 目录 Dnscat2安装 解决bundle instal1特别慢问题 客户…

4.动态SQL(if,choose,where,set,trim,foreach遍历)的使用+$和#的区别

文章目录 动态sql一、动态sql1.if条件判断2、choose、when、otherwise3、where标签4、set标签5、trim标签1)替代where标签效果2) 生成set标签效果 6、foreach迭代遍历1)属性 7.SQL标签-提取重用的SQL代码片段8、bind标签9.MyBatis中${}和#{}的区别: 动态sql 一、动态sql 常见…

windows USB 设备驱动开发-USB 等时传输

客户端驱动程序可以生成 USB 请求块 (URB) 以在 USB 设备中向/从常时等量端点传输数据。虽然USB设备一向以非等时传输出名,USB提供的是一种串行数据,而非等时,但是USB仍然设计了等时传输的机制,但根据笔者的经验,等时传…

vue3项目,表单增删改

效果图 ArticleChannel.vue页面代码 <script setup> import {artGetChannelsService ,artDelChannelService} from /api/article.js import { Edit, Delete } from element-plus/icons-vue //调用open方法&#xff0c;ChannelEdit去修改组件内部类容 import ChannelEdit…

Geoserver源码解读六 插件(怎么在开发模式下使用)

系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog Geoserver源码解读六 插件&#xff08;怎么在开发模式下使用&#xff09; 文章目录 系列文…

QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1

一、安装前准备&#xff1a; 1.安装QT,QT5.12.9官方下载链接&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.9/ QT安装教程&#xff1a;https://blog.csdn.net/Mark_md/article/details/108614209 如果电脑是64位就编译器选择MinGW64&#xff0c;32位就选择MinGW…

自动驾驶---Perception之Occupancy

1 背景 在阐述Occupancy之前&#xff0c;先理解为什么要使用Occupancy&#xff1f; 如果自动驾驶车辆在行驶过程中看到的物体不是数据集的一部分&#xff0c;这个时候容易出现误判。 而在基于激光雷达的系统中&#xff0c;由于检测到点云&#xff0c;可以确定障碍物的存在&…

《Windows API每日一练》8.5 listbox控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程&#xff0c;程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时&#xff0c;列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…

C# 中的Semaphore(信号量)详解与应用

文章目录 1. 信号量是什么&#xff1f;2. C# 中的 Semaphore 类3. 信号量的使用示例3.1 创建信号量3.2使用信号量同步线程 4. 总结 在并发编程中&#xff0c;同步是一种基本的需求。信号量&#xff08;Semaphore&#xff09;是一种常见的同步机制&#xff0c;它用于控制对共享资…

Jhipster实战中遇到的知识点-开发记录

利用Jhipster开发的网站天赋吉星终于上线啦&#xff0c;本文介绍了在开发过程中遇到的各种小的知识点和技巧&#xff0c;绝对干货&#xff0c;供你参考。大家可以直接点击天赋吉星&#xff0c;看到网站效果。 首先介绍一下项目技术选型&#xff0c;JHipster 版本:8.1.0, 项目类…

stm32 USB CDC类虚拟串口初体验

1. 目标 本文介绍CubeMX生成 USB CDC类虚拟串口工程的操作步骤。 2. 配置流程 时钟配置 usb外设需要48M时钟输入 stm32405使用外部时钟源HSE,否则配不出来48M时钟stm32h750内部有一个48M时钟 stm32f405时钟配置 stm32h750时钟配置 Connectivity ->USB_OTG_FS 和 Connect…

windows obdc配置

进入控制面板&#xff1a; 进入管理工具&#xff1a;

MAC在网络结构中的位置:深入解析

MAC在网络结构中的位置&#xff1a;深入解析 在网络通信的世界里&#xff0c;每一层都扮演着至关重要的角色。今天&#xff0c;我们将聚焦于一个经常被提到但可能不太被理解的概念&#xff1a;MAC&#xff08;Media Access Control&#xff0c;媒体访问控制&#xff09;。我们…

智慧产业应用实训实践基地-信息类专业实践实验室-嵌入式、物联网、移动互联网、云计算、大数据、人工智能、区块链实训室

智慧产业实践基地面向信息类专业群&#xff0c;以智慧灯杆、智慧交通、智慧设施在智慧产业中的实际实践为项目原型&#xff0c;软硬件开源、开放&#xff0c;海量的技术资料和实训课程。整个系统运用了嵌入式、物联网、移动互联网、云计算、大数据、人工智能、区块链等综合交叉…

three-tile 一个开源的轻量级三维瓦片库

three-tile 介绍 three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 源码&#xff1a;https://github.com/sxguojf/three-tile 示例&#xff1a;https:/…

音频demo:将PCM数据与alaw、mulaw、g711数据的相互转换

1、README 前言 (截图来源&#xff1a;https://blog.csdn.net/u014470361/article/details/88837776) 我的理解&#xff1a; 首先需要知道的是u-law/a-law是用于脉冲编码的压缩/解压缩算法。而G.711是指在8KHz采样率&#xff08;单声道&#xff09;中&#xff0c;使用的u-law或…