多线程—进程与线程

1 进程

1.1 进程概念

        进程:操作系统提供的一种抽象,当程序在运行时,好像计算机的所有硬件资源都在为其服务。换言之,进程就是程序的一次运行过程。进程是操作系统分配资源的基本单位。

        注意:区分进程和程序(可执行文件)

        程序即可执行文件,是静态的,存储在磁盘中。

        打开任务管理器,在进程界面显示的是一个个正在运行的程序,即进程,也就是说进程是动态的,当可执行文件被加载到内存中,并开始执行程序的代码,就形成了进程。

1.2 进程控制块PCB

        PCB:进程控制块,内部包含pid(进程唯一标识)、进程关联的程序基本信息(程序信息、内存指针等)、进程分配资源信息、进程调度信息。每一个PCB对象,表示一个进程,也就是一个运行的程序。

        在PCB中,包含一个文件描述符表(进程打开(fopen)了哪些文件),文件描述符表可以理解为一个顺序表,下标索引就是文件描述符,索引对应的内容就是对应的文件。

        进程的调度信息包含:进程优先级、进程状态(就绪、阻塞等等)、进程记账信息(每次在CPU的执行时间,方便操作系统调度策略的调整)和进程上下文(进程在执行过程中可能随时被调度离开,此时需要保存进程的上下文,也就是“存档”,便于下次执行时“读档”)。

1.3 进程虚拟地址

        在操作系统中,我们不希望一个进程的运行状态影响到另一个进程,因此就需要进程具有“隔离性”,进程的虚拟地址空间是保证进程“隔离性”的重要原因。

        如果没有虚拟地址空间,进程在对内存指针进行访问时,有可能出现指针指向错误地址的问题,那么就有可能出现进程1访问到进程2的数据,导致操作系统的不稳定。

        通过引入虚拟地址空间,每一个进程的虚拟地址空间相互独立,比如进程1的代码中访问到变量a,进程2的代码中也访问到变量a,但是这两个变量a的值不同,其在各自虚拟地址空间的地址相同,通过MMU(内存管理单元,通常集成在CPU上)来对虚拟地址进行映射,就可以访问到不同的所需数据,实现了进程的“隔离性”。

        注意:如果多个进程同时执行,那虚拟内存的总和大于真实内存怎么办?1.实际上,同时执行的进程一般不会很多。2.即使多个进程同时执行,但是也不是同时把所有虚拟地址空间全部占满。3.极端情况下,出现多个进程都占用了很大的内存,那么就换电脑(内存更大的)。这种情况一般都算bug,需要程序员优化程序,想办法让其占用更少的内存空间。

1.4 进程间通信

        只让进程具有“隔离性”并不能满足所有的任务,比如在打微信电话,不仅需要微信程序,还需要摄像程序,这就涉及到进程间的通信。进程间通信包括:管道、共享内存、文件、信号、信号量和网络等方式。其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。

2 线程

2.1 线程的必要性

        一个CPU有多个核,让一个CPU只执行一个任务,仅使用了一个核,也就是CPU使用率极低,浪费了硬件资源,因此我们希望让CPU同时执行多个任务,也就是并发编程。

        多进程可以实现并发编程,但是有些场景会频繁的创建/销毁进程,这就非常消耗时间(分配资源是个耗时的行为),为了提高并发编程的效率,就引入了线程。

2.2 线程

        线程:一个执行流,又叫轻量级进程(线程的创建、调度和销毁比进程效率更高),同一个进程包含多个线程,每个线程对应自己的PCB,这里称为TCB(这是操作系统原理的概念,Linux没有TCB,对线程和进程都是用PCB),作用与PCB类似。同一个进程内的多个线程共享同一个进程分配的系统资源。操作系统调度以线程为最小单位。

        注意:线程是不是越多越好?由于并发编程往往会利用多线程,多个线程的执行需要多个CPU核心,因此当线程的数量高于CPU核心数,此时再增加线程的数量不会提高任务的执行速度,反而有可能拖累总任务,因为创建销毁线程也需要开销。

2.3 进程和线程的区别

        1.进程是系统进行资源分配的最小单位,线程是系统调度的最小单位。

        2.进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈。

        3.由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信。

        4.线程的创建、切换及终止效率更高。

        5.多个进程同时执行,如果某一个进程出错崩溃,其他进程不受影响。同一个进程的多个线程同时执行,如果某一个线程出错崩溃,很可能导致进程也崩溃,从而导致其中的所有线程都崩溃。

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

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

相关文章

[原创](Modern C++)现代C++的关键性概念: 灵活多变的绑定: std::bind

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …

ssm框架之mybatis框架动态SQL

1 mybatis动态sql mybatis可以通过各种各样的标签在sql映射文件中实现如下功能 1、语句的动态拼接 2、前后缀格式处理 3、复杂参数处理 常用标签如下: 1.1 if标签 如下示例,当有一个入参为null或者空的时候的时候,不参与计算,…

Spring Boot 事务详解

Spring Boot 事务详解 引言 在现代应用程序中,事务管理是确保数据一致性和完整性的重要机制。Spring Boot 提供了强大的事务管理功能,使得开发者可以轻松地定义和管理事务。本文将详细介绍 Spring Boot 中的事务管理,包括事务传播行为、事务…

poetry使用

1.初始化 package name 填入口文件名 poetry init2.在本目录下虚拟 poetry config virtualenvs.in-project true 3.自动生成依赖文件和vent虚拟环境,管理本项目下载包 poetry add flask pandas numpy 4 4.下载依赖 poetry install 5.查看都安装了什么包 poe…

