当前位置: 首页 > news >正文

Linux 进程基础(二):操作系统

目录

  • 一、什么是操作系统:用户和电脑之间的「翻译官」
    • 🌐 OS 的层状结构
    • 🧩 案例解析:双击鼠标的「跨层之旅」
  • 二、操作系统的必要性探究:缺乏操作系统的环境面临的挑战剖析
    • 🔑 OS 的「管理者」属性:三大核心价值
  • 三、操作系统如何管理进程: 从「双击打开应用」看进程管理本质
    • 📊 管理的本质:用数据描述,用规则(组织)调度
    • 进程管理的三大核心任务
    • 🔄 系统调用 vs 库函数
  • 四、广义的 OS 与狭义的 OS
    • 1. 狭义的操作系统
    • 2. 广义的操作系统


一、什么是操作系统:用户和电脑之间的「翻译官」

操作系统(Operating System,简称 OS)

想象一下:当你双击桌面上的 Firefox 图标时,鼠标的物理点击是如何让浏览器「蹦」出来的?这个过程中离不开OS的作用——它是介于用户与计算机硬件之间的「超级中间人」,既能听懂人类的「操作语言」(如鼠标点击),又能指挥硬件「干活」(如让 CPU 运行程序)。

🌐 OS 的层状结构

从底层到上层,OS 的结构可以分为六层「保护壳」,各层相互协作,共同构建起操作系统的运行体系:

层级名称功能描述关键组件/示例特点/备注
硬件层构成计算机物质基础,处理0/1电信号鼠标、键盘、CPU、内存比如双击鼠标时,微动开关产生的电信号就是硬件层的「原始语言」,这是整个交互过程的起点。
内核层操作系统核心,包含驱动程序、进程调度器、内存管理器等关键组件。直接与硬件对话,翻译硬件信号驱动程序、进程调度器、内存管理器比如将鼠标的电信号转换为「鼠标左键双击事件」。
大多数基础硬件驱动(如鼠标、键盘驱动)作为内核组件或可加载模块存在于内核空间,但部分外设驱动可能在用户空间实现(如通过特定框架),具体取决于操作系统的架构设计。
系统调用层提供内核服务的官方接口open()用于打开文件、execve()用于执行程序例如,应用程序必须通过系统调用层向内核请求服务。系统调用是用户态与内核态的唯一通道,必须通过此层请求内核服务
库函数层封装系统调用简化开发。如同 「便捷工具包」C语言的fopen():封装open()避免开发者直接处理复杂内核接口,降低开发难度。
用户接口层提供用户与系统交互的桥梁图形用户界面:GUI(Windows、Linux(GNOME/KDE)、macOS)
命令行界面:CLI(Bash/Zsh)
如:鼠标点击、ls命令
支持图形化操作(拖拽/点击)与命令行操作,它将系统功能以直观易懂的方式呈现给用户
应用层承载用户直接操作的软件,用户通过点击图标、输入文字等方式与 OS 交互。浏览器、文档编辑器……存在两种状态:
• 空闲态:系统无用户程序运行时,但系统进程仍在运行维持基本服务
• 活动态:当用户运行应用程序时,应用层则成为用户实现各种功能的直接载体

🧩 案例解析:双击鼠标的「跨层之旅」

当你双击 Firefox 图标时:

  • 硬件层:鼠标发送电信号到 USB 控制器,触发硬件中断(给 CPU 发「紧急通知」)。
  • 内核层:鼠标驱动解析信号为坐标(100, 200)和点击事件,窗口管理器根据坐标找到 Firefox 图标对应的程序路径(/usr/lib/firefox/firefox)。
  • 系统调用层:内核调用execve()函数,将 Firefox 的可执行文件从硬盘加载到内存。
  • 用户接口层:接收鼠标双击事件,根据图标对应的程序路径,通过系统调用层触发程序启动,并在界面上展示应用启动的反馈。
  • 应用层:Firefox 进程启动,界面显示在屏幕上,用户得以开始使用浏览器。

