-
new
Linux:线程的互斥与同步
一、买票的线程安全 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。 多个线程并发的操作共享变量,会带来一些问题。 我们模拟多个线程抢票的过程 ticket共享数据导致了数据不一致问题,这必然是和多线程访问是有关系的!而会出现多多卖三张票,肯定和--的操作有关!他是不安全的!! 问题:那么为什么全局变量的++、--操作不安全呢?? ——> --ticket 操作本身就不是一个原子操作!!经过编译器后会变成3条汇编语句:(1)内存将数据写到cpu (2)cpu进行运算 (3)cpu将数据写会内存 所以是当ticket为1的时候,刚进行完第一条汇编语句(此时--操作还没有执行),他将自己的上下文信息(此时还是1)带走,然后切换成其他线程了,所以导致ticket依旧被--(变成0),而当返回到之前那个线程的时候,他又将上下文信息恢复了(ticket恢复成1)然后又--。最后导致共享数据的线程安全问题!! 所以线程在被切换过来执行的时候,将共享数据加载到cpu的本质就是把数据的内容变成自己的上下文信息,而当被切换走的时候他会把这个信息带走(以拷贝的方式放在自己的PCB结构体中),当线程再次切换回来的时候再把上下文信息恢复过来 问题2:所以我们要怎么解决这个问题呢?? ——>对共享数据的任何访问,保证任何时候只有一个执行流访问!(需要互斥——>锁) 二、互斥量(锁) pthread_mutex_t是锁的类型 2.1 锁的接口 1、初始化互斥量(两种方法) 方法1:静态分配 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER 方法2:动态分配 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexatt……
SE_Wang 2025-01-170 0 0 -
new
Python编程中的两种主要的编程模式
在Python编程中,有两种主要的编程模式被广泛使用:面向过程编程(Procedural Programming) 和 面向对象编程(Object-Oriented Programming, OOP)。这两种模式各有优缺点,适用于不同的场景。 1. 面向过程编程(Procedural Programming) 面向过程编程是一种基于函数和过程的编程范式。在这种模式下,程序被组织成一系列的函数调用,这些函数按照特定的顺序执行,以实现特定的任务。 特点: 函数:程序由一系列函数组成,每个函数执行特定的任务。 线性流程:程序按照函数的调用顺序依次执行。 简单直观:对于小型和简单的任务,面向过程编程通常更直接和易于理解。 示例: def add(a, b): return a + b def subtract(a, b): return a - b def main(): x = 10 y = 5 sum_result = add(x, y) diff_result = subtract(x, y) print(f"Sum: {sum_result}, Difference: {diff_result}") if __name__ == "__main__": main() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2. 面向对象编程(Object-Oriented Programming, OOP) 面向对象编程是一种基于对象和类的编程范式。在这种模式下,程序被组织成一系列的对象,这些对象通过类来定义,并包含数据(属性)和行为(方法)。 特点: 类(Class):定义对象的蓝图,包含属性和方法。 对象(Object):类的实例,具有状态(属性)和行为(方法)。 封装(Encapsulation):隐藏对象的内部状态,只暴露必要的接口。 继承(Inheritance):允许新类继承现有类的属性和方法,实现代码重用。 多态(Polymorphism):允许不同类的对象对同一消息作出响应,实现接口的统一。 示例: class Calculator: def __init__(self, a, b): self.a = a self.b = b def add(self): return self.a + self.b def subtract(self): return self.a - self.b def main(): calc = Calculator(10, 5) s……
SE_Gai 2025-01-171 0 0 -
【Linux】深入理解文件系统(超详细)
一.磁盘 任何人根据将Linux文件系统的人,如果不给你讲磁盘,文件系统讲的再好也只是空中楼阁,因为你的大脑思考中,无法建立在无法想象的结构之中。 先看看磁盘的结构: 1-1 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯⼀的⼀个机械设备 磁盘--- 外设 慢 容量⼤,价格便宜 📌补充: 关于磁盘 --- 磁铁 磁盘也只认二进制,磁盘上的二进制怎么理解呢? 因为磁盘光滑的面,我们可以把磁盘想象成上百亿的小磁铁构成,规定南北极,比如北极为1,南极为0,所有我们磁盘立马可以进行0 1保存。 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 网络数据传输 在网络通信中,尤其是在有线网络中,数据通常以电信号的形式进行传输。常见的以太网标准中,就是利用电压的高低电平来表示二进制的 0 和 1。例如,在双绞线中,规定高电平代表一种逻辑状态(如 1),低电平代表另一种逻辑状态(如 0)。通过在传输线路上快速地切换高低电平,就可以实现数据的编码和传输。 磁盘数据存储 磁盘存储数据的原理是基于磁性材料的磁化特性。当磁头对盘片上的磁性材料进行写入操作时,通过控制磁头线圈中的电流方向,产生不同方向的磁场,使盘片上的磁性材料按照特定的方向被磁化。通常规定一种磁化方向代表 1,另一种磁化方向代表 0。读取数据时,磁头检测盘片上磁性材料的磁化方向,将其转换为相应的电信号,从而还原出存储的数据。 📌计算机只认二进制,这是一种宏观的说法,在不同的设备上,是由不同物理特性表现的,不同硬件,对二进制表达是不一样的!!! 📌如果有一块磁盘要进行销毁该怎么办? 不能直接进行破坏,因为可以恢复,让磁盘退磁,就可以,高温消磁!!! 1-2 磁盘存储结构 📌磁盘作为计算机中唯一的机械部件,通常由一个或多个旋转的盘片组成,每个盘片有两个面,每个面上有一层磁性材料。通过主……
SE_Wang 2025-01-166 0 0 -
Docker Compose一键部署Spring Boot + Vue项目
前提条件 概述 Compose简介 Compose文件 Compose环境 Compose命令 帮助命令 关键命令 Compose部署项目 初始化环境 查看代码文件 sql数据准备 nginx配置文件准备 创建 compose.yaml 一键启动compose多个容器 浏览器访问虚拟机ip:80(可省略默认的80端口) 查看Compose运行的容器 查看容器日志 关闭并删除Compose开启的容器 前提条件 熟悉Docker、Spring Boot 、Vue基本知识 熟悉yaml文件基本知识,可参考:YAML 入门教程 掌握Docker部署Spring Boot + Vue项目方法,可参考:Docker部署Spring Boot + Vue项目 概述 本文在普通的Docker部署Spring Boot + Vue项目 的基础上进行。部署若依前后端分离版项目为例,重点在于如何使用Docker Compose的方式加快项目部署过程。 此前使用Docker部署一个Spring Boot + Vue项目,包含了4个容器: MySQL Redis Java后端 Nginx前端 而稍微复杂的项目,还会有各种各样的其它中间件,需要部署的容器远不止4个。如果还像之前那样手动的逐一部署,就太麻烦了。 而Docker Compose就可以帮助我们实现 多个相互关联的Docker容器的快速部署。 Compose简介 Docker Compose 是一个用于定义和运行多容器应用程序的工具,是实现精简且高效的开发与部署体验的关键所在。 它简化了对整个应用程序栈的控制,能够通过一个易于理解的 YAML 配置文件轻松管理服务、网络和存储卷。然后,只需一条命令,就能依据配置文件创建并启动所有服务。 Docker Compose 可在所有环境中工作,包括生产、预发布、开发、测试环境以及持续集成(CI)工作流程。它还具备用于管理应用程序整个生命周期的命令,比如: 启动、停止和重建服务。 查看正在运行服务的状态。 流式输出正在运行服务的日志内容。 在某个服务上运行一次性命令。 通过使用 Docker Compose,使用一个名为 Compose 文件的 YAML 配置文件来配置应用程……
SE_Gai 2025-01-163 0 0 -
鸿蒙心路旅程:HarmonyOS NEXT 心路旅程:技术、成长与未来
技术的浪潮中,总有一些瞬间让人感到心潮澎湃。作为一名HarmonyOS NEXT开发者,我有幸成为这个时代科技创新的一部分。从最初的接触到深入学习、开发,以及如今规划未来的职业方向,这段旅程不仅让我成长为一名技术人,也让我深刻感受到分布式操作系统所承载的无限可能。 一、初识HarmonyOS NEXT:起点与动力 每个开发者都有一个让自己心生向往的技术领域,而HarmonyOS NEXT对我来说,就是这样一个激励人心的目标。 1. 初次接触的契机 最初了解HarmonyOS,是因为市场对于分布式操作系统的广泛关注。HarmonyOS作为一个跨设备、跨场景的全新分布式操作系统,其核心理念 “一次开发,多端部署” 一下子吸引了我。无论是智能手机、平板电脑,还是智能穿戴设备甚至物联网终端,HarmonyOS提供了一种崭新的协作方式。我开始深入研究HarmonyOS NEXT,发现它在技术架构、生态开放性和开发者友好性上都有极高的价值。 2. 动力来源:技术热情与生态潜力 选择学习HarmonyOS NEXT,不仅仅是对技术的热爱,更是因为看到了它在未来智能生态中扮演的重要角色。分布式技术、无缝设备协同以及多模态交互这些领域,都让我意识到,成为一名HarmonyOS开发者,不仅是在学一门技术,更是在参与未来智能世界的塑造。 二、从入门到精通:学习与开发的蜕变 进入HarmonyOS NEXT开发者社区后,我真正体验到了一次全方位的成长。从理论学习到实际项目开发,这一路充满了挑战与突破。 1. 技术学习:从理论到实践的跨度 HarmonyOS的分布式能力: 最初接触HarmonyOS时,我对分布式操作系统的核心概念充满疑惑。如何让多个设备组成一个"超级终端",如何在不同设备之间高效分发任务?这是我在学习初期最大的难题。通过研究官方文档、参加开发者论坛的讨论,我逐步掌握了HarmonyOS分布式软总线的原理和开发技巧。 多设备交互: 另一个挑战是如何实现多……
SE_Wang 2025-01-154 0 0 -
MySQL数据库(SQL分类)
SQL分类 分类 全称 解释 DDL Data Definition Language 数据定义语言,用来定义数据库对象(数据库,表,字段) DML Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改 DQL Data Query Language 数据查询语言,用来查询数据库中表的记录 DCL Data Control Language 数据控制语言,用来创建数据库用户,控制数据库的访问权限 DDL 数据库操作 -- 查询 --查询所有数据库 show databases; --查询当前数据库 select database(); --创建数据库 create database [if not exists] 数据库名[defaul charset 字符集] [collate 排序规律]; --删除 drop database [if exists]数据库名; --使用 use 数据库名; 1 2 3 4 5 6 7 8 9 10 11 注:数据库语言不区分大小写 数据库语言都以分号结尾 表操作 查询表 --查询当前数据库所有表 show tables; -- 查询表结构 desc 表名; -- 查询指定表的建表语句 show create table 表名; 1 2 3 4 5 6 创建表 create table 表名( 字段1 字段1类型[comment 字段1注释] 字段2 字段2类型[comment 字段1注释] 字段3 字段3类型[comment 字段1注释] ....... ) [comment 表注释]; 1 2 3 4 5 6 comment 为可选项,作用类似是注释,解释字段或表 create table user( id int comment '编号', name varchar(50) comment '姓名', age int comment '年龄', gender varchar(50) comment '性别' ) comment '用户表'; 1 2 3 4 5 6 查询表结构 查询建表语句 修改表 添加字段 alter table 表名 add 字段名 类型(长度)[comment 注释] [约束]; -- 在emp表增加一个新的字段“昵称”为nickname,类型为varchar(20) alter table emp add nickname varchar(20) comment "昵称"; 1 2 修改字段 1.修改数据 alter table 表名 modify 字段名 新数据类型(长度); 2.修改字段名和字段类型 alter table……
SE_Gai 2025-01-155 0 0 -
【Linux探索学习】第二十二弹——用户缓冲区:深入解析操作系统中数据交互时的缓冲区机制
我们讲解的重点会放在讲解什么是缓冲区上,对于缓冲区存在的作用和种类等方面上了解一下就行 一、什么是缓冲区? 1.1 问题提出 我们通过几个场景来揭露这个问题,首先我们先来看下面这串代码及其输出结果: #include<stdio.h> #include<string.h> #include<unistd.h> int main() { const char *fstr="hello fwrite\n"; const char *str="hello write\n"; //C语言接口 printf("hello printf\n"); //stdout -> 1 fprintf(stdout,"hello fprintf\n"); //stdout -> 1 fwrite(fstr,strlen(fstr),1,stdout); //fread, stdout -> 1 //操作系统提供的系统接口 write(1,str,strlen(str)); return 0; } 运行结果: 我们可以把这个结果输出重定向到指定文件中去 ./myfile>log.txt cat log.txt 但是如果我们在代码段的最后一行加入fork函数来创建子进程,我们就会得到一个不一样的输出结果: #include<stdio.h> #include<string.h> #include<unistd.h> int main() { const char *fstr="hello fwrite\n"; const char *str="hello write\n"; //C语言接口 printf("hello printf\n"); //stdout -> 1 fprintf(stdout,"hello fprintf\n"); //stdout -> 1 fwrite(fstr,strlen(fstr),1,stdout); //fread, stdout -> 1 //操作系统提供的系统接口 write(1,str,strlen(str)); fork(); return 0; } 运行结果: 我们发现再次输出重定向时结果发生了很大的改变,调用C语言接口的语句被打印了两遍,而系统调用接口则只被打印一遍,而且顺序也发生了变化,调用系统接口的先被打印 1.2 缓冲区概念的引出 为什么会出现这种情况呢?在解释之前我们先来看下面这种情况: #include<stdio.h> #include<string.h> #include<unistd.h> int main() { const char *fstr="h……
SE_Wang 2025-01-147 0 0 -
【Docker】入门教程
一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 2.compose.yaml 参考视频: https://www.bilibili.com/video/BV14WtLeDEit 一、Docker的安装 使用本机虚拟机或云平台 国内常见云平台:阿里云、腾讯云、华为云、青云...... 使用CentOS 7.9 # 移除旧版本docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 配置docker yum源。 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 最新 docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 启动& 开机启动docker; enable + start 二合一 systemctl enable docker --now # 配置加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "https://docker.m.daocloud.io" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 二、Docker的命令 #查看运行中的容器 docker ps #查看所有容器 docker ps -a #搜索镜像 docker search nginx #下载镜像 docker pull nginx #下载指定版本镜像 docker pull nginx:1.26.0 #查看所有镜像 docker images #删除指定id的镜像 docker rmi e784f4560448 #运行一个新容器 docker run nginx #停止容器 docker stop keen_blackwell #……
SE_Gai 2025-01-142 0 0 -
检查一个CentOS服务器的配置的常用命令
在CentOS系统中,查看服务器配置的常用命令非常丰富,这些命令可以帮助用户快速了解服务器的硬件信息、系统状态以及网络配置等。以下是一些常用的命令及其简要说明: 1. 查看CPU信息 (1) cat /proc/cpuinfo:显示CPU的详细信息,包括型号、频率、缓存等级以及每个核心的数量等。 ( ) lscpu:以更简洁的方式显示CPU的架构信息,如插槽数、核心数、线程数等。 2. 查看内存信息 命令: free -h 3. 查看硬盘信息 (1)df -h:显示文件系统的磁盘空间使用情况,包括每个挂载点的磁盘空间、已用空间和可用空间等,结果以易于阅读的格式显示。 (2)lsblk:列出所有可用的存储设备及其分区信息。 (3)fdisk -l:查看硬盘的分区表信息。 4. 查看系统的内存使用情况 (1)free -m:显示内存的使用情况,包括总内存、已用内存、空闲内存等,结果以MB为单位。 (2)cat /proc/meminfo:显示内存的详细使用情况,包括物理内存、交换空间等。 5.查看运行的进程信息 ps aux:查看当前系统中运行的进程信息。 6.查看当前服务器的系统进程及资源占用情况 命令:top 7 . 系统性能监控 (1)vmstat:显示关于系统内存、进程、中断、CPU活动等的信息。 (2)iostat:监视系统输入输出设备和CPU的使用情况。它是sysstat软件包的一部分,可能需要先安装。 (3)sar:收集、报告或保存系统活动信息。它也是sysstat软件包的一部分,提供了关于CPU、内存、磁盘和网络等性能的详细报告。 8.查看服务器的网络配置信息 (1)ifconfig(注意:在某些新版本的CentOS中,ifconfig命令可能已被ip addr命令替代):显示网络接口的配置信息,包括IP地址、子网掩码、广播地址等。 (2)ip addr:显示网络接口的配置信息,是ifconfig命令的现代替代品。 (3)netstat -tuln:显示当前系统的网络连接、路由表、接口统计等信息,其中-tuln选项用于显示TCP和UDP协议的监听端……
SE_Wang 2025-01-137 0 0 -
Kubernetes:基础的架构
kubernetes的一个简单机构图形 k8s 主要分为两个大结构 : 1 控制面:master 是集群的大脑和心脏 2 数据面:worker 主要在master 的指挥下进行工作,也称之为node kubectl 是k8s的管理工具 我们可以使用kubectl get node来查看节点的状态 因为 Master 和 Node 的划分不是绝对的。当集群的规模较小,工作负载较少的时候,Master 也可以承担 Node 的工作 使用kubectl get pod 来查看pod的状态 master节点内部的结构 Kubernetes 的节点内部也具有复杂的结构,是由很多的模块构成的,这些模块又可以分成组件(Component)和插件(Addon)两类。 组件是k8s的核心功能的特性,而插件是一些附件的功能,是一些锦上添花的作用。 Master的组件构成有哪些? apiserver 是 Master 节点,是整个 Kubernetes 系统的唯一入口,它对外公开了一系列的 RESTful API,并且加上了验证、授权等功能,所有的组件都必须通过apiserver来沟通。 etcd 是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状态,主要做K8S的配置。 任何其他组件想要读写ETCD 必须通过apiserver来实现 scheduler 负责容器的编排工作,检查节点的资源状态,把pod调度到合适的节点来运行,因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得。 controller-manager 负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能。必须通过apiserver 获取etcd中的节点和资源状态来进行工作。 通过 kubectl get pod -n kube-system 我们可以查看组件的状态 node节点内部都有哪些组件? kubelet 是 Node 节点的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,负责Node节点的运行维护。 kube-proxy 的作用有点特……
SE_Gai 2025-01-131 0 0