线程和进程的区别和联系

一、什么是进程

进程(Process), 是一个具有独立功能的程序关于某个数据集合的一次运行活动,是系统进行 【资源分配和调度】 的一个独立单位。

  • 进程是【程序】的【一次执行】(是计算机中程序的执行过程,而不是计算机中的程序)
  • 进程是系统进行【资源分配和调度】的一个【基本】单位。

二、进程的特征

  • 动态性:由创建而生,由撤销而亡
  • 并发性:多个进行同时运行
  • 独立性:独立资源分配
  • 异步性:相互独立、互不干扰

三、什么是线程

  • 一个线程就是一个指令流,将指令集合中的一条条的指令以一定的顺序交给CPU去执行。
  • 线程指的是进程中一个单一顺序的控制流。
  • 线程是进程中真正执行任务的基本单位。
    线程是操作系统进行运算调度的最小单元,它是进程的子任务,用于保证程序的实时性,实现进程内部的并发,它不能独立拥有系统资源,但它可与同属一个进程的其他线程共享该进程所拥有的全部资源。

四、线程和栈的关系

对于学过JVM的同学来说,我们java要执行的指令都是放在虚拟机栈当中,通过指令的入栈出栈来实现程序的执行。
而线程是一个指令流,将栈当中的指令一定的顺序交给CPU去执行,是线程的执行过程。
在这里插入图片描述

五、线程和进程的关系

在这里插入图片描述

六、用代码去理解线程和进行

1.了解单线程

//首先我们新建一个类ThreadNew
public class ThreadNew {private int flag;public ThreadNew(int flag){this.flag = flag;}public void run(){if(flag == 1){for (int i= 0;i<1000000;i++){System.out.println("执行任务1");}}else {for (int i= 0;i<1000000;i++){System.out.println("执行任务2");}}}
}
public static void main(String[] args) {ThreadNew t1 = new ThreadNew(1);ThreadNew t2 = new ThreadNew(2);t1.run();t2.run();System.out.println("我是主方法,我是来测试顺序的");
}

输出:
我们的输出是首先输出“执行任务1”,输出完毕之后;其次执行“执行任务2”,输出完毕之后;最后输出“我是主方法,我是来测试顺序的”。

这样输出的原因在于我们的程序,main方法首先入栈,main()当中的程序依次执行,首先创建t1和t2两个对象。之后t1对象调用自己的run()方法入栈,根据条件执行flag=1的for循环,执行完毕以后,t1对象的run()方法出栈。t2对象的run()方法入栈,根据条件执行flag=2的for循环,执行完毕以后,t2对象的run()方法出栈,之后执行main方法当中的System.out.println(“我是主方法,我是来测试顺序的”);

在这里插入图片描述

2.多线程

在这里插入图片描述
在这里插入图片描述
从输出效果上来看我们发现线程的输出的交替执行,这是因为随着内核当中的时间片的轮转,我们需要将数据不断的写会内存,写会内存的过程当中总会有线程占据总线,这样就导致了数据的来回切换。
同时我们还需要注意到,main方法当中有一个输出,这个竟然是第一个输出出来的。这说明:线程之间是相互独立的,谁也不会等待谁先执行完毕
在这里插入图片描述

七、为什么要引入线程

引入线程的主要目的是为了提高程序的并发性
例如我们想要实现一个文件输入的功能,如果用多进程去做,我们需要实现2个进程,一个用来响应鼠标、键盘的交互线程,一个用来运算数据。为使程序能并发执行,系统必须对进程进行以下的一系列操作:创建进程、撤销进程以及进程间切换。据此可知,由于进程是一个资源的拥有者,因而在创建、撤消和切换中,系统必须为之付出较大的时空开销,从而限制了并发程度的进一步提高。

但是如果我们用线程去实现,那么我们就可以将文件输入的功能交给一个进程去实现,同时该进程内部可以有2个线程,一个用来响应鼠标、键盘的交互线程,一个用来运算。由于线程之间共享内存同时线程也比进程更加轻量化,那么导致进程这个资源的拥有者不至于被频繁的创建、撤消和切换。同时即便是要进行切换,那么线程的切换导致的系统开销比进程的切换更小,从而能大大提示程序的并发性。

八、进程和线程的区别

1.从属关系: 进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。线程不能独立于进程而存在。
2.描述侧重点: 进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
3.共享资源: 多个进程间不能共享资源,而多个线程可以共享同一进程资源文件(堆和方法区)。
4.操纵者: 一般情况下进程的操作者是操作系统,而线程的操作者是编程人员。
5.上下文切换: 线程上下文切换速度比进程的上下文切换速度更快。

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

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

相关文章

单调栈,LeetCode 1793. 好子数组的最大分数

一、题目 1、题目描述 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i1], ..., nums[j]) * (j - i 1) 。一个 好 子数组的两个端点下标需要满足 i < k < j 。 请你返回 好 子数组…

[LeetBook]【学习日记】排序算法——归并排序

主要思想 归并排序是一种分治算法&#xff0c;其排序过程包括分和治分是指将要排序的序列一分为二、二分为四&#xff0c;直到单个序列中只有一个数治是指在分完后&#xff0c;将每两个元素重新组合&#xff0c;四合为二、二合为一&#xff0c;最终完成排序 图片作者&#xf…

Gitlab部署及使用

1. 简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。Gitlab是目前被广泛使用的基于 git 的开源代码管理平台&#xff0c;基于Ruby on Rails构建&#xff0c;主要针对软件开发过程中产生的代码…

taro之Picker,PickerView基础用法