系统调用:用户态与内核态的「唯一通道」,用户接口层:「交互逻辑的起点」
在上述双击案例中,用户接口层通过系统调用read()接收鼠标双击事件,并将 “鼠标双击的物理事件” 转换为 “启动特定程序” 的 逻辑命令,通过 系统调用 告知内核 “需要启动程序”。

例如: Linux:调用 fork() 创建新进程,再通过 execve() 指定加载 Firefox 的可执行文件。
Windows:调用CreateProcess() API,最终触发内核的 NtCreateUserProcess() 系统服务。

至此:用户的 “双击动作” 被完整解析为操作系统可执行的 启动命令,等待内核执行。

操作系统
冯诺依曼体系
系统调用: read
返回事件数据
解析为指令
系统调用: execve
创建进程
调度执行
应用运行
驱动程序
内核
用户接口层
输入设备 - 鼠标
存储器 - 内存
运算器/控制器 - 内核调度
输出设备 - 显示器
用户双击鼠标
应用界面显示

冯・诺依曼体系与操作系统(OS)结合的视角来看,用户双击鼠标这一操作,鼠标作为输入设备,把物理动作转化为电信号,此为输入过程。操作系统的驱动程序如同数据处理的 “翻译官”,将电信号解析为内核能处理的事件数据,内核负责存储与管理这些数据。用户接口层依据系统调用从内核获取事件,把它解析为打开应用的指令,这是信息在软件层面的逻辑处理
随后,用户接口层借助系统调用向内核发起启动应用的请求,内核按照冯・诺依曼体系中控制器的角色,创建新进程,将应用程序从存储设备(如硬盘)加载到内存(存储器)中,如同将程序指令和数据存入存储器,为执行做准备。
接着,内核调度进程执行,如同控制器指挥运算器进行操作,让应用程序得以运行。
最后,应用程序将处理结果输出到显示器(输出设备),完成整个信息的输入 - 处理 - 输出循环,体现了冯・诺依曼体系结构与操作系统协同工作的原理。


二、操作系统的必要性探究:缺乏操作系统的环境面临的挑战剖析

在缺乏 OS 的情境下,计算环境将遭遇一系列严峻挑战,可归纳为以下典型场景:
场景 1:直接和硬件交互

  • 想打开文件:你需要自己写代码操作硬盘控制器,记住每个扇区的地址(比如第 1024 号扇区存了文件头)。
  • 想移动鼠标:你得解析 USB 协议,把 X/Y 轴的位移量转化为屏幕坐标(而且不同品牌鼠标的信号格式可能完全不同!)。

场景 2:资源混乱大战

  • 两个程序同时访问内存地址 0x1000:数据冲突导致崩溃。
  • 打印机正在打印文档,突然另一个程序强行占用:纸张乱码、任务卡死。

🔑 OS 的「管理者」属性:三大核心价值

  • 硬件抽象:让鼠标、键盘、硬盘等设备对用户和应用程序来说都是「统一的接口」(比如 Linux 把所有设备都视为文件,鼠标对应/dev/input/mice)。
  • 资源管理:合理分配 CPU 时间(让多个程序轮流运行)、内存空间(避免数据互相覆盖)、I/O 设备(比如打印机一次只处理一个任务)。
  • 安全隔离:用户态(应用程序)不能直接访问内核态(硬件控制),防止恶意程序破坏系统(比如病毒无法直接改写 CPU 寄存器)。

三、操作系统如何管理进程: 从「双击打开应用」看进程管理本质

回到双击 Firefox 的案例:当你点击图标时,OS 其实在做一件大事——创建一个进程。进程是「正在运行的程序实例」,而 OS 对进程的管理,本质是对「数据」的管理。

