当前位置: 首页 > news >正文

2. 进程和线程

文章目录

  • 前言
  • 1. 进程是什么
  • 2. 进程的相关属性
  • 3. 线程是什么
  • 4. 为什么引入线程
  • 5. 进程和线程的区别


前言

上一篇博客,我们讲到了CPU操作系统,今天我们讲一个操作系统中一个非常重要的概念—线程进程


1. 进程是什么

每个应用程序运行于现代操作系统之上时,操作系统会提供⼀种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了⼀个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对⼀个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。


2. 进程的相关属性

首先我们先站在操作系统的视角下,如何管理进程?

  1. 先描述一个进程是怎么样的
    创建一个进程控制块(PCB),是一个非常大的结构体,有很多很多的属性
  2. 再把多个线程组织起来
    比如,Linux 这样的操作系统,使用链表这样的形式,把多个PCB串到一起

PCB中的一些属性:
pid,内存指令,文件描述符表,进程状态,进程的优先级,进程的上下文,进程的记账信息

  1. pid (进程id)
    进程的身份标识符

  2. 内存指令
    是一组指令
    进程需要知道要执行的指令在哪里,指令依赖的数据又在哪里,
    进程运行的过程中,需要依赖内存资源
    在这里插入图片描述

  3. 文件描述符
    进程,在运行过程中,很多时候,需要和硬件设备,去进行交互,而硬盘上的数据是以文件的形式组织的,在进程读写文件的时候,需要先"打开文件"。
    每次打开一个文件,就会把这个文件信息,保存到文件描述符表中,表里的每一项,就对应这一个打开了的文件。
    操作系统中,会把很多资源,都抽象成文件来表示,不一定是硬盘中的资源。
    进程是操作系统中,资源分配的基本单位

将下面这几个之前,我们再讲几个名词。
第一个:分时复用
早期计算机,是"单任务"的操作系统,同一时刻,只能运行一个进程,要想运行下一个进程,就得结束上一个进程。
而多任务操作系统 (在有多核处理器之前,多任务操作系统都已经出现了)。即使 CPU 只有一个核心,也能同时运行多个进程,这是为什么呢?就是因为分时复用
把一个单位时间,分成很多份。
第一份,运行进程1的指令
第二份,运行进程2的指令

CPU 运行速度足够快,上述的切换过程,也会非常快,快到超出人类的反应时间。使人看起来感觉好像这些进程在 "同时执行"一样。
第二个:并发执行
把一个 CPU核心上,按照 分时复用,执行多个进程这样的方式,称为并发执行。人看起来是同时执行的,但从微观上来看,其实一个CPU在 串行执行,切换速度极快。
第三个:并行执行
把多个 CPU 核心上,同时执行多个进程这样的方式,称为 并行执行,现代 CPU 在运行这些进程的时候,并发和并行是同时存在的。

程序员在写代码的时候,无法区分这些进程是并发执行还是并行执行的,所以也会把并发和并行,统称为 “并发

  1. 进程状态
    进程中有很多种状态,其中有两个最为典型。
    (1) 就绪状态 --> 随叫随到 ,进程可以随时到 CPU 上进行执行
    (2) 阻塞状态 --> 进程当前不适合到 CPU 上执行

  2. 进程优先级
    这么多进程,他能都可以去 CPU 上运行的机会是均等的吗?
    有些进程,就是要优先级更高一些,分配到更多的 CPU资源。
    例如在打游戏的时候,QQ也在运行,毋庸置疑,游戏要分配到更多的 CPU 资源,不然游戏就会跟卡。

  3. 进程的上下文
    进程调度,一个进程执行一会,就会失去 CPU,过了一段时间之后,进程还会回到 CPU 上执行。
    是沿着上次执行到的状态,继续往下执行,而不是重头执行。
    进程在 CPU 运行的过程中, CPU上的各种寄存器,就表示了进程运行的 “中间状态”。
    保存上下文:把CPU中的这些寄存器中的值,保存到内存中(PCB 的对应属性中)
    恢复上下文:把 PCB 中刚才保存的属性,填写回到对应的寄存器中

  4. 进程的记账信息
    统计功能,统计每个进程都在 CPU 上运行了多久,如果发现某个进程,好久没有分配 CPU 资源了,就会给这个进程倾斜一些资源。


3. 线程是什么

一个线程就是一个 “执行流”. 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 “同时” 执行着多份代码.


4. 为什么引入线程

