图解进程线程、互斥锁与信号量-看完不懂你来打我

2023-05-16

在上学的时候,老师讲到进程与线程的时候可能是这样讲的:

  • 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单元,是应用程序运行的载体。
  • 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。

 

图解进程线程、互斥锁与信号量-看完不懂你来打我

 

那个时候为了考试我都背下来了,但是心里想说:what?这都是些什么东西? 下面让我来试着用更通俗的语言来给你说说进程、线程、互斥锁、信号量的那些事。

一、房子与居住者

我们可以将自己平时住的房子类比为一个进程,每一个房间及其占用者比喻为一个线程。房子本身并不会做任何的事情,但是线程是房子里面每一个活跃的人,他们平时洗衣、做饭、看电视……,就像线程执行自己的代码一样在运行着。

图解进程线程、互斥锁与信号量-看完不懂你来打我

 

单线程 单线程就是一个叫做“进程”的房子里面,只住了你一个人,你可以在这个房子里面任何时间去做任何的事情。你是看电视、还是玩电脑,全都有你自己说的算。想干什么干什么,想什么时间做什么就什么时间做什么。

多线程 但是如果你处在一个“多人”的房子里面,每个房子里面都有叫做“线程”的住户:线程1、线程2、线程3、线程4,情况就不得不发生变化了。假如这些线程是你的老婆、孩子、父母。

  • 父母老人午睡的时候你不能开音响
  • 老婆要看“甄嬛传”,你就不能看球赛
  • 孩子没睡觉,你就别想看书
  • ……

多线程出现这些问题的根本原因在于”共享资源“:时间、电视、厕所、厨房……等等。那我们下面来看看,如何处理协调使用这些"共享资源"?

二、锁(互斥锁)

在多线程编程中有”锁”的概念,在你的房子里面也有锁。如果你的老婆在上厕所并锁上门,她就是在独享这个“房子(进程)”里面的公共资源“卫生间”,如果你的家里只有这一个卫生间,你作为另外一个线程就只能先等待。

图解进程线程、互斥锁与信号量-看完不懂你来打我

 

线程对锁的占用是有优先级的,就像在你的家里也有优先级。当你家只有一个卫生间的时候,孩子、老婆、你同时要去上厕所,通常来说 你的优先级是1,你老婆的优先级是100,你孩子的优先级是255。需要说明的是:数值越小优先级越低。但是不同的情况下会有不同的优先级调度算法,关键核心因子是优先级设置与等待时间,如果你确实等待了很长时间,老婆孩子可能看你快憋不住了,让你先去使用洗手间也是可以的。

三、信号量

现在让我们从卫生间走入厨房,首先我们要明确的一点是:厨房里面可以有一个人,也可以有多个人。 那我们怎么控制使用“厨房”这个公共资源的人数(线程数)?一个比较好的方法就是使用信号量。

图解进程线程、互斥锁与信号量-看完不懂你来打我

 

“信号量”在编程术语中使用单词semaphore,那什么是“信号量”?信号量就好比你家厨房入口架子上摆了三把锅:

  • 如果你的孩子热奶拿走一把,你的老婆热汤拿走一把,你的妈妈做菜拿走一把,你想煮面条就没有锅了。当你看到这种情况,你就不会进入厨房了,也就说厨房按照“锅的数量”作为信号量,只能容纳三个人(线程)。
  • 当你的老婆热完汤之后,把锅重新放回架子上,你就可以去获得一个锅,你就可以进入厨房了。

所以说:当信号量总数为1的时候,也就是你家只有一把锅,此时信号量作用就等同于互斥锁。

四、专业点好么

来一张专业点的图,别让您误会我是讲故事的。讲技术,我可是认真的!