📊 管理的本质:用数据描述,用规则(组织)调度

  • 管理对象:数据
    • 每个进程都有一个「进程控制块(PCB)」,记录进程 ID(PID)、状态(运行 / 暂停 / 终止)、内存地址、CPU 使用时间等信息(相当于进程的「身份证 + 简历」)。
    • 当你打开多个程序时,OS 通过 PCB 区分不同进程,比如 Firefox 进程的 PID 是 1234,Chrome 进程的 PID 是 5678。
  • 管理方式:数据组织 + 规则执行
    • 数据组织:用链表(比如「就绪队列」存放等待 CPU 的进程)、树结构(比如进程家族树,父进程创建子进程)管理所有 PCB。
    • 规则执行:通过调度算法(比如 Linux 的 CFS 调度器)决定哪个进程优先使用 CPU,通过同步机制(比如互斥锁)避免多个进程同时修改共享数据。

进程管理的三大核心任务

  1. 进程调度
  • 为什么需要调度: CPU 同一时间只能执行一个进程,但用户感觉多个程序在同时运行(比如边听歌边写文档),这靠的是 OS 让 CPU 在多个进程间快速切换(每秒切换上百次)。
  • 调度算法怎么做? 时间片轮转:给每个进程分配固定时间片(比如 10ms),时间到了就切换(适合交互式程序,比如鼠标点击响应)。
  • 优先级调度:重要进程(比如系统服务)优先运行,比如 Firefox 响应用户点击时,OS 会临时提高它的优先级,让 CPU 先处理它的事件。
  1. 进程同步
  • 案例:两个进程同时向同一个文件写入数据,如果没有同步机制,可能导致数据错乱 (比如进程 A 写入「hello」时,进程 B 插入「world」,最终文件变成「hewlorldlo」)。
  • 解决办法:
    • 互斥锁:进程 A 访问文件时加锁,进程 B 必须等待锁释放(就像上厕所关门,别人只能等)。
    • 信号量:记录可用资源数量,比如打印机同时允许 3 个进程排队,第 4 个进程必须等待。
  1. 进程通信
  • 为什么需要通信? 比如你用浏览器下载文件时,下载进程需要告诉界面进程「下载进度 60%」,这就需要进程间通信(IPC)。
  • 通信方式: 管道:单向数据流,比如ls | grep txt中,ls的输出通过管道传给grep。
  • 共享内存:多个进程直接访问同一块内存区域(速度最快,但需要同步机制避免冲突)。
  • 套接字(Socket):跨网络的进程通信(比如浏览器进程和 Web 服务器进程通过 Socket 传输数据)。

🔄 系统调用 vs 库函数

  • 系统调用:直接调用内核提供的接口(比如open()对应内核的sys_open()函数),是用户态进入内核态的「唯一通道」。双击 Firefox 时,execve()就是系统调用,告诉内核「我要运行这个程序」。
  • 库函数:对系统调用的封装(比如 C 语言的printf()最终会调用系统调用write()),目的是让程序员写代码更方便。比如你不需要记住write()的参数顺序,直接用printf(“%d”, num)即可。