在没有引入线程之前,可以通过多进程编程的方式,实现并发编程的效果。但是进程整体是一个比较 “重” 的概念,创建 / 销毁进程的开销很大,尤其是频繁的创建和销毁。
为了解决上述问题,引入了线程 (Thread),轻量级进程。
每个进程,都相当于是一个要执行的任务,每个线程,也只是一个要执行的任务 (运行的一段代码指令)


5. 进程和线程的区别

  1. 进程中包含线程
    每个进程中,都包含一个或多个线程。
    在Windows的资源管理器中,看不到进程内部的线程,都是借助一些调试工具 (VS 的调试器,Windbg等)

  2. 进程是操作系统资源分配的基本单位
    CPU,内存,硬盘资源 (文件描述符,网络带宽…
    进程内部管辖着多个线程,会共享上述的内存资源和硬盘资源。
    进程创建,需要申请资源;进程销毁,需要释放资源,都是重量级的事情。对于线程来说,只是第一个线程创建的时候 (和进程一起创建的时候) 申请资源,后续再创建线程,不涉及到自愿申请操作 (干得少,速度快)
    只有所有的线程都销毁 (进程也跟着销毁),才会真正释放资源,运行过程中销毁某个线程,也不会释放资源。

  3. 线程是 CPU 上调度执行的基本单位
    如果一个进程包含多个线程,此时,多个线程之间,各自去 CPU 上调度执行。
    比如说,一个进程中有线程1,2,3
    可能是,线程1去 CPU核心1 上执行
    线程2去 CPU核心2 上执行
    线程3去 CPU核心3 上执行 ,并行操作
    也有可能是,线程1,线程2,线程3在一个核心上来回切换 (并发)
    也可能是 线程1,线程2 在一个核心上来回切换,线程3在另一个核心上,来回切换。
    上述内容,咱们程序员感知不到,也干预不了,全是由操作系统内部的 "调度器"自行完成的

  4. 线程中的一些属性
    有 调度相关,状态,优先级,记账信息,上下文。
    而文件描述符表和内存指针共用这线程的。

  5. 引入线程后的一些问题
    咱们举一个场景,一些人去吃鸡腿,其中人代表线程,鸡腿代表任务量,人吃鸡腿的动力代表CPU资源,不同的房间代表不同的进程。
    场景一:
    两个房间,两个桌子,两个滑稽老铁,吃 100 只鸡腿,每个房间的都放入 50只鸡腿。
    引入多线程编程,效率提高了,但是搞个房间,搞个桌子,搞个滑稽,整个的开销也不小
    场景二:
    一个房间,100只鸡,两个滑稽来吃。
    引入多线程方案。
    此时,也是每个滑稽吃 50 个,同时吃
    这样整个效率大幅度提高,并且也节省了房子和桌子的开销。
    场景三:
    如果引入多个线程呢?
    一个房间,100只鸡,四个滑稽来吃
    整体的效率还会进一步提升。
    但是如果有几十个甚至100个滑稽一块去吃呢?
    虽然提高线程的数目,能够提升效率,但也不是 “线性增长的”,线程数目达到一定程度之后,就算有再多的线程,也没法起到效果了,因为桌子上的空间有那么大。而且挤来挤去,会拖慢效率。
    线程数目如果太多,线程的调度开销也会非常明显,因为调度开销会拖慢程序的性能。
    场景四:
    多个滑稽老铁,共同抢夺一只鸡呢?
    如果两个滑稽老铁,看中了同一只鸡,此时就可能发生冲突。
    就会引发线程冲突问题,造成线程不安全,这样的冲突,可能会使得代价出现bug
    场景五:
    有个滑稽老铁,脾气火爆,没有抢到鸡大腿,直接掀桌了,(╯‵□′)╯︵┻━┻。
    一个线程抛出异常,可能就会带走整个县城,所有的线程都无法继续工作。
    可能即使捕获到异常,处理掉,也不一定会造成进程终止
    下面便是图形化的解释,大家可以看看。

在这里插入图片描述


下一篇博客,我们就要使用 多线程来编写代码了,我们不见不散

相关文章:

2. 进程和线程

文章目录 前言1. 进程是什么2. 进程的相关属性3. 线程是什么4. 为什么引入线程5. 进程和线程的区别 前言 上一篇博客,我们讲到了CPU和操作系统,今天我们讲一个操作系统中一个非常重要的概念—线程和进程 1. 进程是什么 每个应用程序运行于现代操作系统…...

CE中注册的符号地址如何通过编程获取

我的方式是先执行lua申请共享内存,内存名称是进程id,这样多开也不受影响,然后通过共享内存的名字就可以读到地址了。之后的人造指针的地址也都可以放这里集中管理。 -- 申请内存 local size 1024 -- 申请 1024 字节(1 KB&#…...

QT上实现SVM进行数据分类

针对不了解SVM的原理的同学强推下面这个课程: 6.机器学习课程(六)支持向量机(线性模型)问题_哔哩哔哩_bilibili 一、QT实现SVM的方法 1.调用SVM的C语言库:麻烦,要专门去找库,cmak…...

【unity调用c++动态库,c++和c#相互调用】

文章目录 前言一、编写C++动态库(MyLibrary.cpp)二、 编译C++动态库三、编写C#代码(CallbackExample.cs)四、将C++动态库与Unity项目集成五、Unity运行结果六、注意事项总结前言 在Unity中调用C++动态库并进行回调到C#的功能实现,涉及到C++与C#之间的交互。这个过程的关键…...

SAP FICO财务模块的会计年度变式是什么?有特殊的年度期间(财年)吗?可以不按日历月份来设定会计期间吗?

文章目录 一、会计准则中关于会计期间的一般性原则二、SAP系统中关于会计期间的设定(1)一般性的期间设定方式(2)特殊期间是什么?(3)有些国家与众不同的财年 三、可以不按日历月份来设定会计期间…...

Linux(17)——使用 DNF 安装和更新软件包

目录 一、使用 DNF 管理软件包: 1、 DNF 查找软件: 2、DNF 安装软件: 3、DNF 删除软件: 二、使用 DNF 管理软件包组: 1、DNF 显示组信息: 2、DNF 安装组: 三、使用 DNF 查看事务历史记录…...

vue中的设计模式

vue中使用了哪些设计模式 1. 观察者模式(Observer Pattern) 应用场景:Vue 的响应式系统核心就是观察者模式。 实现方式:通过 Object.defineProperty 或 Proxy 监听数据变化,当数据发生变化时,通知依赖的视…...

大模型性能随笔

1. 如果开了accumulate gradient更新,则pipeline并行的bubble会变小很多。因为每foward好多个batch,才开始backward。 2. chat聊天任务上,可以把prefix KV cache reuse功能利用起来;然后把同一个session的对话,路由到…...

pdf预览 报:Failed to load module script

pdf 预览报: Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of “application/octet-stream”. Strict MIME type checking is enforced for module scripts per HTML spec. 报错原因&#xff1a…...

基于 gitlab-runner 实现调度GPU的资源

本篇目录 1. 客户需求2. 需求调研3. 实践3.1 方案一:环境变量的方式3.2 方案二:k8s 自身的spec注入机制 4. 效果 该实践来自于客户的一个真实需求 1. 客户需求 客户的某些流水线需要使用GPU资源,但是对于GPU服务器而言,会有多张G…...

【源码+文档+调试讲解】项目申报小程序

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代…...

【ShuQiHere】使用 SCP 进行安全文件传输

【ShuQiHere】🚀 在日常的开发和运维工作中,文件传输是一个常见的任务。scp(Secure Copy)是一个基于 SSH 协议的文件传输工具,能够在本地和远程主机之间安全地复制文件和目录。本文将详细介绍 scp 的使用方法&#xf…...

算法基础 - 二分查找

文章目录 二分查找算法通常应用于已排序的数组。以下是一个C实现的二分查找算法示例&#xff1a; #include <iostream> #include <vector>int binarySearch(const std::vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while …...

权限掩码umask

1 、 设置新建文件或目录的默认权限 在 Linux 系统中&#xff0c;当用户创建一个新的文件或目录时&#xff0c;系统都会为新建的文件或目录分配默认的权限&#xff0c;该默认权限与umask 值有关&#xff0c;其具体关系是&#xff1a; 新建文件的默认权限 0666-umask 值 新建…...

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式)&#xff0c;CSS样式表可以分为三大类&#xff1a; 1.行内样式表&#xff08;行内式&#xff09; 2.内部样式表&#xff08;嵌入式&#xff09; 3. 外部样式表&#xff08;链接式&#xff09; 5.2 内部样式表 …...

在Linux中,SElinux的作用是什么?如何临时和永久的更改SElinux上下文?

SELinux在Linux系统中扮演者至关重要的安全角色&#xff0c;它通过实施强制访问控制&#xff08;Mandatory Access Control,MAC&#xff09;策略来增强系统的安全性。不同于传统的用户和组权限管理机制&#xff08;即自主访问控制DAC&#xff09;&#xff0c;selinux提供了一种…...

windows下,golang+vscode+delve 远程调试

1 现在远程服务器安装golang和delve golang的安装&#xff0c;通过官网直接下载安装包安装接口 go install github.com/go-delve/delve/cmd/dlvlatest 如果dlv和golang版本不匹配&#xff0c;这里把latest换成匹配的版本&#xff0c;比如1.20.0 2 编译带调试信息的程序 go bu…...

社交牛杂症?锂电系统有了DeviceNet转Profinet网关后,沟通无障碍

在锂电行业蓬勃发展的当下&#xff0c;自动化与智能化浪潮正席卷而来&#xff0c;这无疑对设备间的通信精准度与流畅性提出了严苛要求&#xff0c;而稳联技术Devicenet转Profinet网&#xff08;WL-PN-DVNM&#xff09;关恰是破局的关键利器。 此网关设备犹如一座桥梁&#xff0…...

C语言的正则表达式

C语言中的正则表达式 引言 正则表达式是一种用于描述字符串模式的工具&#xff0c;它可以用来进行字符串匹配、查找、替换等操作。在编程中&#xff0c;正则表达式被广泛应用于数据验证、信息提取等场景。C语言虽然没有内置的正则表达式支持&#xff0c;但通过一些库我们同样…...

Launcher3主页面加载显示流程分析

布局结构 抓取布局后&#xff0c;可以看到每个图标是一个DoubleShadowBubbleTextView&#xff0c;父布局是CellLayout、workspace。 我们可以在CellLayout添加子view打印出调用堆栈信息&#xff0c;可以整体上看页面加载显示流程。 主要类 Launcher.java&#xff1a;主界面&…...

机器学习算法---贝叶斯学习

1.了解相关概念 先验概率&#xff1a;有数据集d,以及假设h,此时h是不确定的。在还没有训练数据之前h的初始概率记为P(h),类似地我们把P(d)表示训练数据d在任何假设都未知或不确定时的概率。P(d|h)表示已知假设h成立时d的概率。 后验概率&#xff1a;就是在数据d上经过学习之后…...

PyCharm+RobotFramework框架实现UDS自动化测试——(二)RobotFramework环境配置

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 文章目录 1.环境准配2.Pycharm中相关配置2.1. 安装Hyper RobotFramework Support 3.脚本执行环境3.1 执行单条的配置3.2 执行全部用例配置 4.工程运行4.1 单条用例运行4.…...

colnames看似简单,却能优化数据处理流程

引言 在数据处理和分析中&#xff0c;变量名称是至关重要的&#xff0c;它们决定了数据的可读性和操作的简便性。在R语言中&#xff0c;colnames 函数以其简单的语法设计&#xff0c;提供了高效管理数据框列名的能力&#xff0c;尤其是在复杂的爬虫任务中显得尤为重要。本篇文…...

Spring Boot整合Minio实现文件上传

Spring Boot整合Minio后&#xff0c;前端的文件上传有两种方式&#xff1a; 文件上传到后端&#xff0c;由后端保存到Minio 这种方式好处是完全由后端集中管理&#xff0c;可以很好的做到、身份验证、权限控制、文件与处理等&#xff0c;并且可以做一些额外的业务逻辑&#xf…...

GitHub - riscv-software-src/riscv-isa-sim: Spike, a RISC-V ISA Simulator

GitHub - riscv-software-src/riscv-isa-sim: Spike, a RISC-V ISA Simulator 操作手册 $ apt-get install device-tree-compiler libboost-regex-dev libboost-system-dev $ mkdir build $ cd build $ ../configure --prefix$RISCV $ make $ [sudo] make install 具体安装 …...

ceph文件系统

ceph文件系统&#xff1a; 使用设备&#xff1a;4台机器 高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提供高性能&#xff0c;高可靠性和高可用的对象存储&#xff0c;块存储&#xff0c;文件系统的存储 使用分布式的算法保证数据的高可用和一致性 ceph的架…...

模型创新、论文复现、科研辅导、论文代码定制

建模先锋团队长期致力于为用户提供优质的代码定制服务。团队提供全网最低价格的服务&#xff0c;同时保证高性价比和高质量的代码交付&#xff0c;为您提供个性化定制的服务。 以下是定制服务范围&#xff1a; 通过深度学习和信号处理技术&#xff0c;我们能够针对不同行业和场…...

【flink-cdc】flink-cdc 3版本debug启动pipeline任务,mysql-doris

官方文档 github仓库地址 Flink cdc debug调试动态变更表结构 经过测试使用&#xff0c;在启动任务配置Modify classpath添加jar的方式&#xff0c;容易出错classNotFoundException等等。 一、build project flink-cdc版本&#xff1a;3.2.1 mvn clean package "-Dma…...

mybatisX插件的使用,以及打包成配置

装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己装mybatisX插件&#xff1b; idea连接数据库&#xff1b; 点击mybatisx-generator&#xff0c;设置自己要的包和类&#xff1b; 如果要把自己的配置设置成一个自定义模板&a…...

pip下载包出现SSLError

报错&#xff1a; ERROR: Could not install packages due to an OSError: HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Max retries exceeded with url: /packages/8a/c2/ae7227e4b089c6a8210920db9d5ac59186b0a84eb1e6d96b9218916cdaf1/taming_transform…...

Linux下查看文件和文件夹占用空间大小

使用Linux命令&#xff0c;查看文件磁盘所占的空间大小&#xff0c;下面可以通过以下命令进行操作 df 可以查看一级文件夹大小、使用比例、档案系统及其挂入点&#xff0c;但对文件束手无策du 查看文件和文件夹的磁盘使用空间 在使用中&#xff0c;一般是df命令和du命令一起联…...

【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站

为了实现一个基于Spring和Spring MVC的汉服文化宣传网站,我们需要创建一个简单的Web应用程序来展示汉服文化和相关信息。这个系统将包括以下几个部分: 数据库表设计:定义文章、用户和评论的相关表。实体类:表示数据库中的数据。DAO层接口及MyBatis映射文件:用于与数据库交…...

C++语言的学习路线

C语言的学习路线 C是一门复杂而强大的编程语言&#xff0c;由于其高性能和灵活性&#xff0c;受到了许多开发者和企业的青睐。无论是系统软件、嵌入式系统还是游戏开发&#xff0c;C都有非常广泛的应用。要掌握C这门语言&#xff0c;需要合理制定学习路线&#xff0c;并结合实…...

【OpenCV】使用Python和OpenCV实现火焰检测

1、 项目源码和结构&#xff08;转&#xff09; https://github.com/mushfiq1998/fire-detection-python-opencv 2、 运行环境 # 安装playsound&#xff1a;用于播放报警声音 pip install playsound # 安装opencv-python&#xff1a;cv2用于图像和视频处理&#xff0c;特别是…...

【ArcGISPro/GeoScenePro】解决常见的空间参考和投影问题

修复空间参考缺失的图像 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 查看属性坐标 查看属性范围 范围值并不是零或接近于零。 这意味着栅格具有范围,因此其已正确进行...

Ruby语言的语法

Ruby语言的语法之美 Ruby是一种动态、开放源代码的编程语言&#xff0c;由日本的松本行弘&#xff08;Yukihiro Matsumoto&#xff09;于1995年首次发布。Ruby语言以其简洁、优雅和易于阅读的语法而闻名。它不仅适合初学者&#xff0c;还被广泛应用于Web开发、数据分析和其他领…...

概述(讲讲python基本语法和第三方库)

我是北子&#xff0c;这是我自己写的python教程&#xff0c;主要是记录自己的学习成果方便自己日后复习&#xff0c; 我先学了C/C&#xff0c;所以这套教程中可能会将很多概念和C/C去对比&#xff0c;所以该教程大概不适合零基础的人。 it seems that python nowadays 只在人工…...

程序包org.springframework.boot不存在

springBoot项目启动报错 程序包org.springframework.boot不存在 1、检查依赖 首先检查pom文件判断依赖是否存在 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.5…...

.NET Core FluentAPI

目录 约定配置 主要规则 两种配置方式 Data Annotation Fluent API Fluent API配置 Fluent API众多方法 选择 约定配置 主要规则 表名采用DbContext中的对应的DbSet的属性名。数据表列的名字采用实体类属性的名字&#xff0c;列的数据类型采用和实体类属性类型最兼容…...

浙江省自然资源厅:基于“浙里办”的自然资源移动政务服务创新实践——“浙里自然资源”

摘 要&#xff1a;本文基于浙江省自然资源移动政务服务的创新实践&#xff0c;设计和实现“浙里自然资源”应用&#xff0c;依托浙江省省域空间治理数字化平台特有的架构基础&#xff0c;在提升功能性和可用性、加强运营力度、丰富服务内容等方面采取了管理举措和技术创新。通…...

【Astro】如何在Astro上借助Cloudflare D1和Drizzle ORM打造全栈应用?一文带你搞定!

如何在Astro上借助Cloudflare D1和Drizzle ORM打造全栈应用&#xff1f;一文带你搞定&#xff01; 文章目录 如何在Astro上借助Cloudflare D1和Drizzle ORM打造全栈应用&#xff1f;一文带你搞定&#xff01;前言一、Astro简介与优势二、Cloudflare D1简介三、Drizzle ORM简介四…...

【Axios使用手册】如何使用axios向后端发送请求并进行数据交互

axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js。它支持请求和响应拦截、取消请求、自动转换 JSON 数据等功能&#xff0c;非常适合在现代 JavaScript 应用中进行网络请求。以下是对 axios 的详细讲解&#xff0c;包括安装、基本用法、高级功能等。…...

边缘计算应用十大领域

边缘计算解决了互联网的网速问题&#xff0c;作为实现边缘计算的基础&#xff0c;那边缘计算是5G与产业互联网、物联网时代的重要技术支撑&#xff0c;也正迎来广阔的增长空间。那么现在我们生活中有哪些领域正在使用边缘计算呢&#xff1f;今天我们来盘点一下我们身边正在使用…...

CSS 学习之 padding 与图形绘制

padding 属性和 background-clip 属性配合&#xff0c;可以在有限的标签下实现一些 CSS 图形绘制效果&#xff0c;我这里举两个小例子&#xff0c;重在展示可行性。 例 1:不使用伪元素&#xff0c;仅一层标签实现大队长的“三道杠”分类图标效果。此效果在移动端比较常见&…...

熔断器模式如何进入半开状态的

熔断器模式在进入打开状态并经过一段冷却时间后&#xff0c;会自动进入半开状态。这个过程是熔断器模式自我恢复机制的一部分&#xff0c;旨在测试下游服务是否已经恢复正常&#xff0c;从而决定是否重新允许请求通过。 1. 进入打开状态&#xff1a; • 当服务调用失败次数达到…...

数据结构:双向循环链表

双向循环链表&#xff08;Doubly Circular Linked List&#xff09; 双向循环链表是双向链表的一种变体&#xff0c;其特点是链表的头节点和尾节点相连&#xff0c;形成一个闭环。这种结构允许在链表中进行无缝的双向遍历&#xff0c;并且由于循环特性&#xff0c;可以从任何节…...

宝安湾区之光附近的钓鱼点

工作日的午休我经常在公司附近骑行&#xff0c;有时候也会骑行到宝安的湾区之光。但是我最感兴趣的除了湾区之光摩天轮&#xff0c;还有雷打不动的快乐钓鱼佬。 上图红框区域的河岸每天都会出现零零散散的快乐钓鱼佬&#xff0c;他们好像都有自己的钓鱼窝点。我发现来这里钓鱼也…...

【计算机网络】什么是AC和AP?

在现代的无线网络中&#xff0c;AC&#xff08;Access Controller&#xff0c;接入控制器&#xff09;和AP&#xff08;Access Point&#xff0c;无线接入点&#xff09;是两个至关重要的设备&#xff0c;它们在网络的管理、连接和优化中扮演着重要角色。理解它们的功能和区别&…...

python 词法分析

词法分析&#xff08;Lexical Analysis&#xff09;是编译器的第一步&#xff0c;它的任务是将源代码文本分割成一系列有意义的单元&#xff08;称为“词法单元”或“Token”&#xff09;。这些词法单元通常包括关键字、标识符、常量、运算符、分隔符等。 import re# 定义词法单…...

JUC--CAS原理(以Atomic报下类的实现来了解CAS的原理)

以Atomic来了解CAS的原理 六、无锁6.1CAS&#xff08;Compare-And-Swap&#xff09;原理6.2CAS与synchronized6.3Atomic&#xff08;原子类&#xff09;原理分析 6.4ABA问题6.4unsafe 六、无锁 6.1CAS&#xff08;Compare-And-Swap&#xff09;原理 CAS原理&#xff1a;CAS是…...