JUC-多线程

目录

进程

线程

线程的串行

区别

多线程


进程

  • 是指计算机中已执行的程序,曾经是分时系统的基本运作单位
  • 在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,是程序的基本执行实体
  • 在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本执行单位,而是线程的容器
  • 程序本身只是指令、数据及其组织形式的描述,相当于一个名词
  • 进程才是程序(那些指令和数据)的真正执行实例,可以想像说是现在进行式
  • 若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立执行
  • 所以是在操作系统中运行的一个应用程序
  • 比如同时打开QQ,WeChat;操作系统就会分别启动2个进程
  • 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
  • 在Windows中,可以通过任务管理器查看正在运行的进程

进程是一种抽象的概念,从来没有统一的标准定义看,一般由程序、数据集合和进程控制块三部分组成:

  • 程序用于描述进程要完成的功能,是控制进程执行的指令集
  • 数据集合是程序在执行时所需要的数据和工作区
  • 程序控制块,包含进程的描述信息和控制信息,是进程存在的唯一标志

线程

  • 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
  • 线程 也被称为 轻量级进程,是程序执行流程的最小单元
  • 一个标准的线程由 线程ID、当前指令指针PC、寄存器集合 和 堆栈 组成
  • 通常来说,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段、数据段、堆等)以及一些进程资源(如打开文件和信号)
  • 1个进程要想执行任务,必须得有线程(每1个进程至少要有1个线程)
  • 一个进程的所有任务都在线程中执行
  • 比如使用酷狗播放音乐,使用迅雷下载文件,都需要在线程中执行

线程的串行

  • 1个线程中任务的执行是串行的
  • 如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
  • 在同一时间内,1个线程只能执行1个任务
  • 比如在1个线程中下载3个文件(分别是文件A,文件B,文件C)

区别

  • 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
  • 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
  • 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
  • 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
  • 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程

举个例子:进程=火车,线程=车厢

  • 线程在进程下行进(单纯的车厢无法运行)
  • 一个进程可以包含多个线程(一辆火车可以有多个车厢)
  • 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
  • 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
  • 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
  • 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)

多线程

  • 1个进程中可以开启多个线程,所有线程可以并行(同时)执行不同的任务
  • 多线程技术可以提高程序的执行效率
  • 比如同时开启3个线程分别下载3个文件
  • 多线程的原理
  • 现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)执行的感觉
  • 即同一时间,CPU的1个核心只能处理1个线程
  • 多线程并发(同时)执行,其实是CPU快速地在多个线程之间调度(切换)
  • 如果CPU调度线程的速度足够快,就造成了多线程并发执行的假象
  • 同样的,使用多线程技术的操作系统或计算机体系结构,同样程序的平行线程,可在多CPU主机或网络上真正同时执行(在不同的CPU上)
  • 使用多线程的原因:
  • 某个操作可能会陷入长时间的等待,等待的线程会进入睡眠状态,无法继续执行
  • 多线程执行可以有效利用等待时间
  • 典型的例子是等待网络响应,这可能需要花费数秒甚至数十秒
  • 某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序和用户之间的交互就会中断
  • 多线程可以让一个线程负责交互,另一个负责计算
  • 程序逻辑本身就要求兵法操作,例如一个多任务下载软件
  • 多CPU或者多核计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面发挥计算机的全部计算性能
  • 相对于多进程应用,多线程在数据共享方面的效率要高很多

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

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

相关文章

【网络建设与运维】2024年河北省职业院校技能大赛中职组“网络建设与运维”赛项规程

培训、环境、资料、考证 公众号:Geek极安云科 网络安全群:775454947 网络系统管理群:223627079 网络建设与运维群:870959784 极安云科专注于技能提升,赋能 2024年广东省高校的技能提升,在培训中我们的应急…

OSCP靶场--Crane