库函数通常由以下几个主体提供:

  1. 编程语言标准库
    概述:每种编程语言都会定义并提供一套标准库,这些库函数是语言的重要组成部分,为开发者提供了基础且常用的功能。
  • 示例
    • C 语言:C 标准库提供了大量的库函数,像字符串处理函数 strcpy()、strlen(),数学运算函数 sin()、cos()等。这些函数由 C 语言标准委员会(如 ISO C)定义,不同的编译器(如 GCC、Clang)会按照标准实现这些库函数。
    • Python:Python 的标准库十分丰富,涵盖了文件操作、网络编程、数据处理等多个领域。例如 os 模块提供了与操作系统交互的函数,datetime 模块用于处理日期和时间。Python 解释器自带这些标准库,开发者可以直接使用。
  1. 操作系统相关库
    概述:操作系统为了方便开发者进行系统级编程,会提供一些特定的库函数。这些库函数通常与操作系统的功能紧密相关,如文件系统操作、进程管理、网络通信等。
  • 示例
    • Windows 操作系统:提供了 Windows API(应用程序编程接口),这是一系列的库函数,用于开发 Windows平台的应用程序。例如,CreateProcess() 函数用于创建新的进程,MessageBox() 函数用于显示消息框。
    • Linux操作系统:提供了丰富的系统调用封装库,如 glibc(GNU C 库)。glibc 不仅包含了 C 标准库的实现,还对 Linux系统调用进行了封装,方便开发者使用。例如,fopen() 函数是对 open() 系统调用的封装,用于文件打开操作。
  1. 第三方库
    概述:除了编程语言标准库和操作系统相关库,还有大量的第三方库可供开发者使用。这些库由不同的组织、公司或个人开发,用于满足特定的需求,如科学计算、图形处理、机器学习等。
  • 示例
    • NumPy:是 Python 的一个第三方库,用于进行高效的数值计算。它提供了多维数组对象和各种数学函数,大大提高了 Python在科学计算领域的性能。
    • OpenCV:是一个开源的计算机视觉库,提供了大量的图像处理和计算机视觉算法,可用于图像识别、目标检测、视频分析等领域。开发者可以在自己的项目中集成这些第三方库,以快速实现特定的功能。

四、广义的 OS 与狭义的 OS

1. 狭义的操作系统

定义
狭义的操作系统仅指操作系统的核心功能层,即 内核(Kernel) 及其相关底层机制,是操作系统中最核心、最底层的软件模块。

典型示例

  • Linux 内核(linux-kernel)、Windows 内核(NT Kernel)、macOS 内核(XNU)等。

2. 广义的操作系统

定义
广义的操作系统是指以内核为核心,包含用户空间所有配套软件和工具的完整软件系统,覆盖从底层硬件控制到上层用户交互的全链条。

组成部分

  1. 内核(狭义OS)
    • 同上述狭义定义,是广义OS的核心底层。
  2. 系统工具与实用程序
    • Shell:命令行交互界面(如Linux的Bash、Windows的PowerShell),解析用户命令并调用系统功能。
    • 文件管理工具:资源管理器(Windows)、文件浏览器(Linux GUI)、磁盘分区工具(如fdisk)等。
    • 系统服务:后台运行的守护进程(Daemon),如网络服务(DNS、DHCP)、日志服务等。
  3. 用户接口与图形环境
    • 图形用户界面(GUI):窗口管理器(如Linux的GNOME/KDE、Windows的Explorer)、桌面环境、图标/菜单系统等。
    • 输入输出支持:鼠标、键盘、显示器的驱动及交互逻辑,多媒体处理(音频/视频解码)等。
  4. 系统库与开发接口
    • 运行时库:对系统调用的封装(如C语言的glibc、Windows的MSVCRT),简化用户程序开发。
    • API(应用程序接口):供开发者调用的接口(如POSIX标准、Windows API),屏蔽底层硬件差异。
  5. 预装应用与服务
    • 基础应用程序(如文本编辑器、计算器、浏览器)、安全机制(权限管理、防火墙)、网络协议栈(TCP/IP、WiFi驱动)等。

典型示例

  • 完整的操作系统发行版,如 Ubuntu(内核+GNOME桌面+系统工具+预装软件)、Windows 10(NT内核+资源管理器+PowerShell+UWP应用)、Android(Linux内核+Java运行时+系统应用+图形框架)。

两者的关系可类比为“发动机”(狭义内核)与“整车”(广义OS):内核提供动力,而广义OS在此基础上构建了完整的驾驶舱、交互界面和实用功能。


END

相关文章:

Linux 进程基础(二):操作系统

目录 一、什么是操作系统:用户和电脑之间的「翻译官」🌐 OS 的层状结构🧩 案例解析:双击鼠标的「跨层之旅」 二、操作系统的必要性探究:缺乏操作系统的环境面临的挑战剖析🔑 OS 的「管理者」属性&#xff1…...

Java高并发处理核心技术详解:从理论到实战

