system V 共享内存
system V是一种标准,linux内核支持这种标准,专门设计了一个ipc模板(通信的接口设计,原理,接口,相似性)
使用各自的虚拟地址访问物理内存
共享内存=描述共享内存的内核数据结构+它所对应的物理空间
进程间通信的本质:让不同的进程先看到同一份资源
进程都有自己的地址空间,都要把地址空间映射到物理内存处
先在物理内存上申请一部分内存空间,通过页表映射到进程的共享区(地址空间)
通过映射让两个不同的进程看到同一个内存
释放共享内存
存在有多组进程,都在使用不同的共享内存来进行通信。OS内,多个共享内存同时存在,就要管理共享内存,先描述再组织
描述共享内存的结构体
共享内存是否被使用?描述共享内存的结构体有引用计数可以来判断
共享内存接口的使用
先创建共享内存
传入key区分唯一性
让用户层约定一个key,一个创建设置到内存当中一个拿着key去查找就能拿到
ftok构建一个key值,把这个key值传递给shmget,创建共享内存的那一方就能构建出带key的共享内存,另一方通过相同的ftok构建相同的key就能使用同一个共享内存
用户指定key
返回值
成功构建共享内存的返回值
标识我们创建好的共享内存
shmget函数
不同的进程shm来解析通信,标识共享内存的唯一性,key来区分,不是内核直接形成的,而是在用户层,构建并传入给OS的
我们怎么评估共享内存是否存在,怎么保证两个不同的进程拿到的是同一个共享内存-->key
shmflg:由九个权限标志组成,他们的用法和创建文件时使用的莫得模式标志是一样的
IPC_CREAT:创建共享内存,如果目标共享内存不存在就创建;否则就打开这个已经存在的共享内存并返回
IPC_CREAT | IPC_EXCL: IPC_EXCL单独存在无意义,如果要创建的shm不存在就创建它,如果已经存在,shmget就会出错返回,只要shmget成功返回,一定是一个全新的共享内存
ftok
代码
进程结束,如果没有进行共享内存的删除,共享内存资源会一直存在 ,即共享内存的资源,生命周期随内核。如果没有显式地删除,即便进程退出了,IPC资源依旧被占用
删除,控制共享内存,在用户层我们不能使用key,key未来只给内核来进行唯一性的区分,需要使用shmid进行共享内存的管理
shmctl函数
我们也可以写入删除IPC对象的代码
用于控制内存
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作
buf:指向一个保存共享内存的模式状态和访问权限的数据结构
成功返回0,失败返回-1
加上这一段
并修改server.cc
shmat函数
将共享内存段链接到进程地址空间中,shmat:at:attach 关联
shmid:共享内存标识符
shmadder:指定连接的地址(虚拟地址,固定地址进行挂接)
shmflg:它的两个取值是SHM_RND和SHM_RDONLY
成功返回一个指针,指向共享内存的第一个节
失败返回-1
挂接
Attach 函数
功能:该函数用于将创建好的共享内存段附着(映射)到当前进程的地址空间,这样进程就可以通过返回的虚拟地址来访问共享内存中的数据
VirturalAddr 函数
功能:用于获取并打印共享内存的虚拟地址,同时返回该虚拟地址指针,方便其他地方使用该指针来访问共享内存
comm.hpp
#pragma once#include <iostream>
#include <cstdio>
#include <string>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>const int gdefaultid = -1;
//gdefaultid:初始化为 -1,用作共享内存标识符(shmid)的默认值。在后续代码里,
//若 shmid 为 -1,就表明共享内存尚未成功创建或获取
const int gsize = 4096;
//设定共享内存段的大小为 4096 字节
const std::string pathname = ".";
//指定为当前目录 ".",这是 ftok 函数所需的路径名,ftok 会依据此路径名和项目 ID 生成一个键值(key)
const int projid = 0x65;
//ftok 函数所需的项目 ID
const int gmode = 0666;#define ERR_EXIT(m) \do \{ \perror(m);\ exit(EXIT_FAILURE);\}while(0)
//ERR_EXIT 是一个宏,其用途是处理错误情况。
//do {... } while(0) 这种结构保证了宏在被使用时,无论是否处于 if、for 等语句块里,都能正常运行。
//perror(m) 会把错误信息输出到标准错误流,同时显示 m 这个自定义的错误提示。
//exit(EXIT_FAILURE) 会让程序终止并返回一个表示失败的状态码class Shm
{
private://创建的一定要是个全新的共享内存void CreateHelper(int flg){key_t k = ftok(pathname.c_str(), projid);// pathname 和 projid 生成一个键值 kif(k < 0){ERR_EXIT("ftok");// ftok 函数调用失败,会返回一个小于 0 的值,此时调用 ERR_EXIT("ftok")//输出错误信息并终止程序}printf("key: 0x%x ", k);//ftok 调用成功,就打印生成的键值 k//_shmid = shmget(k, _size, IPC_CREAT | IPC_EXCL | 0666);//也要有权限设置_shmid = shmget(k, _size, flg);//调用 shmget 函数来创建共享内存段。IPC_CREAT 表示若共享内存段不存在就创建它,//IPC_EXCL 表示若共享内存段已经存在则返回错误if(_shmid < 0){ERR_EXIT("shmget");// shmget 函数调用失败,会返回一个小于 0 的值,此时调用 ERR_EXIT("shmget") //输出错误信息并终止程序}printf("shmid:%d\n ", _shmid);//调用成功,就打印创建的共享内存段的标识符 _shmid}
public:Shm():_shmid(gdefaultid), _size(gsize), _start_mem(nullptr)//_shmid 用于存储共享内存标识符,_size 用于存储共享内存的大小{}void Creat(){CreateHelper( IPC_CREAT | IPC_EXCL | gmode);}//获取void Get(){CreateHelper( IPC_CREAT );}void Destroy(){if(_shmid == gdefaultid) return;// 检查共享内存标识符是否为默认值(即未创建共享内存)int n = shmctl(_shmid, IPC_RMID, nullptr);// 调用 shmctl 函数,尝试删除共享内存段if(n > 0){printf("shmctl delete shm: %d sucess!\n", _shmid);//表示删除成功,输出成功信息}else{ERR_EXIT("shmctl");//删除失败,调用 ERR_EXIT 宏处理错误}}void Attach(){_start_mem = shmat(_shmid,nullptr,0);if((long long)_start_mem < 0)//在进行类型转换为 long long 后就是小于 0 的值{ERR_EXIT("shmat");}printf("attach succcess\n");}void *VirturalAddr(){printf("*VirturalAddr: %p\n", _start_mem);//使用 printf 函数,以指针格式(%p)打印出共享内存的虚拟地址return _start_mem;//返回指向共享内存起始地址的指针 _start_mem,//供其他函数使用该指针来操作共享内存中的数据}
private:int _shmid;int _size;void *_start_mem;
};
IPC本质:让不同的进程先看到同一份资源
读写共享内存并没有出现系统调用,共享内存属于用户空间,可以让用户直接使用
共享内存是进程间通信中速度最快的方式:
1.映射之后,读写直接被对方看到
2.不需要进行系统调用获取或者写入内容
但是也会有缺点:通信双方没有所谓的“同步机制”,导致数据不一致
共享内存没有保护机制,即对共享内存中数据的保护
我们shmget(key)就会被设置到共享内存的描述结构体中
int shmctl(int shmid, int cmd, struct shmid_ds *buf);struct shmid_ds {struct ipc_perm shm_perm; /* Ownership and permissions */size_t shm_segsz; /* Size of segment (bytes) */time_t shm_atime; /* Last attach time */time_t shm_dtime; /* Last detach time */time_t shm_ctime; /* Creation time/time of lastmodification via shmctl() */pid_t shm_cpid; /* PID of creator */pid_t shm_lpid; /* PID of last shmat(2)/shmdt(2) */shmatt_t shm_nattch; /* No. of current attaches */...};struct ipc_perm {key_t __key; /* Key supplied to shmget(2) */uid_t uid; /* Effective UID of owner */gid_t gid; /* Effective GID of owner */uid_t cuid; /* Effective UID of creator */gid_t cgid; /* Effective GID of creator */unsigned short mode; /* Permissions + SHM_DEST andSHM_LOCKED flags */unsigned short __seq; /* Sequence number */};
在内核中,共享内存在创建的时候,它的大小必须是4KB(4096)的整数倍
如果为4090 --> 4096*2 --> 向上4KB取整
但是能用的也只是4090的内存大小
相关文章:
system V 共享内存
system V是一种标准,linux内核支持这种标准,专门设计了一个ipc模板(通信的接口设计,原理,接口,相似性) 使用各自的虚拟地址访问物理内存 共享内存描述共享内存的内核数据结构它所对应的物理空间 进程间通信的本质&…...
ResNet改进(27):融合EfficientViT 高效混合网络设计
在计算机视觉领域,卷积神经网络(CNN)和视觉Transformer(ViT)各有优势。 今天分享的是一种将两者巧妙结合的方案——在ResNet18基础上引入轻量化ViT模块的设计思路。 整体架构概览 这个混合网络主要由三部分组成: ResNet18骨干网络:作为特征提取器,去掉了原模型的平均池化…...
字符串与栈和队列-算法小结
字符串 双指针 反转字符串(双指针) 力扣题目链接 void reverseString(vector<char>& s) {for (int i 0, j s.size() - 1; i < s.size()/2; i, j--) {swap(s[i],s[j]);} }反转字符串II 力扣题目链接 遍历字符串的过程中,只要让 i (2 * k)&#…...
go语言学习笔记:gin + gorm + mysql 用户增删改查案例入门
大家好,我是此林。 Golang 语言现在已经成为了编程的趋势,毕竟是大厂背书嘛,Google 研发的。 目前很多云原生项目都是基于 go 来编写的,比如: Kubernetes (K8s) 容器编排系统, Docker 容器化技术&…...
设计模式——建造者模式(生成器模式)总结
当我们需要创建一个非常复杂的对象时,可以使用建造者模式,分步骤建造一个对象,最后将完整的对象返回给客户端。 比如,我们要生成一个房子对象,建造一个房子,需要打地基、盖围墙、盖地板、安装门、安装窗户…...
Nginx代理Minio出现AccessDeniedAccessDenied
一、问题描述 AccessDeniedAccessDenied.sight.jpgmediafiles/mediafiles/sight.jpg1835E50603CB8FE0dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8 二、问题排查 (1)minio 和 nginx 是否正常启动 (2)检…...
在ArcGIS Pro中将栅格NoData值修改为特定值
目录 问题如下:栅格文件中NoData值为65535,要将该NoData值修改为-9999 步骤一:使用栅格计算器(Raster Calculator)输出具有新NoData值的栅格文件 步骤二:输出修改值后的栅格文件(Export Rast…...
模糊表示学习 笔记
图表示学习通常从图的拓扑结构和高维节点属性中产生低维和清晰的表示。然而,节点或图的清晰表示实际上隐藏了特征的不确定性和可解释性。例如,在引文网络中,两篇论文之间的引用总是涉及表示相关度的future,也就是说,一…...
GitHub 趋势日报 (2025年04月12日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1yeongpin/cursor-free-vip[Support 0.48.x](Reset Cursor AI MachineID & Auto Sign Up / In & Bypass Higher…...
FreertosHAL库笔记
堆和栈 堆:一块内存空间,用于存储程序运行时动态申请的内存空间。在堆上分配内存可以根据程序的需要灵活地申请和释放不同大小的内存块。可用pvProMalllloc()和vPortFree()函数来开辟和释放 栈:也是一块内存空间,主要用于函数调用…...
迷你世界脚本之容器接口:WorldContainer
容器接口:WorldContainer 彼得兔 更新时间: 2023-04-26 10:21:02 具体函数名及描述如下: 序号 函数名 函数描述 1 addFurnace(...) 新增熔炉 2 removeFurnace(...) 移除熔炉 3 checkFurnace(...) 检测是否为熔炉 4 getFurnaceHeatPerce…...
springboot框架集成websocket依赖实现物联网设备、前端网页实时通信!
需求: 最近在对接一个物联网里设备,他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依赖,从而实现与设备实时通信! 框架:springboot2.7 java版本:java8 好了,还是直接…...
【linux知识】web服务环境搭建(一):用户以及开发环境初始化
toc 创建用户组以及用户 以下是 创建用户组 wendao 和用户 wendao 并指定 GID、UID 及家目录 的完整操作指南: 一、创建用户组(指定 GID) sudo groupadd -g 1500 wendao # 创建组并指定 GID 为 1500• 注意:GID 需唯一&#…...
消息中间件——RocketMQ(一)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 RocketMQ(一) 一、MQ出现的背景 在传统的单体应用架构中,系统的各个模块紧密耦合在一起。随着业务…...
[oeasy]python087_[词根溯源]suspend词源_append_depend
087_[词根溯源]suspend词源_append [词根溯源]suspend词源_append_depend 回忆上次内容 上次了解了 方法 和 函数的 不同之处 方法(method) 函数(function) 需要对象调用 无需对象调用 可以根据 名字调用 无需名字 直接调用 基于类的对象 独立的 需要self 不需要self…...
Ubuntu 安装 Cursor AppImage 到应用程序中
如果 Cursor AppImage 安装到 Ubuntu 系统中(而不是每次手动运行 .AppImage 文件),可以按照以下方法操作: 方法 1:直接运行 AppImage(最简单,但不完全“安装”) 赋予执行权限chmod …...
二叉树 --- 堆(下)
今天我们来把堆完结了。 对于一个高度为 h 的满二叉树,有 F(h) 2 ^ 0 2 ^ 1 …… 2 ^ (h - 1) 2 ^ h - 1 h log2 (N1) 对于一个高度为 h 的完全二叉树,且最后一层只有一个 ,则 F(h) 2 ^ 0 2 ^ 1 …… 2 ^ (h - 2) 1 2 ^ (h -…...
数组对象[object],五种如何去重方法 js
前言 数组有很多方法都可以实现去重。本章分享比较常用的。 准备工作 准备一组数组对象 let arr [{ id: "1", name: "张晓", age: 14 },{ id: "2", name: "张晓", age: 14 },{ id: "3", name: "张晓", age: 1…...
PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕
视频讲解: PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕 代码仓库:https://github.com/LitchiCheng/mujoco-learning 今天分享PyRoboPlan库,比之前的方式优点在于,这个库考虑了机械…...
【模态分解】EMD-经验模态分解
算法配置页面,也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc...
Sentinel规则持久化pull模式核心源码解析
文章目录 前言一、服务端新增/修改规则1.1、repository.save1.2、publishRules 二、客户端接收规则三、持久化扩展3.1、持久化原理3.1.1、FileRefreshableDataSource3.1.1.1、super关键字3.1.1.2、firstLoad()方法 3.1.2、FlowRuleManager.register2Property 3.2、持久化实现 总…...
【go】--编译
go build -o [编译完成的可执行文件] [需要编译的.go文件]#例如 go build -o myapp main.go#确保编译的结果和当前运行环境相同 #查看arch uname -a在 Linux 中查看和修改 GOOS 和 GOARCH 环境变量: 1. 查看当前 Go 环境变量 # 查看所有Go相关的环境变量 go env# …...
【Spring底层分析】Spring IoC
Spring IoC IoC:控制反转。将对象创建和对象之间的调用交给Spring容器来管理。好处是降低了对象之间的耦合度。 DI:依赖注入。给bean对象注入依赖的对象。 大白话就是:Spring帮你创建对象,对象的属性如果依赖于某个对象…...
Ubuntu系统进程管理
在Ubuntu系统中,进程管理是系统维护和性能调优的重要部分。以下是关键命令和技巧的总结,帮助你有效管理系统进程: 1. 查看进程 ps 命令:查看当前进程快照。 bash ps aux # 查看所有运行中的进程(a所有用户…...
HDU2196 Computer 树形DP
原题链接 既然要查找每个节点的最远到达距离,由于该图是个树,我们就找从根节点向下遍历方向的终点的距离与先返回父节点再从最优的父节点沿着原来的方向的终点的距离的最大值 如图所示 也就是说,我们需要获得当前点的正距离最大值和正距离最…...
【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写
目录 摘要Abstract用于检索-增强大语言模型的查询与重写研究背景方法论基于冻结LLM的重写方案基于可训练重写器的方案重写器预热训练(Rewriter Warm-up)强化学习(Reinforcement Learning) 创新性实验结果局限性总结 摘要 这篇论文…...
Istio常用命令
Istio常用命令 1. 安装和配置2. Sidecar 注入3. 验证和状态4. 升级和卸载5. 故障排除6. 配置管理 istioctl 的常用命令及其详细说明: 1. 安装和配置 安装 Istio # 使用指定的配置文件(如 demo)安装 Istio 到 Kubernetes 集群。 istioctl m…...
Linux基础15
一、网络模型 二、eNSP模拟器 拖拽操作建立模拟网络环境 交换机视图操作: <> 用户视图 [] 系统视图 接口视图 协议视图 display version #显示版本和设备型号 display current-configuration #查看设备配置(查错) …...
FISCO BCOS群组扩容实战指南:从原理到操作全解析
引言:为什么需要群组扩容? 在区块链技术迅猛发展的今天,企业级应用对区块链平台提出了更高的要求。"如何在不影响现有业务的情况下扩展区块链处理能力?"、"能否实现不同业务数据的物理隔离?"、&qu…...
【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据:MNIST、其他数字与字母识别(1)数据加载(2)查看数据的特征和标…...
从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全
安科瑞顾强 近年来,老旧小区电气火灾事故频发,成为威胁居民生命财产安全的重要隐患。据统计,我国居住场所火灾伤亡人数远超其他场所,仅今年一季度就发生8.3万起住宅火灾,造成503人遇难。这些建筑多建于上世纪&#x…...
2.1 全栈运维管理:Proxmox VE单节点配置桥接、VLAN和Bonding的详细实验指南
本文是Proxmox VE 全栈管理体系的系列文章之一,如果对 Proxmox VE 全栈管理感兴趣,可以关注“Proxmox VE 全栈管理”专栏,后续文章将围绕该体系,从多个维度深入展开。 概要:本文介绍 Proxmox VE 单节点网络配置。桥接基…...
docker面试题
1.docker网络 Docker网络是Docker容器之间进行通信的关键功能。Docker提供了多种网络模式和驱动,以满足不同的网络需求。以下是Docker网络的详细介绍: 1.Docker网络模式 Docker提供了以下几种网络模式,每种模式适用于不同的场景:…...
计算机视觉——基于YOLOV8 的人体姿态估计训练与推理
概述 自 Ultralytics 发布 YOLOV5 之后,YOLO 的应用方向和使用方式变得更加多样化且简单易用。从图像分类、目标检测、图像分割、目标跟踪到关键点检测,YOLO 几乎涵盖了计算机视觉的各个领域,似乎已经成为计算机视觉领域的“万能工具”。 Y…...
【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言宝塔安装DockerMinIO 安装与设置cploar内网穿透PicGo下载与安装typora安装总结互动…...
【家政平台开发(41)】家政平台性能蜕变:性能测试与优化全解析
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
监控docker中的java应用
1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […...
Android游戏辅助工具开发详解
文章目录 第一部分:概述与基础准备1.1 游戏辅助工具的定义与用途1.2 开发环境准备1.3 项目创建与配置 第二部分:核心功能实现2.1 屏幕点击功能实现2.1.1 基础点击功能2.1.2 多点触控实现 2.2 滑动功能实现2.2.1 基础滑动功能2.2.2 曲线滑动实现 2.3 屏幕…...
重生之外卖配送时被投诉后的反思
重生之外卖配送时被投诉后的反思 写苍穹外卖时 我们发现在每一次调用sql语句时 insert update语句总会需要在service的实现类里加入例如create_time,create_user , update_time , update_user的填充 每次赋值都要重新编写代码,会造成代码冗余 ; 序号字…...
计算机基础复习资料整理
计算机基础复习资料整理 一、操作系统 (一)定义 操作系统(Operating System,OS)是介于计算机硬件和用户(程序或人)之间的接口。作为通用管理程序,它管理计算机系统中每个部件的活动…...
Profibus DP主站网关数据映射全解析!
Profibus DP主站网关数据映射全解析! 在工业自动化领域,Profibus DP主站网关作为一种关键的通讯设备,其数据映射的精准度和效率对整个控制系统的性能有着至关重要的影响。本文旨在深入探讨Profibus DP主站网关的数据映射过程,揭示…...
ocr-不动产权识别
目录 一、在阿里云申请ocr识别服务 二、创建springboot项目 三、后续 一、在阿里云申请ocr识别服务 在线体验:房产证图片上传 [阿里官方]不动产权证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 可以选择一毛500次这个 当然也可以白嫖100 下面有个在线调试…...
leetcode 198. House Robber
本题是动态规划问题。 第一步,明确并理解dp数组以及下标的含义 dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额,具体怎么偷这里不考虑,第i1号及之后的房间也不考虑。换句话说,dp[i]也就是只考虑[0,i]号…...
【2025软考高级架构师】——软件架构设计(4)
摘要 本文主要介绍了几种软件架构设计相关的概念和方法。包括C2架构风格的规则,模型驱动架构(MDA)的起源、目标、核心模型及各模型之间的关系;软件架构复用的概念、历史发展、维度、类型及相关过程;特定领域架构&…...
分发饼干问题——用贪心算法解决
目录 一:问题描述 二:解决思路 贪心策略(C语言)算法复习总结3——贪心算法-CSDN博客 三:代码实现 四:复杂度分析 一:问题描述 分发饼干问题是一个经典的可以使用贪心算法解决的问题…...
深入详解MYSQL的MVCC机制
参考资料: 参考视频(注意第二个视频关于幻读的讲解是错误的,详情见本文) redoLog的结构详解 参考资料 学习内容: 1. MVCC要解决的问题 MVCC要解决的问题是,在不产生脏读等数据库问题的前提下,数据库的查询语句和更改语句不相互阻塞的情况; 在InnoDB中,MVCC仅仅存…...
DNS域名解析
目录 一.DNS 1.1DNS的简介 1.2DNS的背景 1.3DNS的架构 1.4实现DNS的方式 1.5DNS的查询类型 1.6DNS解析的基本流程 二.主从复制 2.1定义 2.2优缺点 三.DNS服务软件 3.1bind 3.1.1定义 3.1.2bind相关文件 3.2DNS服务器的核心文件 3.2.1主配置文件 3.2.2域名文件 …...
Java基础:一文讲清多线程和线程池和线程同步
01-概述 02-线程创建 继承Thread 实现Runnable(任务对象) 实现Callable接口 public class ThreadDemo3 {public static void main(String[] args) throws ExecutionException, InterruptedException {// 目标:线程创建3// 需求:求1-100的和Callable<…...
ubuntu 20.04 连不上蓝牙耳机/蓝牙鼠标
sudo gedit /etc/bluetooth/main.conf改为 ControllerMode dual然后重启蓝牙服务 sudo service bluetooth restart...
SaaS、Paas、IaaS、MaaS、BaaS五大云计算服务模式
科普版:通俗理解五大云计算服务模式 1. SaaS(软件即服务) 一句话解释:像“租用公寓”,直接使用现成的软件,无需操心维护。 案例:使用钉钉办公、在网页版WPS编辑文档。服务提供商负责软件更新和…...