操作系统学习笔记-5.1-IO设备
文章目录
- I/O控制器
- I/O 控制器的组成
- I/O 控制器的工作流程
- I/O 控制器的类型
- I/O 控制器的主要功能
- I/O 控制器与操作系统的交互
- DMA 的工作原理
- DMA 传输模式
- DMA 控制器的组成
- 组成
- 内存映像I/O,寄存器独立编址
- IO软件层次
- 用户层 I/O 软件
- 设备独立性软件层
- 设备驱动程序
- 中断处理程序
- 硬件层
- 各层次间的交互流程
- 输入输出应用程序接口
- 输入输出应用程序接口(I/O API)
- 应用层和操作系统层的交互
- 驱动程序接口
- 概述
- 特点
- 驱动程序的接口功能
- 3. I/O API 和驱动程序接口的对比
- 它们之间的协作关系
- 阻塞IO和非阻塞IO
- 1. 阻塞 I/O(Blocking I/O)
- 概述
- 特点
- 2. 非阻塞 I/O(Non-blocking I/O)
- 概述
- 3. 阻塞 I/O 与 非阻塞 I/O 的对比
- Socket
- 1. 什么是 Socket?
- 2. Socket 的基本工作原理
- 3. Socket 的类型
- 5. Socket API 的常见函数
- 5. Socket 的特点与使用场景
- 6. 使用 Socket 的注意事项
I/O控制器
UNIX将外界设备抽象为一种特殊文件。
IO控制器被CPU控制,用来控制设备的机械部件设备。接受和识别CPU发出命令,数据交换,地址识别。
I/O 控制器的组成
I/O 控制器通常由以下部分组成:
- 控制寄存器:用于存储设备的控制信息,比如设备状态、命令等。
- 数据寄存器:存储从设备传输到主机或从主机发送到设备的数据。
- 状态寄存器:指示设备的当前状态,比如是否空闲、忙碌或出现错误。
- 缓冲区:用来暂存数据,缓解设备和 CPU 之间速度不匹配的问题。
I/O 控制器的工作流程
- 数据传输:当需要进行数据传输时,CPU 向 I/O 控制器发送请求,并传递相应的指令或数据。I/O 控制器负责将数据从主存中读取或写入到设备。
- 中断管理:当 I/O 设备完成数据传输或出现错误时,I/O 控制器会向 CPU 发送中断信号,以便 CPU 进行相应处理。
- 缓冲处理:为了提高数据传输效率,I/O 控制器通常会利用缓冲区暂存数据,减少 CPU 等待时间。
I/O 控制器的类型
- 通用 I/O 控制器:用于管理多种不同类型的 I/O 设备,如 USB 控制器、SATA 控制器。
- 专用 I/O 控制器:为特定设备设计,如硬盘控制器、网络控制器、图形控制器等。
- DMA 控制器:直接存储器访问(DMA)控制器,用于在内存和 I/O 设备之间进行数据传输,而不需要 CPU 的持续干预,从而提高数据传输效率。
I/O 控制器的主要功能
- 数据格式转换:将 CPU 可以理解的数据格式转换为设备所需的格式,反之亦然。
- 数据缓冲:通过缓冲区实现数据的暂存,减少 CPU 等待时间。
- 中断处理:在设备完成任务或遇到问题时,向 CPU 发出中断信号。
- 设备管理:监控设备的状态和控制设备的操作,如启动、暂停和停止等。
I/O 控制器与操作系统的交互
-
驱动程序:操作系统通过设备驱动程序与 I/O 控制器进行交互,驱动程序提供了控制器的指令集接口,使操作系统能够与设备进行通信。
-
中断服务程序:当控制器发出中断信号时,操作系统会调用相应的中断服务程序来处理中断。
-
数据传输模式:
-
程序控制 I/O:CPU 主动查询设备的状态,进行数据传输。
-
中断驱动 I/O:设备完成任务后通过中断通知 CPU,从而提高 CPU 的利用率。
-
通道控制模式
-
-
DMA 模式:控制器负责数据传输,CPU 只在传输开始和结束时进行干预。
DMA(Direct Memory Access,直接内存访问) 是一种计算机系统技术,它允许外部设备(如硬盘、网络适配器、图形卡等)直接与内存进行数据传输,而不需要通过 CPU 逐字节地管理传输过程。这大大提高了数据传输的效率,并释放了 CPU 资源,使其能够处理其他任务。
-
DMA 的工作原理
DMA 控制器是一个专用的硬件模块,负责在 I/O 设备和内存之间进行数据传输,而无需 CPU 的持续参与。DMA 控制器管理着数据传输的启动、数据块的传输、数据传输的结束和中断通知等。
DMA 操作步骤:
- 初始化 DMA 控制器:
- CPU 发送配置命令,向 DMA 控制器提供内存地址、传输方向、传输数据的数量等信息。
- DMA 控制器启动数据传输:
- DMA 控制器接管数据传输任务,与 I/O 设备和内存进行交互。
- 数据传输进行中:
- DMA 控制器在传输数据时,不会占用 CPU,因此 CPU 可以执行其他任务。
- 传输结束:
- 数据传输完成后,DMA 控制器向 CPU 发送中断信号,告知传输已结束。CPU 随后可以检查传输状态或继续处理相关数据。
DMA 传输模式
DMA 控制器支持多种传输模式,每种模式在传输速率和 CPU 使用上有所不同:
- 突发模式(Burst Mode):
- DMA 控制器一次性传输整个数据块,在传输过程中完全占用系统总线。虽然效率高,但会暂停 CPU 的内存访问,可能导致系统响应时间增加。
- 周期偷取模式(Cycle Stealing Mode):
- DMA 控制器在每个传输周期中从 CPU 获取系统总线的使用权,仅传输一小部分数据,然后释放总线供 CPU 使用。此模式平衡了 CPU 和 DMA 的总线访问,但传输速率低于突发模式。
- 透明模式(Transparent Mode):
- DMA 控制器仅在 CPU 不需要总线时进行传输。此模式对 CPU 运行的影响最小,但可能会导致传输速度较慢。
DMA 控制器的组成
DMA 控制器一般包括以下组成部分:
- 地址寄存器:存储内存中数据的起始地址。
- 计数寄存器:记录要传输的数据字节或字数的数量。
- 控制寄存器:存储传输模式、传输方向等配置信息。
- 状态寄存器:记录 DMA 控制器的当前状态,如传输是否完成或是否出现错误。
组成
CPU与控制器接口:链接
IO逻辑:操作
控制器与设备接口:链接。
内存映像I/O,寄存器独立编址
内存映像 I/O(Memory-Mapped I/O)是一种将 I/O 设备的寄存器地址映射到系统的内存地址空间的技术,使 CPU 可以通过标准的内存访问指令对 I/O 设备进行操作。
寄存器独立编址(Port-Mapped I/O 或 Isolated I/O)是一种通过专门的指令和端口访问 I/O 设备的方法,与内存地址空间分开。
IO软件层次
I/O(输入/输出)软件层次是操作系统设计中用来实现对各种 I/O 设备的高效管理和操作的结构化方法。
用户层 I/O 软件
- 描述:这是与用户最接近的一层,是用户程序或应用程序发起 I/O 请求的地方。用户程序通过调用操作系统提供的系统调用或库函数来执行 I/O 操作,例如读取文件或写入数据。
- 任务:
- 调用系统提供的 I/O 库函数,如
printf()
、scanf()
、fopen()
。 - 提供缓冲区,以便于数据的临时存储和管理。
- 调用系统提供的 I/O 库函数,如
设备独立性软件层
- 描述:与设备无关的操作,这一层旨在屏蔽具体设备的细节,使用户层软件可以使用统一的接口访问不同类型的设备。
- 任务:
- 提供与设备无关的 I/O 接口,如文件系统、设备名称的管理等。
- 设备缓冲区管理和数据格式转换。
- 设备保护和错误处理,如确保用户程序不会访问未授权的设备。
- 设备的分配和回收
- 建立逻辑设备名到物理设备名的映射关系,逻辑设备表,包含驱动程序的地址
设备驱动程序
- 描述:设备驱动程序是操作系统内核中专门用于与特定硬件设备交互的软件。它们是设备无关软件和设备控制器之间的桥梁。
- 任务:
- 与硬件设备进行直接交互,发送控制命令和数据。
- 处理来自设备的中断。
- 执行设备初始化和配置。
- 示例:打印机驱动程序负责将打印请求转换成设备可以理解的语言,并将其发送给打印机。
中断处理程序
- 描述:当设备完成请求或需要服务时,它会向 CPU 发送中断信号。中断处理程序会在收到中断信号后执行预定义的操作,确保设备请求被及时响应。
- 任务:
- 保存当前 CPU 状态并转到中断服务程序。
- 执行必要的设备处理操作,如接收数据或清除状态标志。
- 恢复 CPU 状态并返回原始程序。
- 示例:键盘输入的中断处理程序会在用户按下键盘按键时读取输入并将其存储到缓冲区中。
硬件层
- 描述:这是 I/O 软件层次的最底层,由物理硬件设备组成,包括 I/O 设备、控制器和设备寄存器。
- 任务:
- 执行具体的 I/O 操作,如读取数据块、发送数据字节。
- 响应驱动程序发送的命令。
- 示例:硬盘控制器负责将磁盘的物理操作(如旋转和定位磁头)转换成数据传输。
各层次间的交互流程
- 用户层发起 I/O 请求(如读取文件),调用标准库函数。
- 设备无关软件层接收请求并根据设备类型选择合适的设备驱动程序。
- 设备驱动程序与硬件设备控制器交互,向其发送命令。
- 硬件层执行具体的 I/O 操作,并通过中断向系统通知完成情况。
- 中断处理程序捕获中断信号,执行相应的中断服务,通知上层软件传输完成。
- 数据通过设备驱动程序返回到设备无关软件层,再返回给用户层程序。
输入输出应用程序接口
输入输出应用程序接口(I/O API)
- I/O 应用程序接口是由操作系统提供的、供用户程序调用的函数或系统调用,用于执行输入输出操作。它为用户程序屏蔽了底层的复杂细节,使程序员可以使用简单的函数调用实现复杂的 I/O 操作。
应用层和操作系统层的交互
用户程序调用 I/O API,操作系统将调用转发给相关的设备无关软件层,再通过设备驱动程序与硬件设备进行交互。
驱动程序接口
概述
- 驱动程序接口是操作系统与硬件设备之间的桥梁,位于 I/O 软件的设备驱动程序层。驱动程序为操作系统提供了一种标准化的方式与特定的硬件设备进行交互。
特点
- 与硬件紧密结合:驱动程序直接与硬件设备的寄存器和控制器交互,负责将高层请求转化为设备可以理解的命令。
- 设备专用:不同类型的设备通常需要不同的驱动程序。例如,打印机、网卡、硬盘等设备都有各自的驱动程序。
- 中断处理:驱动程序负责处理设备发出的中断信号,确保数据传输完成或报告错误状态。
- 错误处理和状态监控:驱动程序会监控设备的状态,处理异常并将错误报告给操作系统。
驱动程序的接口功能
- 初始化:配置设备的初始状态。
- 数据传输:实现数据的读写操作。
- 中断服务:处理硬件中断信号,确保设备请求得到响应。
- 设备控制:执行设备特定的控制操作,如调节打印机的纸张输出、改变屏幕分辨率等。
3. I/O API 和驱动程序接口的对比
特性 | I/O API 接口 | 驱动程序接口 |
---|---|---|
使用层次 | 用户层和操作系统层之间 | 操作系统与硬件之间 |
抽象程度 | 高,屏蔽底层硬件细节,提供统一调用 | 低,与硬件密切相关,需要处理具体设备的细节 |
目标用户 | 应用程序开发者 | 操作系统开发者、硬件工程师 |
复杂性 | 较低,调用简单,易于使用 | 较高,需要理解设备协议和硬件结构 |
功能范围 | 提供标准的输入输出操作接口,如文件操作 | 提供与设备的直接交互,如发送控制命令、处理中断等 |
设备适应性 | 与设备无关,适用于各种 I/O 操作 | 针对具体设备编写,每个设备通常需要不同的驱动 |
错误处理 | 依赖操作系统提供的错误报告和处理机制 | 负责监控设备状态,处理错误并将状态反馈给上层 |
它们之间的协作关系
- 应用程序通过调用 I/O API 发起 I/O 请求,这些请求由操作系统传递给相应的设备无关软件层。
- 设备无关软件层调用合适的设备驱动程序接口来与硬件设备交互。
- 设备驱动程序执行 I/O 操作,并在操作完成后,通过中断或其他机制通知操作系统。
- 操作系统通过 API 将操作结果返回给应用程序。
阻塞IO和非阻塞IO
阻塞 I/O 和非阻塞 I/O 是操作系统在处理输入输出(I/O)操作时的两种不同模型,主要用于描述应用程序与操作系统进行 I/O 操作时的行为方式。
1. 阻塞 I/O(Blocking I/O)
概述
- 在阻塞 I/O 模型中,当应用程序发起 I/O 请求后,调用进程会被挂起,进入等待状态,直到 I/O 操作完成并返回数据。
- 这种模型简单易用,但在等待期间,应用程序无法执行其他任务,可能导致资源浪费。
特点
- 调用过程:应用程序调用 I/O 函数,等待 I/O 操作完成,调用返回时数据已准备好。
- 使用场景:常用于简单的应用程序或对实时性要求不高的情况。
- 优点:编程简单,逻辑清晰。
- 缺点:等待过程中进程无法执行其他任务,导致应用程序的可扩展性和性能受限。
2. 非阻塞 I/O(Non-blocking I/O)
概述
- 在非阻塞 I/O 模型中,当应用程序发起 I/O 请求时,如果数据未准备好,I/O 函数立即返回,而不会挂起调用进程。程序可以继续执行其他操作或重新尝试读取数据。
3. 阻塞 I/O 与 非阻塞 I/O 的对比
特性 | 阻塞 I/O | 非阻塞 I/O |
---|---|---|
调用行为 | 调用后等待,直到 I/O 操作完成 | 调用后立即返回,数据未就绪时继续其他任务 |
资源利用率 | 低,等待期间资源未被充分利用 | 高,可在等待数据时执行其他操作 |
编程难度 | 较低,代码编写简单 | 较高,需要实现状态检查或轮询 |
适用场景 | 简单任务、对响应性要求不高的程序 | 需要高响应性或实时性的应用程序 |
应用举例 | 文件系统的简单读写操作 | 网络服务器、实时系统 |
Socket
Socket(套接字)是计算机网络编程中的一种通信机制,用于实现不同进程之间的通信,通常用于网络应用程序开发。它抽象了网络通信的底层细节,使得开发者能够通过一致的接口进行数据传输。
1. 什么是 Socket?
- 定义:Socket 是计算机之间或同一台计算机上进程之间进行数据交换的端点。通过 Socket,可以建立一个通信链路,使得数据可以在网络上传输。
- 用途:实现网络通信,如 Web 浏览器访问 Web 服务器、在线聊天应用、FTP 等。
2. Socket 的基本工作原理
Socket 通常使用“客户端-服务器”模型来建立连接并传输数据:
-
服务器端:
- 创建一个 Socket。
- 绑定到一个指定的 IP 地址和端口号。
- 监听连接请求。
- 接收连接并处理通信。
-
客户端:
- 创建一个 Socket。
- 连接到指定的服务器地址和端口号。
- 发送和接收数据。
3. Socket 的类型
Socket 类型决定了其支持的通信协议和方式。常见的有:
- 流式套接字(Stream Socket):
- 使用 TCP(传输控制协议),提供面向连接、可靠的双向通信。
- 适合需要可靠数据传输的应用,如 HTTP、FTP。
- 数据报套接字(Datagram Socket):
- 使用 UDP(用户数据报协议),提供面向无连接、不可靠的数据传输。
- 适合对速度有更高要求、对可靠性要求不高的应用,如视频流、在线游戏。
5. Socket API 的常见函数
函数 | 说明 |
---|---|
socket() | 创建一个套接字对象 |
bind() | 将套接字绑定到指定的 IP 和端口 |
listen() | 开始监听连接请求 |
accept() | 接收客户端连接 |
connect() | 客户端连接到服务器 |
send() / sendall() | 发送数据 |
recv() | 接收数据 |
close() | 关闭套接字 |
5. Socket 的特点与使用场景
- TCP Socket:提供可靠的数据传输,适合需要完整数据交付的应用。
- UDP Socket:轻量、无连接的传输方式,适合实时传输,如语音通话、视频流。
6. 使用 Socket 的注意事项
- 错误处理:在编写 Socket 程序时,应处理网络故障、超时、数据丢失等问题。
- 多线程/异步编程:在处理多个客户端时,通常需要使用多线程或异步编程来提高服务器的并发能力。
- 端口:同一台计算机上的不同应用程序必须使用不同的端口号来避免冲突。
相关文章:

