(java)进程和线程的联系和区别

news2024/11/26 13:45:55

目录

进程 

1.进程具有独立性

————  虚拟地址空间

线程

 为什么要引入多个线程?

 多线程注意点

⁜⁜总结:线程和进程的区别和联系⁜⁜ 


 

进程 

1.进程具有独立性

首先介绍一下

————  虚拟地址空间

在这之前还要了解一下 —— “物理内存”

在早期的操作系统中,程序运行时分配的内存,就是 “物理内存”。

这个物理内存简单理解,就可以看成是一个宿舍楼,宿舍楼里有很多房间,每个房间占一个字节,且每个房间都有编号,这个编号就是“内存地址”。

那现在分配内存就直接从物理内存上分配,但是这时候就会出现问题

而操作系统需要给进程提供一个稳定的运行环境 ,上述的肯定不行。

所以操作系统就引入了 “ 虚拟地址空间 ” 的概念,  不直接分配物理内存了,而是分配一块虚拟的内存空间。操作系统对于内存又进行了一层抽象,如下图。

正是这样的机制,才带来了进程的独立性 。

进程是 资源分配 的基本单位。

(一个系统中可以有很多的进程,每个进程,都有自己的资源)

线程

在Java这样的生态中,不是很鼓励 多进程编程,更鼓励使用 多线程编程 

 为什么要引入多个线程?

为了实现 并发编程  ———— 当前的时代是一个 多核CPU的时代。

虽然多程 实现 并发编程,也是很不错的,但是,多程编程模式 太重了,效率不高,不管是创建,销毁,还是调度一个进程,消耗时间都比较多, 

