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

【多线程】初识进程和线程

       

b50ffcc051264df7b69b2c41c025d66f.jpeg

        💐个人主页:初晴~

📚相关专栏:多线程 / javaEE初阶


前言

     在我们之前编写的所有代码,都只能用上一个核心。众所周知,现在大多数CPU都有多个核心,但此时,无论如法优化程序,最多也只有一个CPU核心在工作,其它的核心都空闲着,就容易出现所谓一核有难,多核围观的窘况。这时可以通过一些代码,把多个CPU核心都利用起来,提高运行效率,这样的编程就被称为“并发编程”。而提到并发编程就离不开多进程编程和多线程编程了。这篇文章就让我们先来认识一下进程与线程吧👀

2c994905f06d4cbe94a4ad7b8bfe688c.png

一、进程

1、概念

        进程是计算机中正在运行的程序的实例。它是操作系统进行资源分配和调度的基本单位。每个进程都有自己的内存空间代码数据执行状态。进程可以独立运行,相互之间不会干扰。操作系统可以同时运行多个进程,通过分配时间片轮流执行它们,从而实现多任务处理。进程可以与其他进程进行通信和协作,共享资源和数据。

8cc0ee12a5eb4940b5c776445036b342.png

像上图中显示的就是正在运行的程序,也就是一个个系统分配的进程

2、特性

进程的特性:

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块(PCB)三部分组成;

3、组织形式

一个可执行程序,运行的时候,操作系统就会创建进程,给这个程序分配各种系统资源(CPU,内存,硬盘,网络带宽等……),所谓的进程,在系统中是通过PCB(process control block)这样的结构体来描述的,通过双显链表的形式来组织,简单来说就是“先描述,再组织”的形式

描述进程:使用PCB结构体描述进程的各种属性

操作系统会进行两步:

  • 为该进程创建对应的PCB对象
  • 将该进程的代码和数据加载在内存中