高并发处理能力是衡量系统性能的重要指标。Java作为企业级开发的主力语言,提供了丰富的并发编程工具和框架。 一、Java并发基础 1.1 Java内存模型(JMM) 主内存与工作内存:每个线程拥有独立的工作内存,通过JMM协议与主…...

单细胞测序数据分析试验设计赏析(二)

单细胞测序数据分析试验设计赏析(二) 这次的单细胞测序数据分析的试验设计是单细胞测序分析机器学习(with SHAP分析),也是常见的试验设计之一,重点是可以用于筛选鉴定基因调控网络,也可以是构建…...

Docker 服务搭建

💢欢迎来到张翊尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Docker 服务搭建在 Ubuntu 上安装 Docker更新软件…...

4电池_基于开关电容的均衡

基于开关电容的均衡系统(Switched-Capacitor Equalization System) 开关电容均衡(Switched-Capacitor Equalization, SCE)是一种广泛应用于 电池组(如锂电池、超级电容组) 的主动均衡技术,通过电…...

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(七) - 波形解析专题P2

Matlab/Simulink - BLDC直流无刷电机仿真基础教程(七) - 波形解析专题P2 前言一、缺相与相线错接解析二、电源电压波动三、电机感量及磁链变化四、负载突变及堵转五、换相时机不当及换相错误参考链接 前言 本系列文章分享如何使用Matlab的Simulink功能来…...

如何从GitHub上调研优秀的开源项目,并魔改应用于工作中?

在 Go 语言学习中,我们经常会去学习一些优秀的开源项目。但是学完之后,发现很快就忘记了或者学习效果并不好。学习一个开源项目最好的方式就是围绕这个开源项目进行实战。例如,直接魔改这个开源项目并应用于工作中。本文来介绍下如何调用&…...

【Java学习笔记】构造器