1.Picker 直接上代码 import Taro,{Component} from "tarojs/taro"; import {View,Picker} from tarojs/components import { AtIcon } from taro-ui import { putKey } from /src/utils/storage-utilsclass AgriculturePolicy extends Component{constructor (prop…

MySQL的锁的类型

乐观锁与悲观锁&#xff1a; 乐观锁&#xff08;Optimistic Lock&#xff09;通常不直接锁定数据&#xff0c;而是在更新时检查数据是否已被其他事务修改。如果发现冲突&#xff0c;则放弃本次操作或重试。 悲观锁&#xff08;Pessimistic Lock&#xff09;则是在操作数据之前…

out.as_ptr() as *mut libc::c_char

out.as_ptr() as *mut libc::c_char,这段代码出现在 Rust 语言中&#xff0c;用于将 Rust 字符串类型 (String 或 Vec<u8> 等) 的内部缓冲区指针转换为 C 样式字符串&#xff08;以空字符 ‘\0’ 结尾&#xff09;的可变指针。 out&#xff1a;通常是一个具有内部缓冲区的…

Uni App中去掉访问路径中的#

要启用HTML5历史路由模式&#xff0c;你需要&#xff1a; 确保你的服务器支持HTML5历史API。这意味着服务器应该能够处理在没有#的情况下路由的请求。 在Uni App项目中配置路由模式为history。 在Uni App项目中&#xff0c;你可以在manifest.json文件中配置路由模式。找到&quo…

基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1车辆路径问题&#xff08;Vehicle Routing Problem, VRP&#xff09;概述 4.2 禁忌搜索算法&#xff08;Tabu Search, TS&#xff09;原理 5.完整程序 1.程序功能描述 基于禁忌搜索算法…

Learning to summarize from human feedback

Abstract 人工参考总结以及 ROUGE 指标只是我们真实关心的目标(总结质量)的粗略代表。通过优化人工偏好来显著提升总结质量使用大量高质量的人类比较来训练一个模型来预测人类偏好的总结使用这个模型作为奖励函数对总结策略进行强化学习微调我们模型的效果在 TL;DR 数据集上显…

Spring的炼气之路(炼气三层)

目录 一、容器的介绍 1.1 创建容器 1.1.1 类路径下的XML配置文件 1.1.2 文件系统下的XML配置文件 1.2 获取bean 1.2.1 使用baen名称获取 1.2.2 使用bean名称指定类型 1.2.3 使用bean类型获取 二、注解开发 1.1 注解开发bean 1.2 纯注解开发 三、注解开发之bean的…

漫谈微服务网关

一、什么是服务网关 服务网关 路由转发 过滤器 1、路由转发&#xff1a;接收一切外界请求&#xff0c;转发到后端的微服务上去&#xff1b; 2、过滤器&#xff1a;在服务网关中可以完成一系列的横切功能&#xff0c;例如权限校验、限流以及监控等&#xff0c;这些都可以通过…

【Linux】Linux开发工具-vim / 编译器-gcc/g++ / 调试器-gdb / git操作 / 项目自动化构建工具-make/Makefile

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.在Linux写自己的第一个程序 1.1 nano指令 1.2 nano指令的使用 1.2.1 介绍 1.2.2 演示 1.2.2.1 创建.c文件 1.2.2.2 nano cod…

Java后端八股------设计模式

Coffee可以设计成接口。 b

EPSON XV4001BC陀螺仪传感器汽车导航系统的应用

近年来为了提高汽车应用系统的可靠性,传感器融合系统被越来越多的应用到汽车领域,如汽车导航系统中的行人检测和预碰撞警告等,通过提供精准的导航信息,为驾驶员提供更安全,更稳定,更舒适的出行体验,例如在行人检测系统中,只使用低成本的红外传感器不能检测到行人的实际位置,而利…

python 八大排序算法

1、选择排序 选择排序是一种简单直观的排序算法&#xff0c;其工作原理是在未排序序列中找到最小&#xff08;或最大&#xff09;的元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后继续寻找剩余未排序序列中的最小&#xff08;或最大&#xff09;元素&#xff0c;放…

LangChain + Qwen(DashScope)

文章目录 引言DashScope API KEY关于 DashScope 和 ModelScope 代码可用模型及费用模型说明计费单价免费额度 引言 常见的 RAG 示例&#xff0c;一般使用 OpenAI&#xff0c;你也可以使用 Qwen 作为 LLM。 在 LangChain 中&#xff0c;调用 Tongyi 来实现。&#xff08;而不是…

本地gitlab-runner的创建与注册

引言 之前通过一些方式在本地创建runner&#xff0c;时而会出现一些未知的坑&#xff0c;所以写下本文记录runner可以无坑创建的方式。 以下注册runner到相应仓库的前提是已经在本地安装了gitlab-runner 具体安装方式见官网 本地gitlab-runner安装常用的指令 查看gitlab r…

5G网络架构及技术(一):入门级介绍

参考资料&#xff1a; [1] 5G网络架构&#xff0c;March 15, 2020 / By Adnan Ghayas [2] 5G应用场景&#xff0c;June 2, 2021 / By Adnan Ghayas [3] 独立和非独立5G网络&#xff0c;September 19, 2020 / By Adnan Ghayas 5G网络架构&#xff08;一&#xff09;&#xff1a;…

Android14音频进阶:AudioFlinger究竟如何混音?(六十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

高效的Gitlab Flow最佳实践

文章目录 一、git flow二、github flow三、gitlab flow四、基于gitlab flow的最佳实践1.语义化版本号2.测试发布3.bug修复 参考 业界包含三种flow&#xff1a; Git flowGithub flowGitlab flow 三种工作流程&#xff0c;有一个共同点&#xff1a;都采用"功能驱动式开发&…