PCB就相当于是进程属性的集合,主要描述了以下属性:

  • 标示符PID:    描述本进程的唯一标示符,用来区别其他进程
  • 状态:    任务状态,退出代码,退出信号等。
  • 优先级:    相对于其他进程的优先级。
  • 程序计数器`:    程序中即将被执行的下一条指令的地址。
  • 内存指针:    包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据:    进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息:    包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息:    可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 组织进程:通过双显链表,将各进程的PCB串联起来

通过PCB,操作系统就可以更好地去管理各个进程,操作时不需要获取整个进程,只需获取描述进程的PCB对象,就可以找到相对应的代码与数据,从而大幅节省空间开销,提高效率。

二、线程

        虽然多进程方式能够实现并发编程,但是效率要求的提高,就希望有更好的方式来实现。多进程编程最大的问题就是太“重”了,创建进程和销毁进程的空间开销与时间开销都比较大,一旦需求场景中需要频繁创建销毁进程时,效率就非常低了。为了解决进程开销较大的问题,就发明了相对轻量化的线程

线程比进程更加轻量化,主要是因为创建线程,省去了“分配资源”的过程,销毁线程,也省去了“释放资源”的过程。

一旦进程创建,同时就会创建好第一个线程,并分配好系统资源,后续该进程创建更多线程时,就不需要再分配资源了。

        举个例子,假设系统要执行的任务是吃掉100块肉,这时系统就会创建一个进程,并为这个进程分配一定资源,我们这里看作是为任务执行而开辟了一个“房间”,然后这个进程会创建一个线程“路飞”来真正去完成工作,也就是说实际上真正完成工作的是线程,进程是为线程工作提供了一定资源,图中类比为了一个房间

fd20369675ff4fd084370bfc4189f666.png

        这时我们就有两种方法来提高工作效率,第一种,系统在开辟一个“房间”,这时每个房间要吃的肉的数量就变少了,又因为每个进程的工作是独立且并行的,每个进程的工作量减少,总的工作效率也就提升了,这就是多进程编程的原理:

9449dc61005b42d08263fb923dd30199.png

        但是,创建一个新的“房间”的开销是很大的,所以,为了提高效率,我们可以在一个房间里放入多个“路飞”来完成工作,这些“路飞”在同一个“房间”工作,共用同一份资源,同时去吃桌上的肉,这样每个“路飞”所需要吃的肉大幅减少,又因为他们可以看作是同时去吃的,总的效率就能提升很多了,这便是多线程编程的原理:

ca085ed24a7d4776bdbde08e64d423b7.png

但是,只有靠近桌子的“路飞”才能吃上肉,桌子的大小是有限的(进程资源有限),随着“路飞”数量的增加,可能会有大量“路飞”(线程)靠近不了桌子(分配不到资源),从而无法进行工作,造成线程的闲置,这时,再一味地增加线程就不能够提高效率了,并且由于创建线程也是有开销的,此时过多的线程反而可能会降低运行效率。

46666263f2414fe3b8d862fe4a22fd82.png

因此,线程并不是越多越好的,在使用是一定要控制好线程数量


三、进程与线程区别与关系

1、进程包含线程

一个进程可以有一个线程或者多个线程,但不能没有线程

2、进程是系统资源分配的基本单位,线程是系统调度执行的基本单位

3、同一份进程中的线程共用一份系统资源(内存,硬盘,网络带宽等……)

内存资源就是代码中定义的变量与对象,多个线程是可以是可以共用同一份变量的

4、线程是当下实现并发编程的主流方式,通过多线程可以更好地利用多核CPU,但线程并不是越多越好的,线程数目达到一定量后,已经充分利用了多核CPU的性能,此时在一味地增加线程数量,不但无法提高运行效率,反而可能还会影响效率,因为线程调度也是需要消耗资源的。

5、多个线程之间可能会互相影响,一个线程抛出异常会影响其它线程的正常运行,这会导致各种线程安全问题

6、多个进程之间,一般不会互相影响,一个进程崩了也不会影响其它进程,也被称为“进程的隔离性”


总结

总之,比起以前写的程序,多线程编程的方法能更好地发挥多核CPU的性能,大幅提高运行效率,在将来工作中也是非常重要的。本篇文章我们主要简单介绍了进程与线程的关系与区别

那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

e1fd69ccbcb64f59b2aaed6be3f8695f.png

 

 

相关文章:

【多线程】初识进程和线程

💐个人主页:初晴~ 📚相关专栏:多线程 / javaEE初阶 前言 在我们之前编写的所有代码,都只能用上一个核心。众所周知,现在大多数CPU都有多个核心,但此时,无论如法优化程序&#xff0c…...

1DCNN-2DResNet并行故障诊断模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...

Java设计模式(原型模式)

定义 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 角色 Prototype(抽象原型角色) ConcretePrototype(具体原型角色) Client(客户端角色 优点 简化对象的创建过程&#xff0c…...

C/C++ 知识点:typedef 关键字

文章目录 一、typedef 关键字1、 基本用法2、常见用法2.1、为基本数据类型定义别名2.2、为结构体或联合体定义别名2.3、为指针类型定义别名2.4、为复杂模板类型定义别名 3、注意事项4、总结 前言: 在C(以及C语言)中,typedef 关键字…...

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🍑进程间通信🐬进程间通信目的 📚管道 📕管道的原理🐧用fork来共享管道原…...

小团队如何选需求管理软件?8款顶级推荐

本文将分享8款适合小团队的需求管理软件:PingCode、Worktile、Tapd、Teambition、禅道、Asana、Jama Connect、Aha!。 在小团队中管理需求时,寻找合适的软件工具常常让人头疼,不同的需求管理软件提供各种功能,但哪些功能真正适合…...

docker操作入门

1.创建镜像,使用当前文件 docker build -t experience . 2.运行容器 docker run -d -p 8501:8501 --name my-running-app my-python-api docker run -p 8508:8508 experience docker run -p 8508:8508 -p 8509:8509 experience 3.查看容器状态 docker ps docker p…...

简单的射箭小游戏网页源码

简单的射箭小游戏网页源码,对准靶心开启你的射击之旅吧 微信扫码免费获取源码...

Python | Leetcode Python题解之第331题验证二叉树的前序序列化

题目: 题解: class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0...

0x3 “护网行动”守之道

一、护网防守目标系统 二、护网防守之利器 通过安全流程控制、安全技术保障、安全工具支撑、安全能力提升四个层次全面构成安全防御体系。 安全技术名称解释 IPS(入侵防御系统)WAF(Web应用防火墙)IDS(入侵检测系统&a…...

白骑士的Matlab教学高级篇 3.1 高级编程技术

系列目录 上一篇:白骑士的Matlab教学进阶篇 2.5 Simulink 高级编程技术在MATLAB中扮演着至关重要的角色,帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...

haproxy简介与用法

一、负载均衡 1.1、概念: 负载均衡SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统…...

Geoscene Pro的三维

一、场景设置 1.3D视图分为全局场景和局部场景。在Geoscene Pro中,两个场景可以自由切换。 (1)全局场景有固定的坐标系GCS(WGS84、CGCS2000),并在全球比例尺下展示(全球范围)。可以…...

论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023

1. 论文背景 密集子图发现(Densest Subgraph Discovery)是图挖掘领域的一个基础研究方向,并且近年来在多个应用领域得到了广泛研究。特别是在生物学、金融学和社交网络分析等领域,密集子图的发现对理解复杂网络结构和行为具有重要…...

前端框架(三件套)

学习网站 HTML 系列教程&#xff08;有广告&#xff09; HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org)&#xff08;英文不太友好&#xff09; 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…...

MemoryCache 缓存 实用

MemoryCache 缓存 实用,相关逻辑代码里已详细注释&#xff0c; 在Java中创建一个单例模式&#xff08;Singleton Pattern&#xff09;的MyMemoryCache类&#xff0c;可以采用多种方法&#xff0c;其中最常见的是使用“饿汉式”和“懒汉式”&#xff08;线程安全和非线程安全&am…...

Java设计模式(命令模式)

定义 将一个请求封装为一个对象&#xff0c;从而让你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。 角色 抽象命令类&#xff08;Command&#xff09;&#xff1a;声明用于执行请求的execute方法&#xff0c;通…...

什么是 CI/CD?

什么是 CI/CD&#xff1f; CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发实践&#xff0c;旨在通过自动化的方式频繁地构建、测试和发布软件。CI/CD 可以显著提高软件交付的速度和质量&#xff0c;使团队能够更快地响应市场变化和…...

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

使用要求 1、用的是google里面的扩展打包成crx文件&#xff0c;所以在使用之前你需要确保自己电脑上有google浏览器&#xff0c;而且google浏览器版本需要在124之上。&#xff08;要注意一下&#xff0c;就是电脑只能有一个Chrome浏览器&#xff09; 2、在win10上用vscode开发…...

【苍穹外卖JAVA项目】第2天:新增员工

在EmployeeMapper.java中插入数据&#xff1a;一、新增员工 1.产品原型 2.接口设计 由于需要提交员工信息&#xff0c;用post请求方式&#xff0c;可以携带json数据 3.设计数据库的employee表 4.设计DTO 数据传输对象&#xff08;DTO&#xff09;&#xff1a;封装前端提交过…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...