图解进程线程、互斥锁与信号量-看完不懂你来打我

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图解进程线程、互斥锁与信号量-看完不懂你来打我 的相关文章

  • Linux系统常用命令总结

    目录 基本常用命令 xff1a 关机重启命令 xff1a 防火墙相关命令 xff1a 针对于CentOS7系统 重定向和追加 xff1a 打包压缩命令 xff1a vi vim编辑器 xff1a 软件包安装命令 xff1a 文件权限设置 x
  • ROS入门级教程

    目录 前言 一 ROS简介与安装 二 ROS文件系统 三 ROS核心概念 1 节点 2 话题 3 通讯机制 四 ROS的编译与简单使用 五 调试工具 1 Rviz和Gazebo 2 rqt工具 3 rosbag 六 常用指令 1 常用的文件
  • Springboot 框架

    SpringBoot 1 用来简化 spring 初始搭建和开发过程使用特定的方式进行配置 properties 或者 yml 文 件 2 创建独立的 spring 引用程序 main 方法运行 3 嵌入 Tomcat 无需部署 war 包
  • 新建github分支

    新建github分支 xff0c 可以 直接在github仓库上创建 或者 通过git命令创建 这里以 在main分支下创建test分支 为例 方法一 xff1a 直接在github仓库上创建分支 1 进入相应的仓库 xff0c 点击 Sw
  • Linux应用层开发(文件、多线程,多进程、进程间通信)

    文件IO编程 linux 下 切皆 件 xff0c 我们操作外设 标 键盘 磁盘等外设 就像操作 件 样 要如何操作 件与外设 xff0c 就必须熟练掌握 件IO input 写 output读 1 多文件编程 多 件编程 xff1a 把
  • VINS-MONO运行TUM VIO数据集真实轨迹问题处理

    小loser第一次写记录 xff0c 再次记录一下测试TUM VIO数据集碰到的问题及处理 VINS本身输出的数据需要进行格式转换才能用 xff0c 输出文件修改参考这个博客 Ubuntu 18 04 VINS Mono运行与EVO的评测与
  • 对线程和进程的理解

    进程和线程的区别 进程 xff1a 是指运行后的程序 xff0c 是操作系统分配系统资源 xff08 内存空间 CPU xff09 的最小单位 线程 xff1a 每个进程由一个或者多个进程组成 xff0c 线程是CPU进行分配和调度的最小单
  • 【永久解决】Matlab帮助文档设置语言为中文(可以解决预设窗口中无语言设置的情况)中文帮助文档

    问题描述 Matlab帮助文档在试用一段时间后 xff0c 由中文版本变成了英文版本 xff0c 导致在查询帮助文档时非常难过 网上有说通过预设设置帮助语言 xff0c 但很悲惨的是 xff0c 我的Matlab中并没有语言设置模块 情况如
  • STL — 常用容器

    2 STL 常用容器 2 1 string容器 2 1 1 string基本概念 本质 xff1a string是C 43 43 风格的字符串 xff0c 而string本质上是一个类 string和char 的区别 xff1a char
  • Mysql数据库的初始密码及如何修改密码

    数据库初始密码及如何修改密码 初始密码修改密码 初始密码 可能很多小伙伴们下载安装好MySQL后 xff0c 登录时提示你输入密码 xff0c 但是自己不知道密码是什么 xff0c 用下面的方法可以帮助你快速的找到 xff1a step1
  • John 破解shadow 密码

    1 wget https www openwall com john k john 1 9 0 tar gz 2 tar xvf john 1 9 0 tar gz 3 cd john 1 9 0 src 4 make amp make c
  • LVI-SAM代码复现、调试与运行

    一 LVI SAM介绍 LVI SAM是Tixiao Shan的最新力作 xff0c Tixiao Shan是Lego loam和Lio sam的作者 xff0c LVI SAM是Tixiao Shan最新开源的基于视觉 激光 惯导里程计S
  • Intel Realsense D455深度相机的标定及使用(一)——安装librealsense SDK2.0以及realsense-ros

    一 安装Intel RealSense SDK 2 0 Intel RealSense SDK 2 0 的DKMS内核驱动包 xff08 librealsense2 dkms xff09 支持Ubuntu LTS内核版本4 4 4 8 4
  • VINS-Mono详解(1)——feature_tracker部分

    前言 视觉 IMU融合的优势 xff1a 1 视觉可以帮助IMU消除积分漂移和校正IMU的Bias xff1b 2 借助IMU可以帮助视觉系统提升输出频率 xff1b 3 IMU可帮助单目解决尺度不可观的问题 xff0c 帮助双目减少尺度上
  • Intel Realsense D455深度相机的标定及使用(二)——对内置IMU和双目相机进行标定

    标定前需先安装librealsense SDK2 0以及realsense ros xff0c 可参考教程 xff1a Intel Realsense D455深度相机的标定及使用 xff08 一 xff09 安装librealsense
  • 五、ROS学习之订阅T265里程计数据并与stm32通信

    使用ROS读出T265里程计数据 通过节点订阅t265的里程计数据1 订阅T265的里程计信息2 实现linux系统与stm32通信 xff0c 并向stm32发送里程计信息 通过节点订阅t265的里程计数据 我使用的是Kinetic版本
  • 在js文件中调用vue组件

    正常的书写一个vue组件 lt template gt lt div class 61 34 34 gt lt div gt lt template gt lt script gt export default name 39 Subscr
  • BMP180气压传感器详解与示例(STM32 附带源码)

    BMP180气压传感器详解与示例 xff08 STM32 附带源码 xff09 简介工作模式校准数值测试流程第一步 xff1a 微处理器读取校准数值第二步 xff1a 读取温度 气压初始值第三步 xff1a 计算温度 气压第四步 xff1a
  • MAX30102脉搏血氧仪和心率传感器(三)心率计算——时域法

    文章目录 前言一 算法思想二 算法详解1 阈值检测2 等待波形稳定3 FIR滤波 存入缓存区4 检测PPG信号与阈值曲线的交点5 心率计算 三 实际测试1 静止测试2 动态测试 四 总结五 获取工程源码 前言 本章介绍PPG信号的心率计算方
  • 基于51单片机的指纹密码锁设计

    目录 具体实现功能 设计介绍 单片机介绍 设计思路 资料内容 原理图 程序 仿真实现 全部资料 具体实现功能 具体功能 xff1a 本设计采用STC89C52 AT89C52 AT89S52作为主控芯片 xff0c LCD12864液晶显示