总的来说,就是多进程 开销比较大,效率比较低。 (进程的开销主要是消耗在了申请资源上,进程是资源分配的基本单位

为了解决上述问题,我们就引入了 “线程(Thread)”。(也叫 “轻量级进程”)

创建,销毁,还是调度一个线程,都比进程要快。

但是线程是不能独立存在的,他必须依附于线程,进程包含线程 。

进程可以包含一个或多个线程。 也就是说,一个进程,最开始至少要包含一个线程,这个线程负责完成 执行代码的工作,也可以根据需要 创建更多的线程,来实现 "并发编程" 的效果。

每个线程都可以独立执行一些代码。 

实际情况,一个进程里有多个线程,而每个线程 ,都是可以独立进行调度的 ,每个线程也都有状态,优先级,上下文,记账信息......

一个进程可能使用一个PCB 或 多个PCB表示,每个PCB 对应到一个线程

上述结构决定了线程的特点

  1. 每个线程都可以 独立 在CPU上调度执行
  2. 同一个进程里的多个线程,共用同一份 内存空间 和 文件资源

所以创建线程的时候 不需要重新 申请资源 ,直接 复用 之前已经给 进程 分配好的资源。

这样就省去了 资源分配的开销,于是创建效率就高了。

画图捋一遍

得出 线程 是 调度执行 的基本单位。 

(一个进程中,可以有很多的线程,每一个 线程 都能 独立调度执行,共享 内存/硬盘 资源)

上述对于 多进程 多线程 的描述还是比较抽象的,那举一个生活上的例子 。

假如,就是现在有个院子,院子里有条生产线,现在产品销量比较好,老板想扩大一下规模,想多搞一条生产线,那现在就是有两个方案。  

方案一: 

在搞一个院子,那就有两条生产线了,但是再找一个院子,成本比较高。

方案二 :

 

在同一个院子里再搞一条生产线,是独立的,各自都能生产,但是这两个生产线共用一个院子,一组工人,一套物流体系,这样就节约了成本 还 提高了生产力 (资本家呀~)

方案一就使用了 多进程的方式 方案二就使用了 多线程的方式。

 多线程注意点

  1. 当到了一定程度时,再进一步增加线程数目时,效率无法进一步提升,反而会因为要调度     的线程数目太多,时调度的开销更大,反而会降低了效率。
  2. 当线程数目多了,可能就会产生一定的冲突,称为 "线程不安全问题" 。
  3. 如果一个线程抛出异常,没有被妥善处理(catch),就容易把整个进程都搞崩溃,那其他线程也就都没了。

⁜⁜总结:线程和进程的区别和联系⁜⁜ 

  1. 进程 可以包含一个或多个 线程
  2. 进程和线程都是用来实现 “并发编程” 场景的,但是线程比进程更轻量,更高效
  3. 在同一个进程里的线程,共用同一份资源(内存 和 硬盘),省去了申请资源的开销
  4. 进程具有独立性,一个进程挂了,不会影响到其他进程;同一个 进程 里的 线程,是可能会相互影响的 (线程安全问题 + 线程出现异常)
  5. 进程是资源分配的基本单位,线程是调度执行的基本单位。

╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯ 

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

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

相关文章

接口自动化测试攻略,必看!

为什么要做接口自动化 相对于UI自动化而言,接口自动化具有更大的价值。 为了优化转化路径或者提升用户体验,APP/web界面的按钮控件和布局几乎每个版本都会发生一次变化,导致自动化的代码频繁变更,没有起到减少工作量的效果。 而…

VS Code内存占用过高 - 解决方案

前言 使用VS Code时,其占用的内存可能会急剧增加,从而增加计算机内存的压力,下文介绍如何减少VS Code的内存占用。 通过此方案,本人从3G的内存占用降到了700M的内存占用。 解决方案 打开VS Code的设置,如下图&…

Keepalived(二)

实验一 KeepalivedLvsNginx 实现高可用集群,保证nginx服务正常运行 系统centos7 IP主机名作用192.168.28.141/24klmaster配置Keepalived(Master)、配置LVS,作为负载均衡器192.168.28.143/24klbackup配置Keepalived(…

数据分析 | 特征重要性分析 | 树模型、SHAP值法

前言 在分析特征重要性的时候,相关性分析和主成分分析往往是比较简单的方法,相关性分析是通过计算特征与目标变量之间的相关系数来评估特征的重要性。它可以告诉我们特征和目标变量之间的线性关系程度,但对于非线性关系就无能为力了&#xff…

微前端:重塑大型项目的前沿技术

引言 随着互联网技术的飞速发展,前端开发已经从简单的页面制作逐渐转变为复杂的应用开发。在这个过程中,传统的前端开发模式已经难以满足大型项目的需求。微前端作为一种新的前端架构模式,应运而生,它旨在解决大型项目中的前端开…

C语言基础语法——数据类型

数据类型介绍 数据类型:数据所属的类型 数据类型的作用:编译器预算数据分配的内存空间大小 变量 变量的语法 在计算机程序中,变量是用来存储数据的一个内存区域,并用一个名字来表示这个区域。 在程序运行过程中&#xff0…

Android事件分发

Android事件分发是指触摸屏幕的事件分发,在手指触摸屏幕后所产生的一系列事件中,典型的事件类型有如下几种: MotionEvent.ACTION_DOWN ——手指刚接触屏幕MotionEvent.ACTION_MOVE——手指在屏幕上面滑动MotionEvent.ACTION_UP——手指从屏幕上松开的一…

C语言每日一题 ----计算日期到天数转换(Day 2)

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C语言天天练 &#x…

m3u8 blob视频免费下载

F12点开找到这个视频url最后是.m3u8结尾 http://blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html 在上边的网址转Mp4下载即可

HBase集群环境搭建与测试

🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…

【第四阶段】kotlin语言的List创建与元素获取

1.list创建 val list listOf("jave","kotlin","c","c")2.list集合获取的三种方式 开发过程中尽量使用getOrElse()或者getOrNull,因为他可以防止崩溃取值 package Stage4fun main() {//list 创建val list listOf("jav…

m4s格式转换mp4

先安装 ffmpeg,具体从官网可以查到,https://ffmpeg.org,按流程走。 转换代码如下,可以任意选择格式导出 import subprocess import osdef merge_audio_video(input_audio_path, input_video_path, output_mp4_path):# 构建 FFmpe…

ViT论文Pytorch代码解读

ViT论文代码实现 论文地址:https://arxiv.org/abs/2010.11929 Pytorch代码地址:https://github.com/lucidrains/vit-pytorch ViT结构图 调用代码 import torch from vit_pytorch import ViTdef test():v ViT(image_size 256, patch_size 32, num_cl…

【第四阶段】kotlin语言可变list集合

1.可变list集合 完整写法 var list:MutableList<String> mutableListOf<String>("java","kotlin","c","c") 省略写法 var list mutableListOf("java","kotlin","c","c")fun ma…

CobaltStrike提权

攻击机&#xff1a;Kali Linux 靶 机&#xff1a;Windows 7 一、上线CS 复制命令&#xff0c;在靶机执行上线CS 2.安装插件&#xff0c;获取shell https://github.com/rsmudge/ElevateKit 上线CS 右击shell&#xff0c;选择插件 有七个模块可以利用&#xff0c;可以逐一…

C++实现YOLOP

C实现YOLOP 一、简介 使用OpenCV部署全景驾驶感知网络YOLOP&#xff0c;可同时处理交通目标检测、可驾驶区域分割、车道线检测&#xff0c;三项视觉感知任务&#xff0c;依然是包含C和Python两种版本的程序实现 onnx文件从百度云盘下载&#xff0c;链接&#xff1a;https://…

【AutoLayout案例07-如何通过代码添加约束 Objective-C语言】

一、那么,接下来,我们就给大家介绍一下,如何通过代码,来实现这个AutoLayout 1.咱们之前是不是都是通过,storyboard、来拖、拉、拽、的方式实现的吧 现在给大家介绍一下,如何通过代码,来实现 在继续介绍,如何通过代码,来实现AutoLayout之前呢, 我们先要给大家补充一…

基于Java+SpringBoot+Vue前后端分离疫苗发布和接种预约系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

前端开发之Element Plus的分页组件el-pagination显示英文转变为中文

前言 在使用element的时候分页提示语句是中文的到了element-plus中式英文的&#xff0c;本文讲解的就是怎样将英文转变为中文 效果图 解决方案 如果你的element-plus版本为2.2.29以下的 import { createApp } from vue import App from ./App.vue import ElementPlus from …

ruoyi-vue-plus 配置邮箱

ruoyi-vue-plus 配置邮箱 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请…