Git 新建本地分支并关联到远程仓库

文章目录 1、方法一2、方法二 1、方法一 A、新建本地分支: git checkout -b new-branch-nameB、push新分支到远程仓库: git push origin newBranchC、本地分支关联到远程(选一个即可): git branch --set…

一条SQL在mysql数据库中经历的过程

SQL语句在MySQL数据库中普遍经历的过程如下: 客户端发起查询请求到MySQL数据库服务器监听端口; MySQL数据库server端接收到请求; server端从已有的连接池或者新建一个线程,用来处理客户端发起的请求; server层…

Compose 的产生和原理

引言 compose 出现的目的: 重新定义android 上ui 的编写方式。为了提高android 原生ui开发效率。让android 的UI开发方式跟上时代。 正文 compose 是什么? 就是一套ui框架 和flutter 一样是一套ui框架 Flutter:跨平台开发趋势与企业应用的…

【计算机网络】一二章

一 二 非常棒的例子 相同的传播时延,带宽越大,该链路上所能容纳的比特数越多 相同的传播时延,带宽越大,该链路上所能容纳的比特数越多 往返时间(Round-Trip Time,RTT)s是指从发送端发送数据分组…

微软OneNote无法同步解决方案

目录 前言原因UWP特性 解决方案C***h注册表 参考链接 前言 假设有多台Windows电脑,最方便且免费的多设备笔记同步方案就是微软自家的OneNote,使用OneDrive自带的5G云存储。 但是在国内大陆的OneNote,经常会出现无法同步、同步失败&#xff1…

《商业智能(BI)的演进:从数据仓库到智能决策》

01、什么是商业智能BI? 商业智能BI - 派可数据商业智能BI可视化分析平台 首先要了解什么是商业智能BI( Business Intelligence )?百度商业智能BI有很多很多官方的定义,各种解释,实际上从这么多年的经验出发…

云钥科技工业相机定制服务,助力企业实现智能智造

在工业自动化、智能制造和机器视觉快速发展的今天,工业相机作为核心感知设备,其性能直接决定了检测精度、生产效率和产品质量。然而,标准化工业相机往往难以满足复杂多样的应用场景需求,‌工业相机定制‌逐渐成为企业突破技术瓶颈…

LeetCode[19]删除链表的倒数第N个节点

思路: 要想一次循环,一趟遍历完,那肯定是要想到双指针了,但是双指针怎么做呢?题目给出删除倒数第N个,我们如果能找到倒数第N个节点的前一个节点就行了,倒数第N个肯定是倒着数,那我们…

API调用大模型推理与第三方API实现业务整合

基于Python实现大模型推理与第三方API调用的集成,需要结合Function Call机制与提示词工程。 一、技术架构设计 双阶段流程 推理阶段:大模型解析用户意图,生成结构化API调用指令执行阶段:Python代码解析指令并触发第三方API # 示例…

Java面试:集合框架体系

一、ArrayList 1.数组(Array) 是一种用连续的内存空间存储相同数据类型数据的线性数据结构 数组如何获取其他元素的地址值? 寻址公式:a[i] baseAddress i * dataTypeSize baseAddress:数组的首地址dataTypeSize&am…

麒麟v10 ARM64架构系统升级mysql数据库从mysql-5.7.27到mysql-8.4.4图文教程

1、背景与问题说明 因mysql-5.2.27版本存在安全漏洞问题,为保障系统安全,需将处于生产环境的麒麟v10 ARM64架构系统服务器上当前部署的mysql-5.7.27版本升级到mysql-8.4.4,以规避潜在风险,提升系统整体的安全性和稳定性。 1.1 本…

Android多线程通信机制

目录 ​引言 ​一、Android多线程通信的核心机制 ​1. Handler Looper MessageQueue ​2. AsyncTask(已过时,但仍有参考价值)​ ​3. HandlerThread与IntentService ​4. 线程池(ThreadPoolExecutor)​ ​5. …

使用 VLOOKUP 和条件格式在 Excel 中查找并标红匹配的串号

使用 VLOOKUP 和条件格式在 Excel 中查找并标红匹配的串号 你的步骤非常详细且清晰,能够帮助用户在 Excel 中通过 VLOOKUP 和条件格式来查找并标红匹配的串号。以下是对你提供的步骤的简要总结和补充说明: 1. 添加“是否匹配”列 在 a.xlsx 中新增一列…

Spring Boot 集成高德地图电子围栏

摘要:本文手把手教你通过 Spring Boot 调用高德地图 API 实现电子围栏功能,涵盖云端围栏创建、设备位置监控与本地算法校验,附带完整代码和避坑经验! 一、电子围栏核心原理 1.1 什么是电子围栏? 虚拟地理边界&#x…

hadoop伪分布式搭建--启动过程中如果发现某个datanode出现问题,如何处理?

一、问题定位&#xff1a; &#xff08;1&#xff09;检查DataNode日志&#xff1a; DataNode日志通常位于$HADOOP_HOME/logs/或/var/log/hadoop-hdfs/目录下&#xff0c;文件名为hadoop-hdfs-datanode-<hostname>.log。重点关注以下错误类型&#xff1a; ——Incompa…

微软开源神器OmniParser V2.0 介绍

微软开源的OmniParser V2.0是一款基于纯视觉技术的GUI智能体解析工具&#xff0c;旨在将用户界面&#xff08;UI&#xff09;截图转换为结构化数据&#xff0c;从而实现对计算机屏幕上的可交互元素的高效识别和操控。这一工具通过结合先进的视觉解析技术和大型语言模型&#xf…