Linux线程概念及常用接口(1)
目录
1. Linux线程概念
什么是线程
线程的优点
线程的缺点
线程异常
线程用途
2. Linux进程VS线程
进程和线程
关于进程线程的问题
3. Linux线程控制
POSIX线程库
创建线程
线程ID及进程地址空间布局
线程终止
线程等待 为什么需要线程等待?
4. 分离线程
1. Linux线程概念
什么是线程
- 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”
- 一切进程至少都有一个执行线程
- 线程在进程内部运行,本质是在进程地址空间内运行
- 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
- 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流
线程的优点
- 创建一个新线程的代价要比创建一个新进程小得多
- 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
- 线程占用的资源要比进程少很多
- 能充分利用多处理器的可并行数量
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
线程的缺点
性能损失
- 一个很少被外部事件阻塞的计算密集型线程往往无法与其它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的 同步和调度开销,而可用的资源不变。
健壮性降低
- 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
缺乏访问控制
- 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
编程难度提高
- 编写与调试一个多线程程序比单线程程序困难得多
线程异常
- 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
- 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出
线程用途
- 合理的使用多线程,能提高CPU密集型程序的执行效率
- 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)
2. Linux进程VS线程
进程和线程
- 进程是资源分配的基本单位
- 线程是调度的基本单位
- 线程共享进程数据,但也拥有自己的一部分数据
- 线程ID
- 一组寄存器
- 栈
- errno
- 信号屏蔽字
- 调度优先级
进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
- 文件描述符表
- 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
- 当前工作目录
- 用户id和组id
进程和线程的关系如下图:
关于进程线程的问题
- 如何看待之前学习的单进程?——具有一个线程执行流的进程
3. Linux线程控制
POSIX线程库
- 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”开头的
- 要使用这些函数库,要通过引入头文件<pthread.h>
- 链接这些线程函数库时要使用编译器命令的“-lpthread”选项
创建线程
功能:创建一个新的线程 原型int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void * (*start_routine)(void*), void *arg); 参数thread:返回线程IDattr:设置线程的属性,attr为NULL表示使用默认属性start_routine:是个函数地址,线程启动后要执行的函数arg:传给线程启动函数的参数 返回值:成功返回0;失败返回错误码
错误检查:
- 传统的一些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误。
- pthreads函数出错时不会设置全局变量errno(而大部分其他POSIX函数会这样做)。而是将错误代码通过返回值返回
- pthreads同样也提供了线程内的errno变量,以支持其它使用errno的代码。对于pthreads函数的错误, 建议通过返回值判定,因为读取返回值要比读取线程内的errno变量的开销更小
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <pthread.h> void *rout(void *arg) {int i;for( ; ; ) {printf("I'am thread 1\n");sleep(1);} } int main() {pthread_t tid;int ret = pthread_create(&tid, NULL, rout, NULL);if ( ret != 0 ) {fprintf(stderr, "pthread_create : %s\n", strerror(ret));exit(EXIT_FAILURE);}int i;for(; ; ) {printf("I'am main thread\n");sleep(1);} }
线程ID及进程地址空间布局
- pthread_ create函数会产生一个线程ID,存放在第一个参数指向的地址中。该线程ID和前面说的线程ID 不是一回事。
- 前面讲的线程ID属于进程调度的范畴。因为线程是轻量级进程,是操作系统调度器的最小单位,所以需要 一个数值来唯一表示该线程。
- pthread_ create函数第一个参数指向一个虚拟内存单元,该内存单元的地址即为新创建线程的线程ID, 属于NPTL线程库的范畴。线程库的后续操作,就是根据该线程ID来操作线程的。
- 线程库NPTL提供了pthread_ self函数,可以获得线程自身的ID:
#include <stdio.h> #include <pthread.h> #include <unistd.h>void* rout(void* arg) {int i;for ( ; ; ) {printf("I'm thread 1 virtualID: %lu\n", pthread_self());sleep(1);}// 建议添加返回值(虽然不会执行到这里)return NULL; }int main() {pthread_t tid;int ret = pthread_create(&tid, NULL, rout, NULL);if (ret != 0) {perror("pthread_create failed");return 1;}for ( ; ; ) {printf("I'm main thread\n");sleep(1);}// 实际上不会执行到这里,需要更好的线程同步pthread_join(tid, NULL);return 0; }
pthread_t 到底是什么类型呢?取决于实现。对于Linux目前实现的NPTL实现而言,pthread_t类型的线程ID,本质就是一个进程地址空间上的一个地址。
线程终止
如果需要只终止某个线程而不终止整个进程,可以有三种方法:
- 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。
- 线程可以调用pthread_ exit终止自己。
- 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程。
pthread_exit函数
功能:线程终止 原型void pthread_exit(void *value_ptr); 参数value_ptr:value_ptr不要指向一个局部变量。 返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
pthread_cancel函数
功能:取消一个执行中的线程 原型int pthread_cancel(pthread_t thread); 参数thread:线程ID 返回值:成功返回0;失败返回错误码
线程等待 为什么需要线程等待?
- 已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。
- 创建新的线程不会复用刚才退出线程的地址空间。
pthread_join函数
功能:等待线程结束 原型int pthread_join(pthread_t thread, void **value_ptr); 参数thread:线程IDvalue_ptr:它指向一个指针,指向线程的返回值 返回值:成功返回0;失败返回错误码
调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的 终止状态是不同的,总结如下:
- 如果thread线程通过return返回,value_ ptr所指向的单元里存放的是thread线程函数的返回值。
- 如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数 PTHREAD_ CANCELED。
- 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
- 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ ptr参数。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h>void *thread1(void *arg) {printf("thread 1 returning ... \n");int *p = (int*)malloc(sizeof(int));*p = 1;return (void*)p; }void *thread2(void *arg) {printf("thread 2 exiting ...\n");int *p = (int*)malloc(sizeof(int));*p = 2;pthread_exit((void*)p); }void *thread3(void *arg) {while (1) { // printf("thread 3 is running ...\n");sleep(1);}return NULL; }int main(void) {pthread_t tid;void *ret;// thread 1 returnpthread_create(&tid, NULL, thread1, NULL);pthread_join(tid, &ret);printf("thread return, thread id %lX, return code:%d\n", (unsigned long)tid, *(int*)ret);free(ret);// thread 2 exitpthread_create(&tid, NULL, thread2, NULL);pthread_join(tid, &ret);printf("thread return, thread id %lX, return code:%d\n", (unsigned long)tid, *(int*)ret);free(ret);// thread 3 cancel by otherpthread_create(&tid, NULL, thread3, NULL);sleep(3);pthread_cancel(tid);pthread_join(tid, &ret);if (ret == PTHREAD_CANCELED)printf("thread return, thread id %lX, return code:PTHREAD_CANCELED\n", (unsigned long)tid);elseprintf("thread return, thread id %lX, return code:NULL\n", (unsigned long)tid); }
运行截图:
我们可以通过上面那个时间线的截图来帮助我们分析这段代码,这段代码首先有四个线程,三个分支线程一个主线程。我们让第一个分支线程执行:在堆上开辟一块空间,然后赋值并将其返回,第二个分支线程进行:同样的开空间赋值,多了一步终止线程pthread_exit函数,第三个分支是无限循环执行三秒,由外部调用pthread_cancle函数终止。
主线程就管理他们,并将他们的线程id和错误码打印出来我们可以观察到如上结果。
4. 分离线程
- 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。
- 如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。
int pthread_detach(pthread_t thread);
可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离:
pthread_detach(pthread_self());
joinable和分离是冲突的,一个线程不能既是joinable又是分离的。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> void *thread_run( void * arg ) { pthread_detach(pthread_self()); printf("%s\n", (char*)arg); return NULL; } int main( void ) { pthread_t tid; if ( pthread_create(&tid, NULL, thread_run, (void*)"thread1 run...") != 0 ) { printf("create thread error\n"); return 1; } int ret = 0; sleep(1);//很重要,要让线程先分离,再等待 if ( pthread_join(tid, NULL ) == 0 ) { printf("pthread wait success\n"); ret = 0; } else { printf("pthread wait failed\n"); ret = 1; } return ret; }
由这段测试代码我们就可以得知分离后的线程,我们就不需要等待了。
相关文章:
Linux线程概念及常用接口(1)
目录 1. Linux线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程用途 2. Linux进程VS线程 进程和线程 关于进程线程的问题 3. Linux线程控制 POSIX线程库 创建线程 线程ID及进程地址空间布局 线程终止 线程等待 为什么需要线程等待? 4. 分离线程 1. Linux线…...
Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148868209 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
《美化生活》投稿简介
《美化生活》杂志是国家新闻出版署批准的正规期刊,是面向全国发行的文学艺术刊。本刊坚持“传播新理念,交流新经验”办刊方针,坚持“指导消费、丰富生活、美化心灵、雅俗共赏”的宗旨,以其丰富的内容,融学术性与技术性…...
如何为虚拟机上的 Manjaro Linux启用 VMware 拖放功能
如果你的Manjaro 发行版本是安装在 VMware Workstation Player 上使用的 ,而且希望可以通过拖放功能将文件或文件夹从宿主机复制到客户端的Manjaro 里面,那么可以按照以下的步骤进行操作,开启拖放功能。 在 VMware 虚拟机上安装 Manjaro 后&…...
VIVADO导出仿真数据到MATLAB中进行分析
VIVADO导出仿真数据到MATLAB中进行分析 目录 前言 一、导出仿真数据需要编写的RTL代码 二、MATLAB读入txt文件中的数据 三、需要注意的点 总结 前言 在使用 Xilinx Vivado 进行 FPGA 开发时,如何将 RTL 仿真生成的数据导出,进行进一步分析与可视化&…...
Harmony状态管理@Event
ArkUI Event装饰器:实现子组件向父组件通信的规范方式 概述 Event装饰器是ArkUI框架中用于规范组件间通信的重要工具,特别是在需要子组件向父组件请求更新Param变量的场景下。它通过回调机制实现数据的双向同步,是组件化开发中不可或缺的一…...
算力服务器选型
算力服务器选型需结合应用场景、算力需求及扩展性,核心要素如下: 应用定位: AI 训练 / 推理:优先高算力 GPU(如 NVIDIA A100、H100,或 RTX4090),搭配多核 CPU(如 Intel …...
基于目标驱动的分布式敏捷开发
研究结论 风险对项目目标的影响 时间目标:需求管理不当(如需求优先级不明确、多产品负责人需求冲突)、架构变更导致的返工、跨站点协调问题(如第三方依赖、通信基础设施不足)是影响项目时间的主要风险因素。质量目标&…...
大数据在UI前端的应用拓展:用户行为分析的深度挖掘
hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在当今数字化时代,大数据已成为推动各行业发展的核心动力之一。对于 UI 前端而言&…...
elk+filebeat收集springboot项目日志
目录 步骤 1: 安装和配置Elasticsearch 步骤 2: 安装和配置Logstash(可选) 步骤 3: 安装和配置Filebeat 步骤 4: 安装和配置Kibana 要使用ELK(Elasticsearch, Logstash, Kibana)堆栈和Filebeat来收集Spring Boot项目的日志&am…...
华为云Flexus+DeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例
华为云FlexusDeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不…...
SQL关键字三分钟入门:UPDATE —— 修改数据
在数据库操作中,除了添加新记录外,我们还需要经常修改已有的记录。例如: 更新用户的个人信息;调整订单的状态;更改产品的价格。 这时候就需要用到 SQL 中非常基础但极其重要的关键字 —— UPDATE! 它是用…...
用Rust写平衡三进制加法器
1、三进制加法器的发展 最初的平衡三进制加法是采用了三选一结构(github原文),这位大佬也很厉害,他是硬件都弄了出来的,也写了虚拟机,甚至用这三态多路复用器弄出了可以存状态的硬件,但我没有去看了,因为当…...
【AI时代速通QT】第三节:Linux环境中安装QT并做测试调试
目录 引言 一、Linux QT开发环境的核心要素 1.1 编译器(g)与构建工具(make) 1.2 搞定 OpenGL 依赖 二、核心步骤——安装 Qt Creator 2.1 获取官方在线安装器 2.2 赋予文件执行权限 2.3 运行图形化安装向导 三、Linux上创…...
论文阅读:2025 arxiv Qwen3 Technical Report
https://arxiv.org/pdf/2505.09388 https://www.doubao.com/chat/9918384373236738 文章目录 论文翻译Qwen3技术报告摘要1 引言 论文翻译 Qwen3技术报告 Qwen团队 摘要 在这项工作中,我们介绍了Qwen模型家族的最新版本Qwen3。Qwen3包含一系列大型语言模型&…...
Vue3+el-table-v2虚拟表格大数据量多选功能详细教程
Vue3el-table-v2虚拟表格大数据量多选功能详细教程 本教程基于 Element Plus 组件库的 el-table-v2(假设你使用虚拟滚动表格),实现大数据量场景下的多选功能,并包含了全选、反选、已选行展示、清除选择等完整交互。 一、项目背景与…...
开源跨平台的轻量 C# 编辑器
NetPad一个基于.NET 开源、跨平台的 C# 编辑器,目的是创建一个开源的、支持 Web 的跨平台替代方案,从而为开发者提供便利的编程环境并为非 Windows 环境下的开发者提供一个可替代 LINQPad 的实用工具。它以.NET SDK 作为基础运行时环境,利用E…...
QT多线程
使用多线程的好处 假如当前窗口要进行一段非常复杂的逻辑处理,在单线程的情况下,是无法操控界面UI的,点击界面UI没有响应。此时就要用到多线程。 注意: 1、默认的线程在Qt中称之为窗口线程,也叫主线程,负…...
了解公共部门中的数据网格:支柱、架构和示例
作者:来自 Elastic Elastic Platform Team 想想那些像公共健康记录、城市规划模型等项目背后的所有数据。政府机构一直在产生大量数据。当数据分散在云平台、本地系统或像卫星和应急响应中心这样的专业环境中时,情况变得更加复杂。找到信息变得困难&…...
关于一维数组和字符串的详细讲解(从属于GESP三级)
本章内容 一维数组基础 字符串基础 就像打磨一串符号,每个位置都要精准对待,才能串起完整的风景。坚持下去,小细节终将成就大格局。 一、⼀维数组基础 1 📚 定义 典型写法 说明 易错/拓展 int a[5]; 编译期长度常量&#x…...
【驱动设计的硬件基础】PCI和PCI-E
打开电脑主机,你会看到主板上一排长短不一的插糟:矮胖的 PCI 插糟还插着古老的声卡,旁边细长的 PCI-E 插糟则牢牢卡住显卡、高速网卡等核心设备。这些看似普通的插糟,其实是计算机硬件沟通的 "高速公路",承载…...
【学习记录】Git Base使用-免密连接代码仓库
github(JL765)和gitee(JL765/git-test01)都可以用于管理代码 在windows中,可以通过Git Base软件(Git - Downloading Package)和仓库进行连接 下载略过 github登录 ssh -T gitgithub.com # 成…...
android脱糖
前言 另外一篇相关文章:https://androidblog.blog.csdn.net/article/details/148574130 通过sourceCompatibility 和targetCompatibility可以实现低版本写代码高版本输出(详情可查看我的另一篇文件中的:验证各种Java版本 > 一、纯Java项…...
DVWA Brute Force漏洞深度分析与利用指南
DVWA简介 DVWA(Damn Vulnerable Web Application)是一个基于PHP/MySQL的脆弱性Web应用平台,专为安全专业人员设计,用于测试技能和工具。它包含十大安全模块,其中Brute Force(暴力破解)是最基础…...
Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录
目录 🔧Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录 📌 问题背景 🧪 排查过程 步骤 1:确认加速器地址是否可访问 步骤 2:检查 Docker 是否真的使用了镜像加速器 步骤 3&…...
采用ArcGIS10.8.2 进行插值图绘制
一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…...
国产安路FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供5套TD工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产安路FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->GC0308摄像头输入Sensor之-->OV7725摄像头输入Sensor之--…...
利用大型语言模型增强边缘云 AI 系统安全性
大家读完觉得有帮助及的关注和点赞!!! 抽象 随着边缘计算和云系统在 AI 驱动应用中的广泛应用,如何在确保数据隐私的同时保持高效性能已成为一个紧迫的安全问题。本文提出了一种基于联邦学习的数据协作方法,以提高边缘…...
微信小程序中 rpx与px的区别
在微信小程序中的rpx比px方便的多 <!--pages/welcome/welcome.wxml--> <!--rpx替换px--> <image style"width:200rpx;height: 200rpx"src"/images/avatar/3.png"></image> <text>你好,冻梨</text> <but…...
解锁阿里云AnalyticDB:数据仓库的革新利器
AnalyticDB:云数据仓库新势力 在数字化浪潮中,数据已成为企业的核心资产,而云数据仓库作为数据管理与分析的关键基础设施,正扮演着愈发重要的角色。阿里云 AnalyticDB 作为云数据仓库领域的佼佼者,以其卓越的性能、创…...
告别水印烦恼,一键解锁高清无痕图片与视频!
在这个数字化飞速发展的时代,无论是设计小白还是创意达人,都可能遇到这样的困扰:心仪的图片或视频因水印而大打折扣,创意灵感因水印而受限。别急,今天就为大家带来几款神器,让你轻松告别水印烦恼࿰…...
前端面试记录
前言:面试题永远是刷不完的,即使刷了一大堆下次面试又忘记了,重要的是组织自己的语言,保持自信,不给自己制造面不过的心理负担,对刷过的题要有个大致印象,好在答题的时候能够多多少少说出点贴近…...
RAG实战基础篇/windows电脑快速部署qwen3:14B
现阶段,在本地部署ollama非常简单,准备好一个有GPU的电脑,十分钟轻松部署qwen3:14b。实现本地的大模型部署。 我这里为了方便起见,直接使用windows电脑下载一个ollama。 访问ollama GIthub地址:ollama开源地址 直接…...
Java SE - 图书管理系统模拟实现
目录 1.设计框架2. 实现用户类3.实现书和书架类4.登录界面的实现5.实现menu方法6.测试菜单选择7.实现一个IFun接口7.1 查找功能的实现7.2 展示功能的实现7.3 增加功能的实现7.4 删除功能的实现7.5 退出功能的实现7.6 借阅功能的实现7.7 归还功能的实现 8.实现IFuntion类型的数组…...
华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫
咸鱼只卖20多元一个,还是xgpon的万兆猫,性价比不错哦 除了没有2.5G网口,其他还行。 改成公版光猫后,运营商是无法纳管光猫,无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点: 性能方面 高速接…...
【ARM 嵌入式 编译系列 7.5 -- GCC 打印链接脚本各段使用信息】
文章目录 Overview1 在 linker script 中定义符号2 编译并生成 ELF 文件3 使用 nm awk 输出各段地址及大小(含单位)4 实际输出示例5 进阶建议 Overview 在 GCC 编译生成 elf 后 打印出出数据段的开始地址及结束地址,bss 段的开始地址和结束…...
在大数据求职面试中如何回答分布式协调与数据挖掘问题
在大数据求职面试中如何回答分布式协调与数据挖掘问题 场景:小白的大数据求职面试 小白是一名初出茅庐的程序员,今天他来到一家知名互联网公司的面试现场,面试官是经验丰富的老黑。以下是他们之间的对话: 第一轮提问࿱…...
小白成长之路--nginx基础配置(一)
文章目录 一、概述1.1 Nginx 特点1.2 Nginx 作用1.3Nginx工作原理 二、Nginx服务搭建2.1安装2.2 目录结构2.3 配置文件作用2.4 nginx,conf配置文件详解2.5 核心命令2.6 Nginx信号三.Nginx3.1启动 总结 一、概述 Nginx 是开源、高性能、高可靠的 Web服务器 和反向代理服务器&am…...
基于 SpringBoot+JSP 的医疗预约与诊断系统设计与实现
摘要 本研究针对传统医疗预约与诊断流程中存在的效率低下、信息不透明、患者等待时间长等问题,设计并实现了一个基于 SpringBootJSP 的医疗预约与诊断系统。系统采用 B/S 架构,整合了用户管理、科室管理、医生排班、预约挂号、在线问诊、检查检验、诊断…...
C++语言发展历程-2025
C语言发展历程-2025 前言 C是一种高级编程语言,由Bjarne Stroustrup于1979年在贝尔实验室创建,是C语言的扩展和改进版。 C从最初的C with class,经历了C98、C03、C11、C 14、C17、C20、C23多次标准化改造,成为一门多范式、高性…...
Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南
Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系统架构设计 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…...
Python基础之函数
代码仓库地址:gitgithub.com:Liucc-123/python_learn.git 函数介绍 函数是组织好的、可重复使用的,用来实现单一、或相关功能的代码段。 函数可以提高应用的模块性和代码的可重复性。python 有许多内置的函数比如 print 打印函数,python 也…...
Python异步爬虫编程技巧:从入门到高级实战指南
Python异步爬虫编程技巧:从入门到高级实战指南 🚀 📚 目录 前言:为什么要学异步爬虫异步编程基础概念异步爬虫核心技术栈入门实战:第一个异步爬虫进阶技巧:并发控制与资源管理高级实战:分布式…...
Redis哨兵模式深度解析与实战部署
Redis哨兵模式深度解析与实战部署 文章目录 Redis哨兵模式深度解析与实战部署一、Redis哨兵模式理论架构详解1.1 哨兵模式的核心架构组成基础架构拓扑图 1.2 哨兵节点的核心功能模块1.2.1 监控模块(Monitoring)1.2.2 决策模块(Decision Makin…...
【软考高级系统架构论文】论边缘计算及其应用
论文真题 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的分布式开放平台(架构),就近提供边缘智能服务。边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在长周期维护、业务决策支撑等领域发挥优势;…...
触摸屏(典型 I2C + Input 子系统设备)从设备树解析到触摸事件上报
触摸屏(典型 I2C Input 子系统设备)从设备树解析到触摸事件上报 以下是架构图,对触摸屏(典型I2C Input子系统设备)从设备树解析到触摸事件上报的全流程详细拆解,包含文字讲解和配套流程图: 注…...
Java中==与equals()方法的深度解析
作为Java后端开发者,我们经常会遇到需要比较两个对象是否相等的情况。在Java中,运算符和equals()方法都可以用于比较,但它们之间存在着本质的区别。 1. 运算符 是一个比较运算符,它的行为取决于比较的类型: 1.1 比较…...
qt常用控件--02
文章目录 qt常用控件--02toolTip属性focusPolicy属性styleSheet属性补充知识点按钮类控件QPushButton 结语 很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 今天我们进一步c11中常见的新增表达 作者&…...
AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)
环境: AI-Sphere-Butler VBCABLE2.1.58 Win10专业版 豆包桌面版1.47.4 ubuntu22.04 英伟达4070ti 12G python3.10 问题描述: AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一) 聊天视频: AI真…...
为什么android要使用Binder机制
1.linux中大多数标准 IPC 场景(如管道、消息队列、ioctl 等)的进程间通信机制 ------------------ ------------------ ------------------ | 用户进程 A | | 内核空间 | | 用户进程 B | | (User Spa…...