随机推荐

  • 基于51单片机的智能台灯设计

    具体实现功能 系统由STC89C52单片机 43 L数码管 43 光敏电阻 43 人体感应模块 43 红外接近传感器模块构成 具体功能 xff1a xff08 1 xff09 亮度不够且有人靠近时台灯自动亮 xff1b xff08 2 xf
  • pyharm快捷键说明

    官方文档 xff1a pycharm gt gt Help gt gt Keymap Reference 1 编辑 xff08 Editing xff09 Ctrl 43 Space 基本的代码完成 xff08 类 方法 属性 xff09
  • 基于51单片机超声波液位控制器设计

    具体实现功能 系统由AT89C52单片机 43 HC SR04超声波测距模块 43 LCD1602液晶屏 43 继电器 43 LED灯指示及蜂鸣器报警模块 43 按键模块 43 电源构成 具体功能 xff1a 1 由HC SR04超声波测距
  • 基于51单片机的电子密码锁设计

    目录 具体实现功能 设计背景 硬件设计 软件设计 原理图 程序 仿真实现 全部资料 具体实现功能 系统由AT89S52单片机 43 AT24C02数据存储模块 43 按键模块 43 LCD1602显示 43 报警模块等构成 具体功能 1 输
  • 基于51单片机智能热水器控制系统

    具体实现功能 系统由STC89C52单片机 43 水位检测传感器 43 DS18B20温度探头传感器 43 按键模块 43 继电器模块 43 报警及指示模块 43 LCD1602显示模块 43 电源构成 具体功能 xff1a 1 LCD16
  • 基于51单片机的火灾报警器

    具体实现功能 系统由51单片机 43 MQ 2烟雾传感 43 ADC0832模数转换芯片 43 DS18B20温度传感器 43 数码管显示 43 按键模块 43 声光报警模块构成 具体功能 xff1a 1 实时监测及显示温度值和烟雾浓度 x
  • 基于51单片机的步进电机控制系统

    具体实现功能 系统由STC89C52单片机 43 单体数码管 43 LED指示灯 43 ULN2003驱动芯片 43 DC 5V步进电机构成 具体功能 xff1a xff08 1 xff09 实现按键控制步进电机正转 反转 加速 减速 停止
  • 基于51单片机的数字时钟(万年历)

    具体实现功能 系统由STC89C52单片机 43 DS1302时钟芯片 43 按键模块 43 LCD1602显示 43 电源构成 具体功能 xff1a 1 可以显示年 月 日 时 分 秒 星期 农历 xff1b 2 按键可以设置闹钟及报警
  • 基于51单片机的排队叫号系统

    具体实现功能 系统由STC89C52单片机 43 按键模块 43 LCD1602液晶屏 43 蜂鸣器呼叫模块 43 电源构成 具体功能 xff1a 1 主机通过按键完成叫号 xff0c LCD1602液晶显示屏显示被叫的号码及服务的柜台号
  • 仿真设计|基于51单片机的简易抢答器

    目录 前言 具体实现功能 设计介绍 51单片机简介 设计方案 资料内容 仿真实现 xff08 protues8 7 xff09 程序 xff08 Keil5 xff09 全部资料 xff08 压缩文件 xff09 前言 全部资料包括程序 K
  • 实物设计|基于51单片机的温湿度检测报警系统

    目录 具体实现功能 xff1a 设计介绍 51单片机简介 设计方案 资料内容 原理图和PCB xff08 AD19 xff09 仿真实现 xff08 protues8 7 xff09 程序 xff08 Keil5 xff09 全部资料 xf
  • 设计分享|74LS148实现按键控制LED灯

    目录 具体实现功能 xff1a 设计介绍 51单片机简介 设计思路 设计内容 仿真图 xff08 protues8 7 xff09 程序 xff08 Keil5 xff09 具体实现功能 xff1a 74LS148实现按键控制LED灯 设计
  • 版本控制工具GIT and SVN 命令对比

    Git 安装 Debian Ubuntu OS Apt get install libcur14 gnutls dev libexppat1 dev gettext libz dev libssl dev Apt get install g
  • SUMO仿真教程(1) ——安装环境的设置(Windows 10系统)

    SUMO安装环境的设置 目录 一 SUMO下载的官方网址二 下载步骤 xff1a 三 环境设置 xff1a 1 打开设置环境变量的界面2 用户 xff08 Administrator xff09 变量设置3 系统变量设置 四 总述 一 SU
  • SUMO仿真教程(3)—— 仿真运行(net file、rou file、sumocfg file)

    文章目录 一 基本介绍 xff1a 1 简述 xff1a 二 文件说明 xff1a 1 路网文件 net xml 2 自定义编写路由文件 rou xml xff1a 3 生成运行仿真文件 sumocfg xff1a 4 进行运行仿真 xff
  • SUMO仿真教程(5) —— 使用“XML“语言自定义构建路网

    文章目录 一 简要介绍1 node file2 edge file3 lane definitions xff08 1 xff09 路段细分 xff08 2 xff09 邻近的对向车道 xff08 3 xff09 删除边或车道 4 type
  • SUMO仿真教程(7)—— 交通需求模型介绍

    文章目录 一 简要介绍 xff1a 二 方式一 xff1a 使用行程定义三 方式二 xff1a 使用交通流定义四 方式三 xff1a 使用随机流定义五 方式四 xff1a 使用OD矩阵定义六 方式五 xff1a 使用交叉口流量和转向比定义七
  • STM32 + UCOSII 操作系统(简单讲解)

    前言 这是我将UCOSII操作系统移植在STM32单片机上后进行UCOSII操作系统学习的一些笔记与理解 xff0c 此文最后会附上我自己在UCOSII操作系统下使用STM32写的ESP8266 43 onenet 43 http协议的程序
  • 地下水监测用设备 5G无线数传终端DTU

    地下水监测用设备5G无线数传终端DTU xff0c 实现地下水水位 温度 电导率 水质 孔隙压力等数据传输入库 远程采集 远程监测 曲线及报表可视化管理 地下水监测用5G无线数传终端DTU功能配置 地下水监测用5G无线数传终端负责连接前端采
  • 图解进程线程、互斥锁与信号量-看完不懂你来打我

    在上学的时候 xff0c 老师讲到进程与线程的时候可能是这样讲的 xff1a 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程 xff0c 是操作系统进行资源分配和调度的一个独立单元 xff0c 是应用程序运行的载体 线程