构造器(constructor)(又名构造方法) 作用:可以在创建对象时就初始化属性,注意不是创建 基本结构 [修饰符] 方法名(形参列表){方法体; }代码示例 public class 构造器 {public static void m…...

Redis 数据类型详解(一):String 类型全解析

文章目录 前言一、什么是 Redis 的 String 类型?二、常用命令1.SET2.GET3.MSET4.MGET5.INCR6.INCRBY7.INCRBYFLOAT8.SETNX9.SETEX 三、注意事项总结 前言 提示:这里可以添加本文要记录的大概内容: 在学习 Redis 的过程中,最基础也…...

JAVA---多态

面向对象三大特征:封装、继承、多态 多态 定义:同类型的对象,表现出的不同形态。 它允许不同类的对象通过同一个接口进行调用,并且在运行时根据实际对象类型执行不同的方法。 多态主要通过继承、接口和方法重写来实现。 表现形式…...

K8S的使用(部署pod\service)+安装kubesphere图形化界面使用和操作

master节点中通过命令部署一个tomcat 查看tomcat被部署到哪个节点上 在节点3中进行查看 在节点3中进行停止容器,K8S会重新拉起一个服务 如果直接停用节点3(模拟服务器宕机),则K8S会重新在节点2中拉起一个服务 暴露tomcat访…...

【Linux系统】第二节—基础指令(2)

hello ~ 好久不见 自己想要的快乐要自己好好争取! 云边有个稻草人-个人主页 Linux—本篇文章所属专栏—欢迎订阅—持续更新中 目录 本节课核心指令知识点总结 本节基本指令详解 07.man 指令 08.cp 指令 09.mv 指令 10.cat 指令 11.more 指令 12.less 指令 …...

Java设计模式: 实战案例解析

Java设计模式: 实战案例解析 在软件开发中,设计模式是一种用来解决特定问题的可复用解决方案。它们是经过实践验证的最佳实践,能够帮助开发人员设计出高质量、易于维护的代码。本文将介绍一些常见的Java设计模式,并通过实战案例解析它们在实际…...

ASP.NET MVC​ 入门与提高指南九

51. 时空数据处理与 MVC 应用拓展 51.1 时空数据概念 时空数据是指与时间和空间相关的数据,如地理信息系统(GIS)数据、交通流量数据、气象数据等,这些数据随时间和空间变化而变化。 51.2 在 MVC 应用中处理时空数据 地理信息系…...

算法学习时段效能分布

算法学习时段效能分布 晨间时段(06:00-09:00)核心优势最佳任务 午后时段(14:00-17:00)核心优势最佳任务 夜间时段(20:00-23:00)核心优势最佳任务 实证数据支持 晨间时段(06:00-09:00&#xff09…...

Linux环境部署iview-admin项目

环境:阿里云服务 系统:CentOS7.X系统 1、下载源码安装包 wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz2、解压并放入指定目录 tar -xf node-v14.17.3-linux-x64.tar.xz && mv node-v14.17.3-linux-x64 /usr/local/no…...

在 Ubuntu 系统中,查看已安装程序的方法

在 Ubuntu 系统中,查看已安装程序的方法取决于软件的安装方式(如通过 apt、snap、flatpak 或手动安装)。以下是几种常见方法: 通过 apt 包管理器安装的软件 适用于通过 apt 或 dpkg 安装的 .deb 包。 列出所有已安装的软件包&…...

c++26新功能——Pack indexing

一、模板编程 在模板编程中,有一个问题比较突出,就是对变参模板中参数的控制,比较麻烦。因为是变参,所以想把参数单独拿出来处理,就需要借助一些特殊的技巧,而这种特殊的技巧,往往为大多数开发…...

VSCode通过SSH连接VMware虚拟机

以下是关于VSCode通过SSH连接VMware虚拟机的原理、必要条件及注意事项的说明: ​​一、连接原理​ SSH协议通信​​:SSH(Secure Shell)是一种加密网络协议,VSCode通过Remote-SSH插件将本地开发环境与虚拟机终端绑定&a…...

7 微调 黑盒蒸馏 突破伦理限制

简介 SecGPT-Distill 是我自己做的一个实验模型, 开源地址: 主要功能是进行模型微调和知识蒸馏而来 这次是运用微调技术,来突破现有模型在处理安全相关问题时的各种限制和约束 代码开源: https://github.com/godzeo/SecGPT-distill-boundless 不回答原理 大部…...

基于51单片机的温湿度控制器proteus仿真

地址: https://pan.baidu.com/s/1cENHPmF0XobqKg_7baZX3Q 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C51 是一款常用的 8 位单片机,由 Atmel 公司(现已被 Microchip 收…...

牛客月赛115 C题-命运之弹 题解

原题链接 https://ac.nowcoder.com/acm/contest/107879/C 题目描述 解题思路 记录每个数字出现的次数。枚举使用「转瞬即逝」的位置,统计后边比当前数字更大的数的数量,进而统计、更新答案。 详细细节见代码,代码里有详细的注释解释。 代…...

视频转GIF

视频转GIF 以下是一个使用 Python 将视频转换为 GIF 的脚本,使用了 imageio 和 opencv-python 库: import cv2 import imageio import numpy as np """将视频转换为GIF图参数:video_path -- 输入视频的路径gif_path -- 输出GIF的路径fp…...

day15 python 复习日

作业: 尝试找到一个kaggle或者其他地方的结构化数据集,用之前的内容完成一个全新的项 目,这样你也是独立完成了一个专属于自己的项目。 要求: 1.有数据地址的提供数据地址,没有地址的上传网盘贴出地址即可。 2.尽可能与…...

性能优化实践:渲染性能优化

性能优化实践:渲染性能优化 在Flutter应用开发中,渲染性能直接影响用户体验。本文将从渲染流程分析入手,深入探讨Flutter渲染性能优化的关键技术和最佳实践。 一、Flutter渲染流程解析 1.1 渲染流水线 Flutter的渲染流水线主要包含以下几…...

【SimSession 】3:中继服务 linux和windows实现及MFC集成实现

实现目标 在 echo 测试程序启动时启动中继服务,并在 echo 程序退出时杀死中继进程。我们可以通过以下方式实现这一目标: linux设计 1 Process Management: 流程管理: Added fork() functionality to create a child process for the relay service添加了 fork()功能,…...

表驱动 FSM 在 STM32 上的高效实现与内存压缩优化——源码、性能与实践

目录 一、引言与背景 二、前提环境与依赖 三、表驱动 FSM 核心原理 四、内存压缩方案详解 4.1 稠密二维表(Dense Table) 4.2 稀疏表压缩(Sparse Table) 4.3 行压缩+Offset 4.4 位域打包(Bit‑Packing)...

windows鼠标按键自定义任意设置

因为用惯了Linux的鼠标中键的复制黏贴,发现windows下有完全可以实现类似自定义功能的软件,推荐一下: X Mouse Button Control。 免费版足够好用。 软件简介: X Mouse Button Control是一款专业的重新映射鼠标按钮的软件工具&…...

常用命令集合

安装Miniconda wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_22.11.1-1-Linux-x86_64.shpython 换清华源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple鱼香ros wget http://fishros.com/install -O fishr…...

【图书管理系统】环境介绍、设计数据库和表、配置文件、引入依赖

0. 环境介绍 (1)JDK版本:JDK_8(JDK_1.8) (2)Java语言版本:8 (3)SpringBoot版本:2.6.13 (4)Maven仓库:阿里云 …...

【Linux】日志与策略模式、线程池

在了解了线程的基本概念和线程互斥与同步之后,我们可以以此设计一个简单的线程池。【Linux】线程-CSDN博客 【Linux】线程同步与互斥-CSDN博客 线程池也是一种池化技术。提前申请一些线程,等待有任务时就直接让线程去执行,不用再收到任务之…...

【神经网络与深度学习】生成模型-单位高斯分布 Generating Models-unit Gaussian distribution

引言 在生成模型的研究与应用中,单位高斯分布(标准正态分布)作为数据采样的基础扮演着至关重要的角色。其数学特性、潜在空间的连续性、灵活性以及通用性,使得生成模型能够高效且稳定地学习和生成样本。本文将详细探讨从单位高斯…...

通讯协议开发实战:从零到一打造企业级通信解决方案

简介 从工业控制到物联网,掌握主流通信协议开发是构建现代智能系统的核心能力。本文将通过深入分析CAN FD和MQTT两种关键协议的原理、特性及应用场景,结合TypeScript和Node.js技术栈,设计一个完整的实时运动控制系统开发案例。从协议解析到数据转换,再到系统集成,全程提供…...

《MATLAB实战训练营:从入门到工业级应用》工程实用篇-自动驾驶初体验:车道线检测算法实战(MATLAB2016b版)

《MATLAB实战训练营:从入门到工业级应用》工程实用篇-🚗 自动驾驶初体验:车道线检测算法实战(MATLAB2016b版) 大家好!今天我要带大家一起探索自动驾驶中一个非常基础但又至关重要的技术——车道线检测。我…...

【网络】什么是串口链路(Serial Link)?

在路由器上,串口链路(Serial Link)就是指路由器之间通过串行接口(serial interface)和串行电缆(通常是V.35、RS-232或同步串行线路)直接点对点相连的那一段连线。它和我们平常在局域网里用的以太…...

为了结合后端而学习前端的学习日志——【黑洞光标特效】

前端设计专栏 今天给大家带来一个超酷的前端特效——黑洞光标!让你的鼠标变成一个会吞噬光粒子的迷你黑洞,点击时还会喷射出绿色能量粒子!🌠 🚀 效果预览 想象一下:你的鼠标变成一个旋转的黑洞&#xff0…...

set autotrace报错

报错: SQL> set autotrace traceonly SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report原因分析: 根据上面的错误提示“SP2-0618: Cannot find the Session Identifie…...

算法每日一题 | 入门-顺序结构-大象喝水

大象喝水 题目描述 一只大象口渴了,要喝 20 升水才能解渴,但现在只有一个深 h 厘米,底面半径为 r 厘米的小圆桶 (h 和 r 都是整数)。问大象至少要喝多少桶水才会解渴。 这里我们近似地取圆周率 π 3.14 \pi3.14 π…...

n8n 构建一个 ReAct AI Agent 示例

n8n 构建一个 ReAct AI Agent 示例 0. 引言1. 详细步骤创建一个 "When Executed by Another Workflow"创建一个 "Edit Fields (Set)"再创建一个 "Edit Fields (Set)"创建一个 HTTP Request创建一个 If 节点在 true 分支创建一个 "Edit Fiel…...

Scartch038(四季变换)

知识回顾 1.了解和简单使用音乐和视频侦测模块 2.使用克隆体做出波纹特效 3.取色器妙用侦测背景颜色 前言 我国幅员辽阔,不同地方的四季会有不同的美丽景色,这节课我带你使用程序做一个体现北方四季变化的程序 之前的程序基本都是好玩的,这节课做一个能够赏心悦目的程序。…...

【Linux】SELinux 的基本操作与防火墙的管理

目录 一、SELinux的管理 1.1 Linux 系统的安全机制 1.2 SELinux 的概述 1.3 SELinux 的配置 1.3.1 查看 SELinux 的工作方式 1.3.2 设置 SELinux 的工作方式 1.3.2.1 基于配置文件修改(推荐方式) 1.3.2.2 基于命令方式修改 二、防火墙管理 2.1 防…...

【React Hooks原理 - useCallback、useMemo】

useMemo用于缓存计算结果,它只在依赖项发生变化时重新计算 原理: 依赖项检查:useMemo接收2个参数,一个“创建”函数和一个依赖项数组。依赖项数组中的值在每次渲染时都会被比较,以决定是否需要重新计算 缓存机制&am…...

一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索

一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索 一、引子:别看题简单,实则套路深 说起“单词搜索”这个题目,初学者第一眼可能会说:“哦不就是个查字母吗?”其实,真没这么简单。 LeetCode 上那…...

深入了解 OpenIddict:实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库

在现代 Web 开发中,身份验证和授权是安全性的重要组成部分。随着对安全性的要求不断增加,OAuth 2.0 和 OpenID Connect(OIDC)协议已经成为许多应用程序的标准身份验证方式。而 OpenIddict,作为一个用于实现 OAuth 2.0 …...

学习黑客 TCP/IP

一句话总结:把 TCP/IP 看成大型多人在线游戏的“世界引擎”:链路层是地基,互联网层是道路,运输层是交通系统,应用层是景点与商店;协议们则是各种交通工具与技能(TCP 稳重的长途客车&#xff0c…...

【沐风老师】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一个脚本化的修改器插件。对于需要创建随机化纹理效果的用户而言,3DMAX的UV By Element修改器无疑是一款高效工具,它将以伪随机量偏移、旋转和/或缩放每个元素的UV坐标。 【版本要求】 3dMax 2016及以上 【安装方法】…...

Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式

Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式 在 Android 开发中,Jetpack Compose 彻底改变了 UI 构建方式,但许多开发者对如何处理边距(Margin/Padding)感到困惑。本文将深入解析 Compose 的边距…...

Go语言--语法基础4--基本数据类型--类型转换

Go 是一种强类型的语言,所以如果在赋值的时候两边类型不一致会报错。一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明。 强制类型转换语法 使用 type (a) 这种形式来进行强制类型转换&am…...

【C++ Qt】输入类控件(上) LineEdit、QTextEdit

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论​: 本次分享聚焦 Qt 框架里常用的输入框组件,重点讲解 QLineEdit(单行输入框)和 QTextEdit(多行输入框&…...

【c++深入系列】:万字详解vector(附模拟实现的vector源码)

🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 种子破土时从不问‘会不会有光’,它只管生长 ★★★ 本文前置知识: 模版 1.什么是vector 那么想必大家都学过顺…...