Linux系统调用编程
目录
- 1.Linux下进程和线程
- 进程
- 线程
- 区别
- 查看进程pid
- 终止进程pid
- 2.Linux虚拟内存管理与stm32内存映射
- 设计目标与架构差异
- 地址空间管理机制对比
- 内存使用与性能特性
- 3.Linux系统调用函数
- fork()
- wait()
- exec()
- 4.树莓派环境下练习
- 创建账号
- 1创建用户账号
- 2.配置用户权限
- 3.查看用户
- 登录自己的账号进行练习
- 1. 安装GCC编译器
- 2. 编写包含`fork()`的C程序
- 3. 使用GCC编译
- 4. 运行程序
1.Linux下进程和线程
进程
进程是系统分配资源的基本单位。每个进程都拥有独立的地址空间、内存、数据栈等系统资源
进程之间通过IPC(进程间通信)机制进行通信和数据共享
进程是程序的一次执行过程,它包含了程序代码、数据和系统资源(如打开的文件、网络连接等)
在Linux中,进程由进程ID(PID)唯一标识
线程
线程是CPU调度的基本单位。线程共享进程的资源,包括代码段、数据段、堆等,但每个线程拥有自己的栈和程序计数器
线程之间共享进程的资源,这使得线程间的通信和数据共享变得相对简单
线程的主要优点是并发执行和共享资源,可以充分利用多核CPU的并行处理能力
在Linux中,线程通常是通过pthread库来创建和管理的
区别
进程 | 线程 | |
---|---|---|
资源占用 | 拥有独立的资源空间 | 共享进程的资源 |
并发性 | 多个线程可以在同一个进程中并发执行 | 多个进程则需要通过IPC进行通信和协调 |
独立性 | 进程之间是完全独立的,一个进程的崩溃不会影响其他进程 | 线程共享进程的资源,一个线程的崩溃可能导致整个进程的崩溃 |
通信方式 | 通常需要使用系统调用或网络等机制 | 可以通过共享内存或全局变量等方式实现 |
查看进程pid
命令:
ps -a
终止进程pid
命令:
kill <PID>
2.Linux虚拟内存管理与stm32内存映射
设计目标与架构差异
Linux虚拟内存管理 | STM32物理内存映射 | 技术原理与引用来源 | |
---|---|---|---|
目标 | 实现多任务隔离、动态内存扩展及安全性,支持进程独立地址空间和内存超量分配(交换空间) | 为实时嵌入式系统提供确定性响应,直接控制硬件资源(如外设寄存器、SRAM) | Linux面向通用计算场景,需处理复杂调度;STM32面向实时控制,资源固定且无需动态扩展 |
硬件依赖 | 必须依赖MMU(内存管理单元)实现虚拟地址转换 | 无MMU支持,直接通过总线访问物理地址 | MMU通过页表实现虚拟→物理地址映射;STM32的Cortex-M系列CPU直接操作物理地址 |
地址空间管理机制对比
Linux虚拟内存管理 | STM32物理内存映射 | |
---|---|---|
地址转换 | 通过多级页表(如四级页表)和TLB缓存完成虚拟→物理地址转换 | 无地址转换,外设/存储器通过固定地址直接访问(如Flash起始于0x08000000,SRAM起始于0x20000000) |
内存分配 | 动态分页:按需分配物理内存(如malloc 触发缺页中断),支持交换空间(Swap)扩展可用内存 | 静态预分配:芯片设计时固定地址映射,无法动态扩展或重新分配 |
资源隔离 | 进程间完全隔离,通过页表权限位(读/写/执行)保护内存 | 无隔离机制,所有代码共享同一物理地址空间 |
内存使用与性能特性
Linux虚拟内存管理 | STM32物理内存映射 | |
---|---|---|
访问延迟 | 存在地址转换开销(TLB未命中时需查页表),但可通过预取和缓存优化 | 零转换延迟,直接访问物理地址(适用于实时控制) |
内存共享 | 支持进程间共享内存(如mmap 映射共享库),需同步机制 | 通过全局变量或硬件寄存器直接共享数据,无同步层但需开发者保证原子性 |
错误处理 | 缺页中断(Page Fault)自动加载数据到物理内存,崩溃仅影响当前进程 | 非法地址访问直接导致硬件错误(HardFault),可能引发系统复位 |
3.Linux系统调用函数
fork()
功能:复制当前进程(父进程),生成一个几乎完全相同的子进程。
执行流程:
-
父进程调用
fork()
后,内核创建子进程。 -
子进程继承父进程的代码段、数据段、堆栈、文件描述符等资源。
-
父子进程从
fork()
返回后开始并发执行,但拥有独立的地址空间。在 Linux 系统下使用 CMake 编译调用
fork
函数程序的完整步骤,结合*CMake 配置和 系统调用实现,具体流程如下:1.创建一个
main.c
文件,内容如下:#include <stdio.h> #include <unistd.h> // 包含 fork 系统调用的头文件int main() {pid_t pid = fork(); // 创建子进程if (pid < 0) {perror("fork 失败");return 1;} else if (pid == 0) {// 子进程代码printf("子进程 PID = %d (父进程 PID = %d)\n", getpid(), getppid());} else {// 父进程代码printf("父进程 PID = %d (子进程 PID = %d)\n", getpid(), pid);}return 0; }
2.在项目根目录下创建
CMakeLists.txt
,内容如下:cmake_minimum_required(VERSION 3.10) # 最低 CMake 版本要求 project(ForkDemo) # 项目名称# 添加可执行文件 add_executable(fork_demo main.c)# 设置 C 标准(可选) set(CMAKE_C_STANDARD 11)
3.构建与编译
创建构建目录并生成 Makefile:
mkdir build && cd build cmake .. # 生成 Makefile 和其他构建文件
编译程序:
make # 生成可执行文件 fork_demo
执行:
./fork_demo
结果如下:
wait()
-
功能:父进程阻塞等待任意子进程终止,并回收其资源(避免僵尸进程)。
-
补充:
waitpid()
可指定等待特定子进程或非阻塞模式1.创建一个
fork_wait.c
文件,内容如下:#include <stdio.h> #include <unistd.h> #include <sys/wait.h> // 必须包含此头文件以使用 wait()int main() {pid_t pid = fork();if (pid < 0) {perror("fork 失败");return 1;} else if (pid == 0) {// 子进程执行任务printf("子进程 PID = %d\n", getpid());sleep(2); // 模拟耗时操作printf("子进程结束\n");} else {// 父进程等待子进程结束printf("父进程 PID = %d,等待子进程 %d...\n", getpid(), pid);int status;wait(&status); // 阻塞等待子进程结束printf("子进程退出状态: %d\n", WEXITSTATUS(status));}return 0; }
2.在相同目录下创建
Makefile
,内容如下:# 定义编译器和编译选项 CC = gcc CFLAGS = -Wall -Wextra -std=c11# 定义目标可执行文件名和源文件 TARGET = fork_wait_demo SRC = fork_wait.c# 默认目标 all: $(TARGET)# 编译规则 $(TARGET): $(SRC)$(CC) $(CFLAGS) -o $@ $^# 清理生成的文件 clean:rm -f $(TARGET)# 伪目标声明(避免与同名文件冲突) .PHONY: all clean
3.编译与运行
编译程序:
make # 自动执行 Makefile 中的 all 目标
运行程序:
./fork_wait_demo
exec()
功能:替换当前进程的代码段,加载并执行一个新程序。
-
调用成功后,原进程的代码被新程序覆盖,但PID不变。
-
若失败,返回
-1
并保留原进程继续执行。gcc 命令行编译
1.创建一个名为
fork_exec.c
的文件,并将代码写入:
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程执行 ls -lexecl("/bin/ls", "ls", "-l", NULL);perror("exec failed"); // 若 exec 失败才会执行return 1;}return 0;
}
2.使用 GCC 编译代码,生成可执行文件 fork_demo
gcc -o fork_demo fork_exec.c
3.执行生成的可执行文件:
./fork_demo
4.树莓派环境下练习
创建账号
通过putty连接
ssh pi@<ip地址>
比如我的是:ssh pi@192.168.12.250
1创建用户账号
使用adduser
命令创建用户
sudo adduser username # 替换username为组员用户名
-
执行后会提示设置密码及用户信息(非必填项可直接回车跳过)
-
默认自动生成同名主目录
/home/username
2.配置用户权限
-
加入必要用户组(如
sudo
组赋予管理员权限)sudo usermod -aG sudo username # 将用户加入sudo组 sudo usermod -aG adm,dialout,plugdev username # 加入常用硬件访问组
-
验证用户权限:
id username # 查看用户所属组[6](@ref) groups username # 列出用户所有附加组
3.查看用户
通过 compgen
命令直接生成系统已知的用户名列表:
compgen -u
登录自己的账号进行练习
1. 安装GCC编译器
在树莓派Ubuntu系统中,默认可能未安装GCC。需通过以下命令安装:
sudo apt update
sudo apt install build-essential
此命令会安装GCC及编译所需的工具链(如make
、g++
等)
2. 编写包含fork()
的C程序
在home
目录下创建文件(例如fork_demo.c
),编写代码:
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {fprintf(stderr, "Fork失败\n");return 1;} else if (pid == 0) {printf("子进程ID: %d\n", getpid());} else {printf("父进程ID: %d,子进程ID: %d\n", getpid(), pid);}return 0;
}
3. 使用GCC编译
gcc -o fork_demo fork_demo.c
4. 运行程序
./fork_demo
参考链接:
Linux下进程和线程
Linux 内存管理 详解(虚拟内存、物理内存,进程地址空间)
Linux内存管理:深度解析与探索
一起玩儿树莓派——07 用户的创建、删除及其他相关命令
putty的复制和粘贴
相关文章:
Linux系统调用编程
目录 1.Linux下进程和线程进程线程区别查看进程pid终止进程pid 2.Linux虚拟内存管理与stm32内存映射设计目标与架构差异地址空间管理机制对比内存使用与性能特性 3.Linux系统调用函数fork()wait()exec() 4.树莓派环境下练习创建账号1创建用户账号2.配置用户权限3.查看用户 登录…...
AWS Langfuse AI用Bedrock模型使用完全教程
AWS Langfuse AI使用完全教程 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 AWS Langfuse AI使用完全教程Langfuse是什么?准备工作创建Langfuse账户1.创建LLM应用程序启用Bedrock…...
【Docker项目实战】使用Docker部署MediaCMS内容管理系统
【Docker项目实战】使用Docker部署MediaCMS内容管理系统 前言一、MediaCMS介绍1.1 MediaCMS 简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载Med…...
OpenHarmony子系统开发 - DFX(一)
OpenHarmony子系统开发 - DFX(一) 一、DFX概述 简介 在OpenHarmony中,DFX(Design for X)是为了提升质量属性的软件设计,目前包含的内容主要有:DFR(Design for Reliability,可靠性)…...
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
详解数据结构线性表 c++实现
线性表 线性表是一种非常基础且重要的数据结构,它是具有相同数据类型的 n(n≥0)个数据元素的有限序列。这里的 “有限” 意味着元素的数量是确定的,“序列” 则表示元素之间存在着顺序关系。 顺序表 顺序表是线性表的一种顺序存…...
Prolog语言的网络协议栈
Prolog语言的网络协议栈 引言 网络协议栈是现代计算机网络的重要组成部分,它负责在网络中的各个节点之间以标准化的方式传输数据。在这一体系中,不同层次的协议相互协作,以实现从物理传输到应用层数据处理的功能。Prolog是一种以符号逻辑为…...
音视频基础(音频常用概念)
文章目录 **1. 比特率(Bitrate)****概念****影响****音频比特率****视频比特率** **2. 码率(Bitrate)****3. 帧(Frame)****概念****视频帧****音频帧** **4. 帧长(Frame Length)****…...
洛谷题单3-P5725 【深基4.习8】求三角形-python-流程图重构
题目描述 模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。 输入格式 输入矩阵的规模,不超过 9 9 9。 输出格式 输出矩形和正方形 输入输出样例 输入 4输出 01020304 05060708 09101112 13141516010203040506 …...
【数据结构】邻接表 vs 邻接矩阵:5大核心优势解析与稀疏图存储优化指南
邻接表法 导读一、邻接矩阵的不足邻接表二、存储结构三、算法评价3.1 时间复杂度3.2 空间复杂度 四、邻接表特点4.1 特点解读特点3特点4特点5 结语 导读 大家好,很高兴又和大家见面啦!!! 图作为一种复杂的数据结构,其…...
编程能力的跃迁时刻:技术革命与认知重构的交响曲
在软件开发领域,从业者常将"一万小时定律"视为能力增长的圭臬,但真正的能力跃迁往往发生在特定技术范式转换的临界点。当开发者首次理解递归算法的本质,当面向对象编程替代过程式思维,当自动化工具链重塑开发流程,这些认知地震时刻往往成为技术生涯的分水岭。 …...
PostIn V1.0.8版本发布,IDEA 插件支持一键扫描上报,让接口定义不再繁琐
PostIn是一款国产开源免费的接口管理工具,包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块,支持常见的HTTP协议、websocket协议等,支持免登陆本地接口调试,同时可以对项目进行灵活的成员权限、消息通知管理等。本周Pos…...
删除Linux服务器上多余的系统启动项,并重装Ubuntu系统
问题描述 2024年6月,Centos团队终止维护Centos7系统,Ubuntu成了我的替换方案。正好有一台闲置的服务器,于是我临危受命给这台服务器重装系统。 经过我一番研究,Ubuntu系统初步安装成功了,但是存在一大堆问题ÿ…...
在亚马逊云科技上使用n8n快速构建个人AI NEWS助理
前言: N8n 是一个强大的工作流自动化工具,它允许您连接不同的应用程序、服务和系统,以创建自动化工作流程,并且采用了开源MIT协议,可以放心使用,他的官方网站也提供了很多的工作流,大家有兴趣的…...
JSON介绍及使用
1.JSON 1.JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据序列化协议,基于文本,完全独立于语言。 JSON由键值对组成,支持以下几种数据类型: 字符串:用双引号括起来的文本。 数…...
AOP 的织入过程是怎样的?
AOP(面向切面编程)的织入(Weaving)是将切面(Aspect)应用到目标对象(Target Object)并创建代理对象(Proxy Object)的过程。这个过程可以发生在不同的阶段&…...
链路聚合配置命令
技术信息 加入捆绑组,加大链路间带宽等 配置命令 华三 静态聚合 将接口加入聚合口后再进行配置 //创建静态链路聚合口1,不启用lacp[SWB]interface Bridge-Aggregation 1 [SWB-Bridge-Aggregation1]port link-type trunk [SWB-Bridge-Aggregation…...
为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?
在机器学习和深度学习中,数据集的划分方式取决于任务需求、数据量以及模型开发流程的严谨性。 1. 三者划分:训练集、验证集、测试集 目的 训练集(Training Set):用于模型参数的直接训练。验证集(Validati…...
【读书笔记·VLSI电路设计方法解密】问题61:扫描插入的目的是什么
如问题60所述,要构建可测试电路,必须确保电路中每个节点都具有可控性和可观测性。但对于包含时序元件(如触发器、锁存器等存储元件)的电路,若不采取特殊设计则难以实现这两项特性。这是因为时序元件关联节点的逻辑状态不仅取决于当前输入,还受其先前存储状态影响——它们…...
通信数据记录仪-产品概念ID
总结: 1、支持高速CAN、支持容错CAN、支持单线CAN(理解是支持不同的协议,CANFD、CAN2.0和LIN?) 2、 通过上位机设计时间...
【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)
湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...
SQL注入重新学习
前话 sql注入一般就是构造闭合,在查询语句中构造恶意语句,因为过滤并不严格导致信息泄露, 后台登陆语句:SELECT * FROM admin WHERE Username‘user’ and Password‘pass’ 万能密码:‘or ’1‘ ’1‘ # ; sql常用…...
修改Jupyter Notebook主目录文件夹
1、找到Jupyter Notebook配置文档 在anaconda prompt终端输入以下命令,可以显示配置文档所在位置: jupyter notebook --generate-config2、修改Jupyter Notebook主目录文件夹 用记事本打开文件夹中的jupyter_notebook_config.py文件。 在记事本中使用…...
玩转JSONObject:使用方法详解与Map对比
一、初识JSONObject 什么是JSONObject? JSONObject是Java中处理JSON数据的核心工具类,主流JSON库均提供类似实现: org.json(原生包)com.alibaba.fastjson.JSONObjectnet.sf.json.JSONObject 基础创建姿势 <JAV…...
LC416 vector<bool> 和 bool[] 的异同
LeetCode 416 1. 报错代码 // 01背包,从n个数字里面选,能否凑出和为s的方案 class Solution { public:bool canPartition(vector<int>& nums) {int m accumulate(nums.begin(), nums.end(), 0);if(m & 1) return false;m >> 1;…...
(51单片机)矩阵按键密码锁表白(C语言代码编撰)(矩阵按键教程)(LCD1602浅教程)
目录 源代码 main.c MatrixKey.c MatrixKey.h LCD1602.c LCD1602.h Delay.c Delay.h 运行效果图: 第一步: 第二步: 第三步: 第四步: 代码解析与教程: 延时函数Delay LCD1602 MatrixKey模块 源代…...
C++20新增内容
C20 是 C 语言的一次重大更新,它引入了许多新特性,使代码更现代化、简洁且高效。以下是 C20 的主要新增内容: 1. 概念(Concepts) 概念用于约束模板参数,使模板编程更加直观和安全。 #include <concept…...
思维链、思维树、思维图与思维森林在医疗AI编程中的应用蓝图
在医疗AI编程中,思维链(Chain of Thought, CoT)、思维树(Tree of Thoughts, ToT)、思维图(可能指知识图谱或逻辑图)以及思维森林(Forest-of-Thought, FoT)等技术框架通过模拟人类认知和推理过程,显著提升了AI在复杂医疗场景中的决策能力和可解释性: 1. 思维链(CoT)…...
[GN] Python3基本数据类型 -- 与C的差异
文章目录 前言Python3的基本数据类型6个标准的数据类型NumbersStringListtupleSetsDictionaries Python运算符逻辑 运算符成员运算符身份运算符 Python3 数字Python3 序列序列切片序列相加序列相乘序列相关内置函数 Python3 列表访问列表的值更新列表删除列表元素拼接列表嵌套列…...
TCP基础篇(一)
文章目录 1.TCP 是如何保证可靠性的?2. 滑动窗口机制3 超时重传4.TCP 报文格式5. 什么是 TCP 协议5.1 如何唯一确定一个 TCP 连接 6.TCP 三次握手过程6.1 可以两次握手吗? 7.TCP 的四次挥手7.1 为什么客户端要等待2MSL? 8.linux 中查看 TCP 的连接9.TCP 为什么要有…...
Spring-IOC部分
Spring-IOC部分 1.SpringBean的配置详解(Bean标签) (1)scope 默认情况下,单纯的Spring环境Bean的作用范围有两个:Singleton和Prototype singleton:单例,默认值,Spring…...
使用GitHub Actions构建CI/CD流程
GitHub Actions 简介 GitHub Actions 是一种自动化软件开发工作流的方式,与 GitHub.com 深度集成。开发人员可以通过配置 GitHub Actions 来实现基于事件触发的自动工作流,比如,当有任意用户向 master 分支提交代码时,自动执行一…...
Ubuntu服务器 无法正常启动redis
当我们在阿里云服务器上启动redis服务 运行下述命令时 service redis-server start 会出现如下报错 Failed to start redis-server.service: Unit redis-server.service not found. 如图: 解决方案: 通过以下命令重新安装Redis: sudo apt…...
MySQL 索引原理
一、索引基础概念 1. 索引是什么? 定义:索引是帮助MySQL高效获取数据的有序数据结构,类似书籍的目录。核心作用:减少磁盘I/O次数,提升查询速度(以空间换时间)。 2. 索引的优缺点 优点缺点加…...
前端快速入门学习3——CSS介绍与选择器
1.概述 CSS全名是cascading style sheets,中文名层叠样式表。 用于定义网页样式和布局的样式表语言。 通过 CSS,你可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式,从而实现更精确的页面设计。 HTML与CSS的关系:HTML相当…...
WPF 免费UI 控件HandyControl
示例效果和代码 直接可以用 Button 按钮 | HandyOrg 1.安装 , 输入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …...
【代码艺廊】pyside6桌面应用范例:homemade-toolset
在研发测试日常工作中,通常会遇到很多琐碎的事情,占用我们工作的时间和精力,从而导致我们不能把大部分的注意力放在主要的工作上面。为了解决这个问题,除了加人之外,我们通常会开发一些日常用的效率工具,比…...
Hive 常见面试 300 问
一、Hive 基础概念 什么是 Hive?它的主要用途是什么? Hive 与传统关系型数据库有什么区别? 简述 Hive 的架构,各个组件的作用是什么? 解释 Hive 中的元数据,它存储在哪里? Hive 支持哪些数据格式?各自的特点是什么? 什么是 Hive 表的分区?为什么要使用分区? 什么是 …...
OpenMinus 源码深度解析:从 React 模式到多智能体架构实现
OpenMinus 源码深度解析:从 React 模式到多智能体架构实现 本文基于 2024 年 3 月 9 日最新代码版本解析,完整代码已上传至 GitHub(附项目地址https://github.com/mannaandpoem/OpenManus) 一、项目背景与核心价值 1.1 项目定位 …...
【Linux网络与网络编程】04.TCP Socket编程
一、TCP Socket编程接口 // 创建套接字 int socket(int domain, int type, int protocol); // 参数: // domain:域(协议家族),这里使用 AF_INET 表示进行网络编程 // type:网络通信传输的类型࿰…...
初识数据结构——算法效率的“两面性”:时间与空间复杂度全解析
📊 算法效率的“两面性”:时间与空间复杂度全解析 1️⃣ 如何衡量算法好坏? 举个栗子🌰:斐波那契数列的递归实现 public static long Fib(int N) {if(N < 3) return 1;return Fib(N-1) Fib(N-2); }问题…...
CCF GESP C++编程 八级认证真题 2025年3月
C 八级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 答案 B C B A D D D 一、单选题 第 1 题 国家“以旧换新”政策仍在继续,小杨家决定在家里旧的冰箱、电视、洗衣机、微波炉中选两种换新。其中,冰箱有4种型号可选,电视有6种型号可选,…...
React: hook相当于函数吗?
一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…...
Git 从入门到精通(开源协作特别版)
🧠 Git 从入门到精通(开源协作特别版) ✅ 基础命令 🧰 高级用法 🛠️ 开源实战技巧 🌍 GitHub 社区协作 适合:从0开始 → 熟练开发者 → 参与/维护开源项目 🔰 第1章:…...
《探索边缘计算:重塑未来智能物联网的关键技术》
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
什么是缓存穿透、缓存雪崩、缓存击穿?
什么是缓存? 缓存就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 怎么防止缓存穿透? 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到…...
洛谷题单3-P4956 [COCI 2017 2018 #6] Davor-python-流程图重构
题目描述 在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。 他将在 2018 年 12 月 31 日开始出发,在这之前需要一共筹集 n 元钱。 他打算在每个星期一筹集 x 元,星期二筹集 xk 元,……...
解决浏览器报错Mixed Content
前端代码写死了访问后端的请求为:http://service.xxx.com:8080/api/,前端代码中混合内容(Mixed Content) 导致的。浏览器使用https访问站点时,这个请求会被拦截,并且浏览器打印 login.vue:151 Mixed Conten…...
HCIP【BGP协议(详解)】
目录 1 BGP协议产生背景 2 BGP协议特性 2.1 自治系统间路由传播 2.2 路由矢量协议 2.3 防环机制 2.4 基于TCP传输 2.5 路由更新机制 2.6 丰富的路由属性 2.7 支持CIDR和路由聚合 2.8 路由过滤和策略控制 2.9 动态对等体功能 3 BGP基本术语 4 BGP规划问题 4.1 路…...
集合与容器:List、HashMap(II)
一、ArrayList 是集合框架中最核心的动态数组实现,高频使用的容器之一。 1. 核心数据结构 基于数组实现,维护elementData数组存储元素: transient修饰的elementData不会被默认序列化(通过自定义序列化逻辑优化存储)…...