操作系统学习笔记-5.1-IO设备
文章目录 I/O控制器I/O 控制器的组成I/O 控制器的工作流程I/O 控制器的类型I/O 控制器的主要功能I/O 控制器与操作系统的交互DMA 的工作原理DMA 传输模式DMA 控制器的组成 组成内存映像I/O,寄存器独立编址 IO软件层次用户层 I/O 软件设备独立性软件层设备驱动程序中…...

页面、组件、应用、生命周期(微信小程序)
文章目录 页面生命周期函数组件生命周期函数应用(App)生命周期函数页面与组件生命周期的执行顺序注意事项 在微信小程序中,生命周期函数是指页面或组件在不同阶段会被自动调用的特定函数。这些函数可以帮助开发者在适当的时机完成特定的初始化…...

书生第四期实训营进阶岛——L2G4000 InternVL 多模态模型部署微调实践
基础任务 体验InternVL 运行demo 效果如下: 使用XTuner对InternVL进行微调 运行demo 效果如下:...

国内 ChatGPT中文版镜像网站整理合集(2024/11/08)
一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4,4o以及MJ绘画 1. 什么是镜像站 镜像站(Mirror Siteÿ…...

SpringBoot整合Liquibase对数据库管理和迁移
简介 Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的…...

太空旅游:科技能否让星辰大海变为现实?
内容概要 在这个快速变化的时代,太空旅游成为了一个让人热血沸腾的话题。想象一下,坐在一颗漂浮的太空舱里,手中端着饮料,眺望着无尽的星辰大海,简直就像科幻电影中的情节一样。不过,这不仅仅是一个空洞的…...

[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…...

Elasticsearch-linux环境部署
本文主要介绍linux下elasticsearch的部署。通过在一台linux服务器中分别对elasticsearch-6.7.2版本,elasticsearch-7.3.0版本来进行安装,记录在安装elasticsearch-7.3.0版本时出现的异常情况,以及elasticsearch-head的安装。 基础环境 本机已…...

LeetCode 每日一题 长度为 K 的子数组的能量值
长度为 K 的子数组的能量值 给你一个长度为 n 的整数数组 nums 和一个正整数 k 。 一个数组的 能量值 定义为: 如果 所有 元素都是依次 连续 且 上升 的,那么能量值为 最大 的元素。 否则为 -1 。 你需要求出 nums 中所有长度为 k 的 子数组 的能量值。 …...

人工智能——小白学习指南
知孤云出岫 目录 1. **智能评测系统**2. **个性化学习路径推荐**3. **虚拟学习助手**4. **学习行为分析**5. **数据驱动的教学决策**6. **自动化课程推荐**7. **数据隐私与安全保护** 人工智能知识点的总结和学习路线,以数据表格形式呈现,并附带在教育行…...

go 集成Gin Web开发框架
引入gin的依赖 下载并安装 gin go get -u github.com/gin-gonic/gin 将 gin 引入到代码中 import "github.com/gin-gonic/gin" 开始 package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/ping", func(c …...

c++ 多态性
类的多态 多态概念入门 #include <iostream> using namespace std;/* 多态的前提: 拥有继承关系的类中有相同的函数(返回类型、函数名、形参列表) 多态解决的问题:1、派生类的对象被赋值给基类对象时2、派生类的对象初始化基类的引用时3、基类的指针指向派生…...

块存储、文件存储和对象存储详细介绍
块存储、文件存储和对象存储介绍 块存储:像跑车,因为它们都能提供快速的响应和高性能,适合需要即时数据访问的场景,比如数据库和虚拟化技术。 文件存储:像货车,因为它们都能承载大量货物(文件&…...

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (9) - 编译现有的AWTK应用程序
AWTK 应用程序开发完成后,在配置文件中添加 harmonyos 的选项,通过create_project.py脚本即可生成 DevEco Studio的工程。 安装开发环境 DevEco Studio HarmonyOS 的开发工具。 Python 运行环境。 git 源码管理工具。 下载 awtk 和 awtk-harmonyos…...

ssm基于BS的仓库在线管理系统的设计与实现+vue
系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码看文章最下面 需要定制看文章最下面 目 录 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环境与技术3 …...

面试题:Spring(一)
1. Spring框架中bean是单例么? Service Scope("singleton") public class UserServiceImpl implements UserService { }singleton : bean在每个Spring IOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例。 2. Spring框架中的…...

MySQ怎么使用语法介绍(详细)
一、什么是库结构 库结构的意思就是指数据库的结构。所以,理解“库结构”就要先理解“库”是什么。 在数据库的上下文中,库指的是一个数据库。简单来说,数据库(库)是用来存储和管理数据的容器。它不仅存储实际的数据…...

新能源汽车与公共充电桩布局
近年来,全球范围内对新能源汽车产业的推动力度不断增强,中国新能源汽车市场也呈现蓬勃发展的势头,在政策与市场的共同推动下,新能源汽车销量持续增长。然而,据中国充电联盟数据显示,充电基础设施建设滞后于新能源汽车数量增长的现状导致充电桩供需不平衡,公共充电桩服务空白区域…...

【GIT】sourceTree的“当前分支“,“合并分支“与“检出分支的区别
GIT三款经典可视化 由上文文档得出灵感写出此篇 这三个概念在 Git 操作中都是很常见的, 来逐个解析: 1. 当前分支 “当前分支”就是你目前正在工作的分支。你在进行任何代码修改、提交等操作时,都会应用到“当前分支”上。换句话说…...

【Git】如何在 Git 中高效合并分支:完整指南
目录 引言1. 切换到主分支1.1 切换分支命令1.2 相关命令1.3 切换分支示意图 2. 合并分支2.1 基本合并命令2.2 合并选项2.3 合并流程示意图 3. 解决冲突3.1 解决冲突的步骤3.2 相关命令3.3 解决冲突示意图 4. 本地更新分支4.1 拉取远程更改4.2 更新主分支4.3 拉取远程更新到本地…...

成都睿明智科技有限公司抖音电商服务效果如何?
在这个短视频风起云涌的时代,抖音电商以其独特的魅力,成为了众多商家竞相追逐的新蓝海。而在这片波澜壮阔的商海中,成都睿明智科技有限公司犹如一艘稳健的航船,引领着无数企业驶向成功的彼岸。今天,就让我们一起揭开成…...

收集的linux命令/Docker命令/git命令
查看linux发行版本 lsb_release -a显示操作系统的发行版号 uname -r1. 启动 Docker。 sudo systemctl start docker2. 通过运行映像来验证 Docker 引擎安装是否成功。hello-world sudo docker run hello-world查看docker版本 docker -v查看docker配置信息 docker infodoc…...

DNS域名解析实验
准备工作 [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# mount /dev/sr0 /mnt [rootlocalhost ~]# dnf install bind -y DNS正向解析: 对主配置文件进行修改 [rootlocalhost ~]# vim /etc/named.conf 正向解析…...

Dify 本地部署指南
一、前置条件 Clone Dify 代码: git clone https://github.com/langgenius/dify.git 在启用业务服务之前,我们需要先部署 PostgresSQL / Redis / Weaviate(如果本地没有的话),可以通过以下命令启动: cd…...

15分钟学 Go 第 38 天:数据库基础
第38天 - 数据库基础 学习目标 学习如何连接和操作数据库,包括基本的增、删、改、查功能,以及如何使用Go语言中的database/sql包进行数据库交互。 内容概述 在现代应用程序中,数据库是数据持久化的重要部分。Go语言通过database/sql包提供…...

【Python】图片处理
一、获取图片尺寸 优点缺点Pillow功能丰富,支持多种图像处理操作。使用简单,适合快速原型开发。对于处理大型图像或批量图像时,性能可能不如OpenCV。OpenCV性能强大,适合处理大型图像和视频处理。提供了丰富的计算机视觉算法。相…...

面相小白的php反序列化漏洞原理剖析
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理反序列化漏洞的一些成因原理 建议学习反序列化之前 先对php基础语法与面向对象有个大体的了解 (我觉得我整理的比较细致,了解这俩是个啥就行) 漏洞实战情况 这个漏洞黑盒几乎不会被发现&am…...

文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
在众多的 AI 大模型的应用场景中,Text-to-SQL,也就是文本转 SQL,是其中实用性很高的一个。Text-to-SQL 充分利用了大模型的优势,把用户提供的自然语言描述转换成 SQL 语句,还可以执行生成的 SQL 语句,再把查…...

科研绘图系列:R语言组合堆积图(stacked plot)
文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…...

YOLOv11及自研模型更新汇总
YOLOv11使用教程:YOLOv11入门到入土使用教程(含结构图) 缝合教程:深度学习模块创作(缝合)教程|适合1-360月小宝宝食用,干货满满 YOLO中的yaml文件详解:https://xy2668825911.blog.csdn.net/article/details…...