OSCP靶场–Crane 考点(CVE-2022-23940sudo service提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.146 -sC -sV --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 08:07 EDT Nmap scan report for 192.16…

Java 算法和数据结构 答案整理,最新面试题

Java中如何使用动态规划求解背包问题? 1、定义子问题: 首先确定动态规划状态,通常以物品数量和背包容量为变量定义子问题,例如dp[i][j]表示前i件物品放入容量为j的背包所能获得的最大价值。 2、确定状态转移方程: 基…

手撕算法-盛最多水的容器

描述 分析 两个板之间能盛下的水的量,取决于短板。想让两个板之间能盛下更多的水,需要改变短板的长度。就像水桶效应:那么用两个指针指向容器的两个板,然后每次移动较短的板即可。移动较短的板,可能会增大容积&#x…

计算机网络常见题(持续更新中~)

1 描述一下HTTP和HTTPS的区别 2 Cookie和Session有什么区别 3 如果没有Cookie,Session还能进行身份验证吗? 4 BOI,NIO,AIO分别是什么 5 Netty的线程模型是怎么样的 6 Netty是什么?和Tomcat有什么区别,特点是什么? 7 TCP的三次…

解决 cv2.imread读取带中文路径图片问题

http://t.csdnimg.cn/i8CXn 1.问题: # 中草药数据集样本可视化展示 import cv2 import matplotlib.pyplot as plt %matplotlib inline plt.title("heshouwu") plt.imshow(cv2.imread(r"D:\home\aistudio\data1\archive\train\何首乌\heshouwu_0001.…

[C语言]结构体、位段、枚举常量、联合体

目录 结构体 结构体的使用方法 结构体所占用的大小 位段 位段的使用方法 位段所占用的大小 枚举常量 枚举常量的使用方法 枚举常量的优势 联合体 联合体的使用方法 结构体 结构体的使用方法 结构体是一些值的集合,我们可以定义一个结构体,里…

数据结构入门框架

博主b站入口:Uncertanity的个人空间 参考资料: 《大话数据结构》程杰 《数据结构C语言(第二版)》严蔚敏

为什么静态成员函数不能是虚函数

在面向对象编程中,静态成员函数和虚函数都是常见的概念,但它们之间存在着本质上的差异。由于其特性上的差异,静态成员函数不能声明为虚函数。下面我们来探讨一下为什么静态成员函数不能是虚函数。 我在网上查到最多的说法是静态函数没有this指…

【OpenModelica】1 OpenModelica项目架构

1 OpenModelica项目架构 文章目录 1 OpenModelica项目架构一、 架构总览图二、OpenModelica各部分作用 一、 架构总览图 OpenModelica 环境由几个相互连接的子系统组成,如图 1.1 所示。 其中包括: MDT Eclipse 插件图形模型编辑器/浏览器文本模型编辑器…

开始喜欢上了runnergo,JMeter out了?

RunnerGo是一款基于Go语言、国产自研的测试平台。它支持高并发、分布式性能测试。和JMeter不一样的是,它采用了B/S架构,更灵活、更方便。而且,除了API测试和性能测试,RunnerGo还加上了UI测试和项目管理等实用功能,让测…

代码随想录day30(2)回溯:组合(leetcode77)

题目要求:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 思路:首先定义两个变量,一个存放符合条件的单一结果,另一个存放符合条件结果的集合,for循环用来横向遍历,递归用来纵…

C语言例4-6:格式字符d的使用例子

代码如下&#xff1a; //格式字符d的使用例子 #include<stdio.h> int main(void) {int num1123;long num2123456;printf("num1%d,num1%5d,num1%-5d,num1%2d\n",num1,num1,num1,num1);//以四种不同格式&#xff0c;输出int型数据num1的值printf("num2%ld,…

基于Spring Boot网络相册设计与实现

摘 要 网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&am…

用BI来做金蝶的数据分析,真能随时自助分析?

BI数据分析快的事&#xff0c;大家都知道&#xff0c;那用BI来分析金蝶ERP上的数据也很快&#xff0c;也能随时想怎么分析就怎么分析&#xff0c;想分析哪些数据就分析哪些数据吗&#xff1f; 用BI分析金蝶数据&#xff0c;不仅可随时自助分析&#xff0c;还可极大提高分析效率…

《数据安全技术 数据分类分级规则》及典型行业标准指南要点提炼

数据分类分级发布新国标 千呼万唤&#xff0c;国家标准GB/T 43697-2024《数据安全技术 数据分类分级规则》于3月21日正式发布。作为全国网络安全标准化技术委员会更名后&#xff0c;发布的第一部以“数据安全技术”命名的国家标准&#xff0c;《数据安全技术 数据分类分级规则…

PTA L2-031 深入虎穴 dfs与bfs版

著名的王牌间谍 007 需要执行一次任务&#xff0c;获取敌方的机密情报。已知情报藏在一个地下迷宫里&#xff0c;迷宫只有一个入口&#xff0c;里面有很多条通路&#xff0c;每条路通向一扇门。每一扇门背后或者是一个房间&#xff0c;或者又有很多条路&#xff0c;同样是每条路…

Python库xarray:强大的多维数据处理工具

Python库xarray&#xff1a;强大的多维数据处理工具 在数据科学和科学计算领域&#xff0c;处理多维数据是一项常见而重要的任务。Python库xarray是一个功能强大的工具&#xff0c;专门用于处理、分析和可视化多维数据集。本文将深入介绍xarray库的特性、用法和优势&#xff0c…

babel起手式

Babel7 以下是各个 ECMAScript 版本引入的一些主要新语法和功能的汇总 ES5 / ECMAScript 5&#xff08;2009年&#xff09; 严格模式 "use strict"。JSON 对象。Array.prototype.forEach()、Array.prototype.map()、Array.prototype.filter()、Array.prototype.redu…

这回轮到鸿蒙禁用安卓了!!!

1月18日&#xff0c;鸿蒙生态千帆仪式上&#xff0c;华为正式宣布了HarmonyOS NEXT&#xff08;下简称鸿蒙星河版或纯血鸿蒙&#xff09;开发者预览已向开发者开放申请&#xff0c;纯血鸿蒙开始走向普及阶段。伴随着不再兼容安卓的纯血鸿蒙铺开&#xff0c;鸿蒙走进了运营属于自…