-
【Linux】线程安全与锁概念——自旋锁、读写锁
一:🔥 线程安全和重⼊问题 线程安全:就是多个线程在访问共享资源时,能够正确地执⾏,不会相互⼲扰或破坏彼此的执⾏结果,也不会出现数据不一致的问题。⼀般⽽⾔,多个线程并发同⼀段只有局部变量的代码时,不会出现不同的结果。但是对全局变量或者静态变量进⾏操作,并且没有锁保护的情况下,容易出现该问题。 重⼊:同⼀个函数被不同的执⾏流调⽤,当前⼀个流程还没有执⾏完,就有其他的执⾏流再次进⼊,我们称之为重⼊。⼀个函数在重⼊的情况下,运⾏结果不会出现任何不同或者任何问题,则该函数被称为可重⼊函数,否则,是不可重⼊函数。 🍥 学到现在,其实我们已经能理解重⼊其实可以分为两种情况 多线程重⼊函数。 信号导致⼀个执⾏流重复进⼊函数。 结论 : 不要被上⾯绕⼝令式的话语唬住,你只要仔细观察,其实对应概念说的都是⼀回事。 🦋 可重⼊与线程安全联系 🍡 函数是可重⼊的,那就是线程安全的 (其实知道这⼀句话就够了) : 🍡 函数是不可重⼊的,那就不能由多个线程使⽤,有可能引发线程安全问题 🍡 如果⼀个函数中有全局变量,那么这个函数既不是线程安全也不是可重⼊的。 🦋 可重⼊与线程安全区别 🍡 可重⼊函数是线程安全函数的⼀种 🍡 线程安全不⼀定是可重⼊的,⽽可重⼊函数则⼀定是线程安全的。 🍡 如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重⼊函数若锁还未释放则会产⽣死锁,因此是不可重⼊的。 📌 注意: 如果不考虑 信号导致⼀个执⾏流重复进⼊函数 这种重⼊情况,线程安全和重⼊在安全⻆度不做区分 但是线程安全侧重说明线程访问公共资源的安全情况,表现的是 并发线程的特点 可重⼊描述的是⼀个函数是否能被重复进⼊,表⽰的是 函数的特点 二:🔥 常⻅锁概念 🦋 2-1 死锁 死锁是指在⼀组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站⽤不会释……
SE_Wang 2024-12-0912 0 0 -
检查安装场所
2.2.1 承重要求 请根据所安装交换机及其附件(比如机柜、机箱、单板、电源等)的实际重量来评估地面承重要求, 并确保安装场所地面的承重能力满足此要求。 2-4 评估地面承重时,请考虑未来交换机扩容(比如增加单板)的需要。 2.2.2 温度要求 为保证交换机正常工作,机房内需维持一定的温度。工作环境温度要求请参见 表 2-1。 表2-1 工作环境温度要求 项目 要求 工作环境温度 0°C~40°C(长期) -10°C~50°C(短期:连续工作不超过96小时,一年中累计时间不超过15天) 贮存环境温度 -40°C~+70°C 当交换机从低温环境进入高温环境时,如果交换机上出现冷凝水,那么请在交换机上电前,务必采 取一定的措施(如烘干、晾干等),以防交换机内部器件发生短路被烧坏。 2.2.3 湿度要求 为保证交换机正常工作,机房内需维持一定的湿度。工作环境湿度要求请参见 表 2-2。 表2-2 工作环境湿度要求 项目 要求 工作环境湿度 5%~95%(无冷凝) 贮存环境湿度 5%~95%(无冷凝) 若机房内长期湿度过高,易造成绝缘材料绝缘不良甚至漏电,有时也易发生材料机械性能变化、金 属部件锈蚀等现象。 若机房内相对湿度过低,绝缘垫片会干缩而引起紧固螺钉松动,同时在干燥的气候环境下,易产生 静电,危害交换机上的电路。 2.2.4 洁净度要求 灰尘对交换机的运行安全是一大危害。室内灰尘落在机体上,可以造成静电吸附,使金属接插件或 金属接点接触不良。尤其是在室内相对湿度偏低的情况下,更易造成静电吸附,不但会影响交换机 寿命,而且容易造成通信故障。
SE_Gai 2024-12-096 0 0 -
自己构建服务器 | 实现网页分离 | 设计思路
一. 最简单的HTTP服务器 基于上一篇文章的理论: 我们可以尝试实现一个简单的 HTTP 服务器,它可以接受客户端连接并返回一个 "Hello World" 网页。为了详细说明这段代码,让我们逐行进行解释。 #include <sys/socket.h> // 引入套接字相关的头文件 #include <netinet/in.h> // 引入处理IPv4地址的头文件 #include <arpa/inet.h> // 引入INET相关函数的头文件 #include <unistd.h> // 引入UNIX标准函数,如close() #include <stdio.h> // 引入标准输入输出头文件 #include <string.h> // 引入字符串处理函数的头文件 #include <stdlib.h> // 引入标准库函数,如atoi() 这些头文件包含了程序所需的各种函数和类型: sys/socket.h: 提供套接字函数和数据结构。 netinet/in.h: 提供了用于处理 IPv4 地址的结构和函数。 arpa/inet.h: 提供了用于操作 IP 地址的函数,如 inet_addr。 unistd.h: 提供了 UNIX 标准函数,如 close。 stdlib.h: 提供了一些标准库函数,如 atoi。 void Usage() { printf("usage: ./server [ip] [port]\n"); } 定义了一个 Usage 函数,该函数打印使用说明,说明程序需要两个命令行参数,即 IP 地址和端口号。 int main(int argc, char* argv[]) { 程序的 main 函数开始。 if (argc != 3) { Usage(); return 1; } 检查命令行参数的数量。如果参数数量不等于 3(程序名、IP 地址和端口号) int fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { perror("socket"); // 如果创建失败,打印错误信息 return 1; } 创建一个套接字。AF_INET 表示使用 IPv4,SOCK_STREAM 表示使用 TCP。 struct sockaddr_in addr; // 定义一个地址结构体 addr.sin_family = AF_INET; // 设置为IPv4地址族 addr.sin_addr.s_addr = inet_addr(argv[1]); // 设置IP地……
SE_Wang 2024-12-0619 0 0 -
安装前的准备
通用安全建议 • 请采取必要的安全保护措施(如在交换机安装过程中,请佩戴防静电手腕等),以确保您和系 统的安全。 • 确保您所处位置的地面是干燥、平整的,并确保您已做好防滑措施。 • 保持交换机清洁、无尘,请勿将交换机放置在潮湿的地方,也不要让液体进入交换机内部。 • 请勿将交换机和安装工具放在行走区域内。 • 交换机整机以及相关部件(比如电源、机箱等)比较重,在搬运、抬举时,请多人配合,并 注意人身安全。
SE_Gai 2024-12-066 0 0 -
服务器连接盘柜后无法启动
服务器连接盘柜后无法启动 非UEFI操作系统: 电源或重新启动系统并按F1 时提示输入设置。 选择系统设置 ,然后按Enter键。 选择Devices and I/O Ports并按Enter键。 选择启用/禁用旧选项Legacy Option ROMs ,并按Enter键。 在启用/禁用原有选件ROM 选择插槽号的HBA安装并按Enter键。 选择已禁用 并按Enter键。 在启用/禁用UEFI选项ROM 选择插槽号的HBA安装并按Enter键。 选择已禁用 并按Enter键。 按Esc键 三次返回到系统配置主菜单,选择Save Settings ,然后按Enter键。 选择Boot Manager 并按Enter键。 选择添加引导 选项并按Enter键。 选择仅旧 并按Enter键。 按Esc键返回到Boot Manager。 选择更改引导顺序 并按Enter键。 选择现有的引导顺序并按Enter键。 选择仅旧 ,然后按+键来推动到一个位置上的本地设备包含操作系统。 通常,这将高于硬盘〇。 按Enter键。 选择落实 更改并按Enter键。 按Esc键返回到Boot Manager。 选择复位系统 并按Enter键
SE_Zhang 2024-12-066 0 0 -
【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间
一、什么是进程地址空间? 进程地址空间是操作系统为每个进程分配的一块独立的虚拟地址范围,用于存储程序代码、数据和栈等运行所需的内容。操作系统通过虚拟内存技术,使每个进程拥有一个独立的地址空间,与物理内存隔离。 1.1 进程地址空间的特点 虚拟化:每个进程的地址空间是独立的虚拟地址,互不干扰。 隔离性:一个进程不能直接访问另一个进程的地址空间,提供了安全性。 统一性:操作系统通过页表将虚拟地址映射到物理地址,对用户透明。 二、进程地址空间的结构 操作系统将进程地址空间划分为多个区域,每个区域用于存储特定类型的数据。以下是典型的地址空间布局: 地址区域 描述 代码段 存储可执行代码的指令。只读,通常不可修改。 数据段 存储已初始化的全局变量和静态变量。 BSS段 存储未初始化的全局变量和静态变量。 堆(Heap) 动态分配的内存区域(如malloc分配的内存)。向高地址增长。 栈(Stack) 函数调用相关的局部变量、返回地址等。向低地址增长。 内核空间 操作系统内核相关的代码和数据。用户态无法直接访问。 2.1 地址空间布局图 以32位操作系统为例,地址空间布局如下: +---------------------------+ 0xFFFFFFFF | 内核空间 | +---------------------------+ 0xC0000000 | 用户栈 | +---------------------------+ | 动态分配的堆(Heap) | +---------------------------+ | BSS段 | +---------------------------+ | 数据段 | +---------------------------+ | 代码段 | +---------------------------+ 0x00000000 三、各段的详细说明 3.1 代码段 存储内容:存放程序的可执行代码。 访问权限:只读,防止程序意外修改指令。 特点:多个进程可以共享同一段代码段(如共享库)。 3.2 数据段 存储内容:存储已初始化的全局变量和静态变量。 访问权限:读写权限。 特点:程序运行时……
SE_Wang 2024-12-0513 0 0 -
Linux探秘坊——-1.系统核心的低语:基础指令的奥秘解析(1)
1.Linux的背景介绍 Linux 操作系统的发展历程充满了激情与创新喵~🎀 萌芽期 (1983 - 1991):Linux 的历史可追溯到 1983 年,理查德·斯托曼 (Richard Stallman) 发起 GNU 计划,目标是创建一个自由软件操作系统。1987 年发布的 MINIX 是一个小型 UNIX 系统,为 Linux 提供了灵感。 诞生 (1991):1991 年,芬兰大学生林纳斯·托瓦兹 (Linus Torvalds) 开始编写自己的内核并将其命名为 Linux。他在网上发布了源代码,许多人加入到改进和完善的过程中。 快速发展 (1992 - 2000):1992 年,Linux 内核采用 GPL 开源许可证。越来越多的开发者参与其中,Linux 变得更加稳定,丰富的社区支持推动了软件包和驱动的开发。1994 年,发布了第一个成熟的 Linux 版本 (Linux 1.0)。 企业应用 (2000 - 2010):随着开源社区的壮大,Linux 开始受到企业青睐,特别是服务器领域。许多公司,如 Red Hat、SUSE 等,推出了商业版本的 Linux 操作系统,用于服务器、企业系统。 现代化 (2010 - 现在):Linux 已经成为全球服务器市场和云计算的主流选择,同时也是 Android 系统的核心。Linux 被广泛应用于嵌入式系统、物联网、超级计算机等领域,甚至在桌面系统上也逐渐受到欢迎。 Linux 的发展历程是一个开源社区、技术创新和用户需求相结合的传奇故事,它已成为全球最重要的操作系统之一 发行版本: 我主要使用 XShell 远程登录 Linux 下载安装 XShell:下载链接 小技巧 : 2.ls 指令 ls:当前目录下的所有 普通文件和子目录 语法: ls [选项][目录或文件] 1.且看第一行中的" ls -l"(" "空格不能省略!!!!!!) 2. 其中,ls是命令 3. 而 -l是选项 功能:(1)对于目录,该命令列出该目录下的所有 子目录 与 文件 。 (2)对于 文件,将列出 文件名 以及其他信息 3.常用选项(目前): -a 列出目录下的所有文件,包括以 . 开头的 隐含……
SE_Wang 2024-12-047 0 0 -
机箱外观及其说明
• S12504-DC 与 S12504-AC 机箱外观类似,本文中不再分别举例;S12508 和 S12518 同样处理。 • 交换机外观请以实际发货为准,本指导中的图片仅供参考。 1. S12504 机箱外观及其说明 图1-1 S12504 前视图 (1): 主控板槽位(0~1号槽位) (2): 业务板槽位(2~5号槽位) (3): 电源框前面板 (4): 电源开关面板 (5): 防静电手腕插孔 电源框前面板可上翻,翻开后可见电源框槽位。 1-3 图1-2 S12504 后视图 (1):风扇框 (2): 电源进线模块(PEM) (3):接地螺钉 (4): 通风面板 (5): 防静电手腕插孔 (6): 交换网板槽位(6~9号槽位) • S12504 正面提供 2 个主控板槽位和 4 个业务板槽位,背面提供 4 个交换网板槽位。 • 机箱底部有 1 个电源框,最多可配置 6 个电源模块。 • 机箱后部配置了 1 个竖插式的风扇框,机箱内空气流向请参见“2.2.8 通风要求”。 4 5 6 1 2 3 1-4 2. S12508 机箱外观及其说明 图1-3 S12508 前视图 (1): 电源框前面板 (2): 上走线架 (3): 主控板槽位(0~1号槽位) (4): 下走线架 (5): 机箱进风口 (6): 防静电手腕插孔 (7): 业务板槽位(2~9号槽位) (8): 电源开关面板 图1-4 S12508 后视图 (1): 电源进线模块(PEM) (2): 上风扇框 (3): 下风扇框 (4): 通风面板 (5): 接地螺钉 (6): 防静电手腕插孔 (7): 交换网板槽位(10~18号槽位) (8): 机箱出风口 (9): 电源出风口 • S12508 正面提供 2 个主控板槽位和 8 个业务板槽位,背面提供 9 个交换网板槽位。 • 机箱顶部有 1 个电源框,最多可配置 6 个电源模块。 • 机箱后部配置了上下 2 个横插式的风扇框,机箱内空气流向请参见“2.2.8 通风要求”。 1-6 3. S12518 机箱外观及其说明 图1-5 S12518 前视图 (1): 电源框前面板 (2): 上走线架 (3): 主控板槽位(0~1号槽位) (4): 业务板槽位(2~19号槽位) (5): 下走线架 (6): 机箱进风口 (7): 防静电……
SE_Gai 2024-12-045 0 0 -
Linux下学【MySQL】表的必备操作
表的操作 对于表的操作需要注意的是: 不要轻易的去修改表的名字,类型,结构 因为数据库表是在比较底层的,当修改了表后,上层代码很大可能会发生问题! 1.创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 具体使用: 1. create table if not exists user1( id int, name varchar(20) comment '用户名', password char(32) comment '密码', birthday date comment '生日' )character set utf8 collate utf8_general_ci engine MyIsam; 其中 comment 是该名称的别名,方便查看 if not exists 和库的一样,判断是否有存在 2. create table user2( id int, name varchar(20) comment '用户', password char(32) comment '密码', birthday date comment '生日' )charset=utf8 collate=utf8_general_ci engine=InnoDB; 对比两次创表过程:最后的字符集和校验规则以及存储引擎 有两种自定义的方法: character set utf8 collate utf8_general_ci engine MyIsam; charset=utf8 collate=utf8_general_ci engine=InnoDB; 1.1 表的存储引擎 user1 表存储引擎是 MyISAM ,在数据目中有三个不同的文件,分别是: user1.frm:表结构 user1.MYD:表数据 user1.MYI:表索引 user2 表存储引擎是 InnoDB ,在数据目中有的文件是: user2.frm:表结构 user2.ibd:表空间文件,用于存储数据和索引 附: 当不指定写字符集和校验规则以及存储引擎的话就会默认成配置文件所默认的。配置文件所在的地址:/etc/my.cnf 1.2查看表 语法: show tables; 1.2.1 查看表结构(详细信息) 语法: desc 表名; 1.2.2 查看创建表的语句 语法: show create table 表名; show create table 表名 \G;#加上\G格式化展示 1.2.3 查看创建表中的……
SE_Wang 2024-12-0318 0 0 -
简介
H3C S12500 系列路由交换机是杭州华三通信技术有限公司(以下简称 H3C)自主研发的、基于 100G 平台的新一代核心路由交换机。 S12500 目前提供的主机型号如 表 1-1 所示。 表1-1 S12500 主机型号 主机型号 供电方式 主控板槽位数 业务板槽位数 交换网板槽位数 S12504-AC 交流 2 4 4 S12504-DC 直流 2 4 4 S12508-AC 交流 2 8 9 S12508-DC 直流 2 8 9 S12518-AC 交流 2 18 9 S12518-DC 直流 2 18 9 • 业务板槽位可以安装以太网接口板和 OAA 业务板。关于以太网接口板和 OAA 业务板的具体型 号,可参见“附录 A 交换机硬件规格”。 • 本指导中若无特殊说明,S12500 各型号主机的硬件配置、安装情况一致。
SE_Gai 2024-12-036 0 0