Linux I/O 訪問架構深入分析

Linux I/O 訪問架構深入分析

目錄

  • 概述
  • I/O 架構層次
  • 核心數據結構
  • I/O 處理流程
  • VFS 虛擬文件系統
  • 塊設備I/O
  • 字符設備I/O
  • 內存映射I/O
  • 異步I/O機制
  • I/O調度器
  • 調試工具與方法
  • 性能優化策略

概述

Linux I/O 系統是一個多層次、高度抽象的架構,旨在為應用程序提供統一的文件訪問接口,同時支持各種不同類型的存儲設備和文件系統。

用戶空間應用程序
系統調用接口
虛擬文件系統 VFS
具體文件系統
頁緩存層
塊設備層
設備驅動層
硬件設備
字符設備
設備驅動
硬件設備

I/O 架構層次

架構分層表

層次組件主要功能關鍵數據結構
用戶空間應用程序文件操作API調用FILE*, fd
系統調用內核入口參數驗證、權限檢查system_call table
VFS層虛擬文件系統統一文件接口抽象inode, dentry, file
文件系統層ext4/xfs/btrfs等具體文件系統實現super_block, inode_operations
頁緩存層Page CacheI/O緩存和優化address_space, page
塊設備層Block Layer塊設備I/O管理bio, request, request_queue
設備驅動層驅動程序硬件抽象接口block_device_operations
硬件層存儲設備物理存儲介質硬件寄存器、DMA

核心數據結構

文件系統核心結構

/* 文件結構體 - 表示一個打開的文件 */
struct file {struct path             f_path;         /* 文件路徑 */struct inode           *f_inode;        /* 關聯的inode */const struct file_operations *f_op;     /* 文件操作函數表 */spinlock_t              f_lock;         /* 文件鎖 */atomic_long_t           f_count;        /* 引用計數 */unsigned int            f_flags;        /* 文件標志 */fmode_t                 f_mode;         /* 文件模式 */struct mutex            f_pos_lock;     /* 位置鎖 */loff_t                  f_pos;          /* 文件位置 */struct fown_struct      f_owner;        /* 文件所有者 */const struct cred      *f_cred;         /* 文件憑證 */struct file_ra_state    f_ra;           /* 預讀狀態 */u64                     f_version;      /* 版本號 */void                   *private_data;   /* 私有數據 */struct address_space   *f_mapping;      /* 地址空間映射 */
};/* inode結構體 - 文件系統中的文件節點 */
struct inode {umode_t                 i_mode;         /* 文件類型和權限 */unsigned short          i_opflags;     /* 操作標志 */kuid_t                  i_uid;          /* 用戶ID */kgid_t                  i_gid;          /* 組ID */unsigned int            i_flags;       /* 文件系統標志 */const struct inode_operations *i_op;   /* inode操作 */struct super_block     *i_sb;          /* 超級塊 */struct address_space   *i_mapping;     /* 地址空間 */void                   *i_security;    /* 安全模塊 */unsigned long           i_ino;         /* inode號 */dev_t                   i_rdev;        /* 設備號 */loff_t                  i_size;        /* 文件大小 */struct timespec64       i_atime;       /* 訪問時間 */struct timespec64       i_mtime;       /* 修改時間 */struct timespec64       i_ctime;       /* 創建時間 */spinlock_t              i_lock;        /* inode鎖 */unsigned short          i_bytes;       /* 字節數 */u8                      i_blkbits;     /* 塊大小位數 */blkcnt_t                i_blocks;      /* 塊數 */const struct file_operations *i_fop;   /* 文件操作 */struct hlist_head       i_dentry;      /* dentry鏈表 */struct rw_semaphore     i_rwsem;       /* 讀寫信號量 */union {struct pipe_inode_info  *i_pipe;   /* 管道信息 */struct cdev             *i_cdev;   /* 字符設備 */char                    *i_link;   /* 符號鏈接 */unsigned                i_dir_seq; /* 目錄序列號 */};
};/* 文件操作函數表 */
struct file_operations {struct module *owner;loff_t (*llseek)(struct file *, loff_t, int);ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);ssize_t (*read_iter)(struct kiocb *, struct iov_iter *);ssize_t (*write_iter)(struct kiocb *, struct iov_iter *);int (*iopoll)(struct kiocb *kiocb, bool spin);int (*iterate)(struct file *, struct dir_context *);int (*iterate_shared)(struct file *, struct dir_context *);__poll_t (*poll)(struct file *, struct poll_table_struct *);long (*unlocked_ioctl)(struct file *, unsigned int, unsigned long);long (*compat_ioctl)(struct file *, unsigned int, unsigned long);int (*mmap)(struct file *, struct vm_area_struct *);unsigned long mmap_supported_flags;int (*open)(struct inode *, struct file *);int (*flush)(struct file *, fl_owner_t id);int (*release)(struct inode *, struct file *);int (*fsync)(struct file *, loff_t, loff_t, int datasync);int (*fasync)(int, struct file *, int);int (*lock)(struct file *, int, struct file_lock *);ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*flock)(struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **, void **);long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len);void (*show_fdinfo)(struct seq_file *m, struct file *f);ssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int);loff_t (*remap_file_range)(struct file *file_in, loff_t pos_in,struct file *file_out, loff_t pos_out,loff_t len, unsigned int remap_flags);int (*fadvise)(struct file *, loff_t, loff_t, int);
};

塊設備I/O核心結構

/* BIO結構體 - 塊I/O描述符 */
struct bio {struct bio              *bi_next;       /* 鏈表中下一個bio */struct gendisk          *bi_disk;       /* 目標磁盤 */unsigned int            bi_opf;         /* 操作標志 */unsigned short          bi_flags;       /* 狀態標志 */unsigned short          bi_ioprio;      /* I/O優先級 */unsigned short          bi_write_hint;  /* 寫提示 */blk_status_t            bi_status;      /* I/O狀態 */u8                      bi_partno;      /* 分區號 */atomic_t                __bi_remaining; /* 剩余I/O計數 */struct bvec_iter        bi_iter;        /* 迭代器 */bio_end_io_t            *bi_end_io;     /* 完成回調 */void                    *bi_private;    /* 私有數據 */struct bio_crypt_ctx    *bi_crypt_context; /* 加密上下文 */struct bio_integrity_payload *bi_integrity; /* 完整性載荷 */unsigned short          bi_vcnt;        /* bio_vec數量 */unsigned short          bi_max_vecs;    /* 最大bio_vec數量 */atomic_t                __bi_cnt;       /* 引用計數 */struct bio_vec          *bi_io_vec;     /* bio_vec數組 */struct bio_set          *bi_pool;       /* 內存池 */struct bio_vec          bi_inline_vecs[]; /* 內聯bio_vec */
};/* 請求結構體 - I/O請求 */
struct request {struct request_queue    *q;             /* 請求隊列 */struct blk_mq_ctx       *mq_ctx;        /* 多隊列上下文 */struct blk_mq_hw_ctx    *mq_hctx;       /* 硬件隊列上下文 */unsigned int            cmd_flags;      /* 命令標志 */req_flags_t             rq_flags;       /* 請求標志 */int                     tag;            /* 請求標簽 */int                     internal_tag;   /* 內部標簽 */sector_t                __sector;       /* 起始扇區 */unsigned int            __data_len;     /* 數據長度 */struct bio              *bio;           /* 關聯的bio */struct bio              *biotail;       /* bio鏈表尾 */struct hlist_node       hash;           /* 哈希鏈表節點 */union {struct rb_node      rb_node;        /* 紅黑樹節點 */struct bio_vec      special_vec;    /* 特殊向量 */};union {struct hd_struct    *part;          /* 分區信息 */int                 margin_lvl;     /* 邊界級別 */};unsigned long           deadline;       /* 截止時間 */struct list_head        timeout_list;  /* 超時鏈表 */unsigned int            timeout;        /* 超時值 */int                     retries;        /* 重試次數 */rq_end_io_fn            *end_io;        /* 完成回調 */void                    *end_io_data;   /* 完成回調數據 */
};

I/O 處理流程

系統調用到設備驅動的數據流

應用程序系統調用VFS層文件系統頁緩存塊設備層設備驅動硬件read(fd, buf, len)sys_read()file_operations->>read()檢查頁緩存返回緩存數據提交bio請求調用驅動函數發送硬件命令完成中斷調用完成回調更新頁緩存alt[緩存命中][緩存未命中]返回數據返回讀取結果返回用戶空間應用程序系統調用VFS層文件系統頁緩存塊設備層設備驅動硬件

read系統調用詳細流程

普通文件
字符設備
塊設備
用戶調用read
進入內核sys_read
獲取file結構
檢查文件權限
調用vfs_read
file->f_op->read_iter
文件類型?
generic_file_read_iter
字符設備read
塊設備read
查找頁緩存
緩存命中?
復制到用戶緩存
分配新頁面
構造bio請求
提交到塊設備層
I/O調度器處理
設備驅動執行
DMA傳輸
完成中斷
更新頁緩存
返回用戶空間

VFS 虛擬文件系統

VFS 架構關系圖

VFS
+inode: struct inode
+dentry: struct dentry
+file: struct file
+super_block: struct super_block
inode
+i_mode: umode_t
+i_size: loff_t
+i_op: inode_operations*
+i_fop: file_operations*
+i_mapping: address_space*
dentry
+d_name: qstr
+d_inode: inode*
+d_parent: dentry*
+d_subdirs: list_head
+d_op: dentry_operations*
file
+f_path: path
+f_inode: inode*
+f_op: file_operations*
+f_pos: loff_t
+f_mapping: address_space*
address_space
+host: inode*
+i_pages: xarray
+a_ops: address_space_operations*
+nrpages: unsigned_long

VFS核心操作表

操作類型結構體主要函數功能描述
文件操作file_operationsread, write, open, release文件I/O操作
inode操作inode_operationscreate, lookup, mkdir, rmdir文件系統對象操作
地址空間操作address_space_operationsreadpage, writepage, direct_IO頁緩存操作
超級塊操作super_operationsalloc_inode, destroy_inode, sync_fs文件系統級操作
目錄項操作dentry_operationsd_revalidate, d_hash, d_compare目錄緩存操作

塊設備I/O

塊設備I/O架構

I/O調度器類型
塊設備I/O棧
noop
deadline
cfq
bfq
kyber
文件系統層
VFS層
頁緩存層
BIO層
請求層
I/O調度器
多隊列層
驅動層
硬件層

BIO生命周期

bio_alloc()
bio_set_dev()
bio_add_page()
繼續添加
submit_bio()
I/O調度器處理
設備驅動處理
bio_endio()
bio_put()
發生錯誤
可重試錯誤
不可重試錯誤
創建
初始化
添加頁面
提交
調度
執行
完成
釋放
錯誤
重試

字符設備I/O

字符設備架構

/* 字符設備結構體 */
struct cdev {struct kobject kobj;                /* 內核對象 */struct module *owner;               /* 所屬模塊 */const struct file_operations *ops;  /* 操作函數表 */struct list_head list;              /* 鏈表節點 */dev_t dev;                          /* 設備號 */unsigned int count;                 /* 設備數量 */
};/* 字符設備注冊流程 */
static struct file_operations globalmem_fops = {.owner = THIS_MODULE,.llseek = globalmem_llseek,.read = globalmem_read,.write = globalmem_write,.unlocked_ioctl = globalmem_ioctl,.open = globalmem_open,.release = globalmem_release,
};

字符設備I/O流程

用戶空間VFS字符設備設備驅動硬件open("/dev/mydev")查找字符設備cdev->>ops->>open()初始化硬件硬件就緒返回成功返回文件描述符write(fd, data, len)fops->>write()寫入硬件寄存器完成寫入返回寫入字節數返回結果用戶空間VFS字符設備設備驅動硬件

內存映射I/O

mmap機制

物理內存
頁表映射
虛擬內存區域
物理頁面
頁緩存
頁全局目錄
頁上級目錄
頁中間目錄
頁表項
vm_area_struct
vm_start
vm_end
vm_flags
vm_operations_struct

mmap系統調用流程

/* mmap實現示例 */
static int globalmem_mmap(struct file *filp, struct vm_area_struct *vma)
{unsigned long size = vma->vm_end - vma->vm_start;/* 檢查映射大小 */if (size > GLOBALMEM_SIZE)return -EINVAL;/* 設置頁面不可交換 */vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;/* 建立頁表映射 */if (remap_pfn_range(vma, vma->vm_start,virt_to_phys(globalmem_devp->mem) >> PAGE_SHIFT,size, vma->vm_page_prot))return -EAGAIN;return 0;
}

異步I/O機制

AIO架構

完成處理
異步I/O棧
工作隊列
中斷處理
完成處理
完成環
libaio庫
應用程序
io_submit系統調用
AIO核心
內核I/O控制塊
BIO層
塊設備層

io_uring新機制

零拷貝機制
io_uring架構
共享內存
內存映射
提交隊列
應用程序
SQ Ring
內核處理
完成隊列
CQ Ring

I/O調度器

調度器對比表

調度器特點適用場景算法復雜度
noop簡單FIFOSSD、虛擬化環境O(1)
deadline截止時間保證實時系統O(log n)
cfq完全公平隊列多用戶環境O(log n)
bfq預算公平隊列交互式應用O(log n)
kyber多隊列優化高性能SSDO(1)

CFQ調度器算法

CFQ調度器
RT
BE
IDLE
請求類別
請求
實時隊列
最優努力隊列
空閑隊列
優先級
優先級0隊列
優先級1隊列
優先級7隊列
調度器

調試工具與方法

系統I/O監控工具

工具名稱功能描述使用場景輸出信息
iostatI/O統計信息性能監控IOPS、吞吐量、延遲
iotop進程I/O排序問題定位每進程I/O使用率
blktrace塊設備跟蹤深度分析I/O請求路徑
strace系統調用跟蹤調試系統調用序列
perf性能分析優化CPU、I/O熱點
ftrace內核函數跟蹤內核調試函數調用鏈

常用調試命令

# I/O性能監控
iostat -x 1        # 每秒顯示擴展I/O統計
iotop -o           # 顯示有I/O活動的進程
vmstat 1           # 系統整體統計# 塊設備跟蹤
blktrace -d /dev/sda -o trace
blkparse trace.blktrace.0# 進程I/O分析
cat /proc/PID/io   # 進程I/O統計
lsof +D /path      # 文件描述符分析# 內核調試
echo 1 > /sys/kernel/debug/tracing/events/block/enable
cat /sys/kernel/debug/tracing/trace# 頁緩存分析
cat /proc/meminfo | grep -E "(Cached|Buffers|Dirty)"
echo 3 > /proc/sys/vm/drop_caches  # 清理頁緩存# 文件系統分析
df -h              # 磁盤使用情況
mount | column -t  # 掛載信息
tune2fs -l /dev/sda1  # ext文件系統信息

性能分析腳本

#!/bin/bash
# I/O性能分析腳本echo "=== I/O Performance Analysis ==="# 1. 基本I/O統計
echo "1. Basic I/O Statistics:"
iostat -x 1 5# 2. 進程I/O排序
echo "2. Top I/O Processes:"
iotop -a -o -d 1 -n 5# 3. 磁盤使用情況
echo "3. Disk Usage:"
df -h# 4. 內存和緩存狀態
echo "4. Memory and Cache Status:"
free -h
cat /proc/meminfo | grep -E "(Cached|Buffers|Dirty|Writeback)"# 5. 文件描述符使用
echo "5. File Descriptor Usage:"
cat /proc/sys/fs/file-nr# 6. I/O調度器信息
echo "6. I/O Scheduler:"
for dev in /sys/block/*/queue/scheduler; doecho "$dev: $(cat $dev)"
done

內核調試技術

/* 內核調試宏和技術 *//* 1. printk調試 */
#define DEBUG_IO 1
#if DEBUG_IO
#define io_debug(fmt, ...) \printk(KERN_DEBUG "IO_DEBUG: " fmt, ##__VA_ARGS__)
#else
#define io_debug(fmt, ...)
#endif/* 2. 跟蹤點 */
#include <linux/tracepoint.h>TRACE_EVENT(my_io_event,TP_PROTO(struct file *file, size_t count, loff_t pos),TP_ARGS(file, count, pos),TP_STRUCT__entry(__field(unsigned long, inode)__field(size_t, count)__field(loff_t, pos)),TP_fast_assign(__entry->inode = file->f_inode->i_ino;__entry->count = count;__entry->pos = pos;),TP_printk("inode=%lu count=%zu pos=%lld",__entry->inode, __entry->count, __entry->pos)
);/* 3. 動態調試 */
#define pr_debug_io(fmt, ...) \pr_debug("IO: " fmt, ##__VA_ARGS__)/* 使用方法 */
static ssize_t my_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
{io_debug("Read request: count=%zu, pos=%lld\n", count, *ppos);trace_my_io_event(filp, count, *ppos);pr_debug_io("Processing read for inode %lu\n", filp->f_inode->i_ino);/* 實際讀取邏輯 */return count;
}

性能優化策略

I/O優化技術對比

優化技術原理適用場景性能提升
頁緩存預讀預先加載后續頁面順序訪問2-10x
異步I/O非阻塞I/O操作高并發應用5-50x
直接I/O繞過頁緩存大文件傳輸20-30%
內存映射避免數據拷貝隨機訪問10-50%
批量I/O合并多個請求小塊I/O2-5x
I/O調度優化減少磁盤尋道機械硬盤20-100%

優化配置示例

# 1. I/O調度器優化
echo mq-deadline > /sys/block/sda/queue/scheduler# 2. 預讀優化
echo 4096 > /sys/block/sda/queue/read_ahead_kb# 3. 隊列深度優化
echo 128 > /sys/block/sda/queue/nr_requests# 4. 內存管理優化
echo 10 > /proc/sys/vm/swappiness
echo 1 > /proc/sys/vm/zone_reclaim_mode# 5. 文件系統優化
mount -o remount,noatime,nodiratime /

應用層優化建議

/* 1. 使用O_DIRECT避免雙重緩存 */
int fd = open("largefile.dat", O_RDONLY | O_DIRECT);/* 2. 使用posix_fadvise提供訪問模式提示 */
posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);/* 3. 使用madvise優化內存映射 */
madvise(addr, length, MADV_WILLNEED);/* 4. 批量I/O操作 */
struct iovec iov[MAX_IOV];
/* 填充iov數組 */
writev(fd, iov, iovcnt);/* 5. 異步I/O */
struct aiocb cb;
aio_read(&cb);
aio_suspend(&cb, 1, NULL);

總結

Linux I/O架構是一個復雜而精密的系統,通過多層抽象和優化技術,為應用程序提供了高效、統一的存儲訪問接口。理解其工作原理和掌握相關的調試技術,對于系統性能優化和問題診斷具有重要意義。

關鍵要點

  1. 分層架構:VFS提供統一接口,底層支持多種文件系統和設備類型
  2. 緩存機制:頁緩存顯著提升I/O性能,但需要合理管理
  3. 異步處理:現代I/O棧大量使用異步機制減少延遲
  4. 調度優化:不同的I/O調度器適用于不同的應用場景
  5. 性能監控:豐富的工具鏈支持深度性能分析和問題診斷

通過深入理解這些機制并合理應用優化技術,可以顯著提升系統的I/O性能和響應能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96311.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux:6_基礎IO

基礎IO 一.理解"文件" 文件分類 1.內存級(被打開)文件 2.磁盤級文件 1. 狹義理解 文件在磁盤里磁盤是永久性存儲介質&#xff0c;因此文件在磁盤上的存儲是永久性的磁盤是外設 (即是輸出設備也是輸入設備)磁盤上的文件本質是對文件的所有操作&#xff0c;都是對外…

Coze源碼分析-資源庫-刪除插件-前端源碼-核心邏輯

刪除插件邏輯 1. 刪除操作入口組件 刪除插件操作主要通過 usePluginConfig hook 中的 renderActions 方法實現&#xff0c;該方法返回 TableAction 組件來處理表格行的操作。 文件位置&#xff1a;frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地狀態(Flink 1.x)

最初的架構將狀態以 JVM Heap 對象的形式存儲在 TaskManager 的內存中。對于小規模數據集&#xff0c;這種方式效果良好&#xff0c;但隨著狀態大小的增長超出內存&#xff0c;將所有狀態保存在內存中變得成本高昂且不穩定。 為了解決狀態規模增長的問題&#xff0c;引入了一種…

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南

跨境金融數據對接實踐&#xff1a;印度NSE/BSE股票行情API集成指南 關鍵詞&#xff1a;印度股票數據對接 NSE實時行情 BSE證券接口 金融API開發 Python請求示例一、印度股市數據源技術解析&#xff08;核心價值&#xff09; 印度兩大交易所數據獲取難點&#xff1a; 時區差異&a…

AFSim2.9.0學習筆記 —— 1、AFSim及完整工具介紹(文末附:完整afsim2.9.0源碼、編譯好的完整工具包、中文教材等)

&#x1f514; AFSim2.9.0 相關技術、疑難雜癥文章合集&#xff08;掌握后可自封大俠 ?_?&#xff09;&#xff08;記得收藏&#xff0c;持續更新中…&#xff09; AFSim介紹 AFSim&#xff08;Advanced Framework for Simulation Integration & Modeling【高級仿真集成與…

ArcGIS學習-18 實戰-降雨量空間分布插值分析

設置環境加載要素投影查看要素&#xff0c;發現均不是投影數據&#xff0c;但都是地理坐標都是WGS1984使用工具進行批量投影然后新建空地圖&#xff0c;重新加載確認圖層的投影與柵格數據一致插值樣條法得到反距離權重法插值得到克里金法插值得到

HarmonyOS應用開發:深入理解聲明式UI與彈窗交互的最佳實踐

HarmonyOS應用開發&#xff1a;深入理解聲明式UI與彈窗交互的最佳實踐 引言 隨著HarmonyOS 4.0的發布及后續版本的演進&#xff0c;華為的分布式操作系統已經進入了全新的發展階段。基于API 12及以上的開發環境為開發者提供了更強大、更高效的開發工具和框架。在HarmonyOS應用…

探索Java并發編程--從基礎到高級實踐技巧

Thread&#xff08;線程&#xff09;線程 程序執行的最小單位&#xff08;一個進程至少有一個線程&#xff09;。線程內有自己的執行棧、程序計數器&#xff08;PC&#xff09;&#xff0c;但與同進程內其他線程共享堆內存與進程資源 在java中&#xff0c;線程由java.lang.Thr…

Go語言實戰案例-開發一個Markdown轉HTML工具

這個小工具可以把 .md 文件轉換為 .html 文件&#xff0c;非常適合寫筆記、博客或者快速預覽 Markdown 內容。&#x1f4cc; 案例目標? 讀取一個 Markdown 文件? 使用開源庫將 Markdown 轉換為 HTML? 將 HTML 輸出到新文件中&#x1f4e6; 所需庫我們用 goldmark 這個 Markd…

基于51單片機的太陽能鋰電池充電路燈

基于51單片機的太陽能鋰電池充電路燈系統設計 1 系統功能介紹 本設計以 STC89C52單片機 為核心&#xff0c;構建了一個能夠利用太陽能為鋰電池充電并智能控制LED路燈的系統。系統結合了 光照檢測電路、LED燈電路、按鍵檢測電路、太陽能充電電路 等模塊&#xff0c;實現了節能、…

PAT 1178 File Path

這一題的大意是給出了一個windows的文件夾目錄&#xff0c;讓我們按照所屬的目錄關系&#xff0c;來找相應的目錄是否存在&#xff0c;如果存在&#xff0c;就輸出找到該文件的路徑&#xff0c;如果不存在輸出error 我的思路是用合適的樹形結構保存下來目錄的所屬關系&#xff…

云原生部署_k8s入門

K8S官網文檔&#xff1a;&#xfeff;https://kubernetes.io/zh/docs/home/Kubernetes是什么Kubernetes 是用于自動部署、擴縮和管理容器化應用程序的開源系統。 Kubernetes 源自 &#xff0c;Google 15 年生產環境的運維經驗同時凝聚了社區的最佳創意和實踐。簡稱K8s.Kubernet…

實戰項目-----Python+OpenCV 實現對視頻的椒鹽噪聲注入與實時平滑還原”

實戰項目實現以下功能&#xff1a;功能 1&#xff1a;為視頻每一幀添加椒鹽噪聲作用&#xff1a;模擬真實環境中圖像傳輸或采集時可能出現的噪聲。實現方式&#xff1a;讀取視頻的每一幀。隨機選擇 10000 個像素點&#xff0c;將其設置為黑色&#xff08;0&#xff09;或白色&a…

Day42 PHP(mysql注入、跨庫讀取)

一、sql注入基本原理&#xff1a;沒有對用戶輸入的數據進行限制&#xff0c;導致數據庫語句可以做什么&#xff0c;用戶就可以做什么。取決于不同數據庫的不同查詢語言&#xff0c;所以為什么有mysql注入/orcale注入等等。步驟&#xff1a;【access】表名&#xff08;字典爆破來…

機器人控制器開發(部署——軟件打包備份更新)

文章總覽 為什么做備份更新 為機器人控制器設計一套打包備份更新機制&#xff0c;為控制器的批量生產和產品與項目落地做準備。 當某個模塊出現bug需要升級時&#xff0c;用戶可以快速獲取正確的bak包并導入到控制器中重啟生效。 如果沒有做好軟件的備份更新機制&#xff0c…

LaTeX TeX Live 安裝與 CTAN 國內鏡像配置(Windows / macOS / Linux 全流程)

這是一份面向國內環境的 LaTeX 從零到可編譯 指南&#xff1a;覆蓋 TeX Live / MacTeX 安裝、PATH 配置、CTAN 國內鏡像&#xff08;清華/北外/上交/中科大等&#xff09;一鍵切換與回滾、常見坑位&#xff08;權限、鏡像路徑、版本切換&#xff09;、以及 XeLaTeX/latexmk 的實…

WhoisXML API再次榮登2025年美國Inc. 5000快速成長企業榜單

WhoisXML API非常自豪地宣布&#xff0c;我們再次榮登美國權威榜單——2025年Inc.5000全美成長最快的私營企業之一。今年&#xff0c;公司在地區排名中位列第119名&#xff0c;在全美總體排名中位列第4,271名。Inc. 5000榜單要求參評企業必須保持獨立運營&#xff0c;并在2021至…

Elasticsearch面試精講 Day 9:復合查詢與過濾器優化

【Elasticsearch面試精講 Day 9】復合查詢與過濾器優化 在Elasticsearch的搜索體系中&#xff0c;復合查詢&#xff08;Compound Queries&#xff09;與過濾器&#xff08;Filters&#xff09;優化是構建高效、精準搜索邏輯的核心能力。作為“Elasticsearch面試精講”系列的第…

Android使用ReactiveNetwork監聽網絡連通性

引入庫 implementation com.github.pwittchen:reactivenetwork-rx2:3.0.8監聽網絡連接變更ReactiveNetwork.observeNetworkConnectivity(context).subscribeOn(Schedulers.io())// ... // anything else what you can do with RxJava.observeOn(Schedulers.computation()).subs…

基于阿里云部署 RustDesk 自托管服務器

基于阿里云部署 RustDesk 自托管服務器一、背景與需求場景二、什么是 RustDesk&#xff1f;為什么選擇自托管&#xff1f;2.1 RustDesk 是什么&#xff1f;2.2 為什么選擇自托管&#xff1f;三、環境準備與架構說明四、操作步驟4.1 在阿里云上安裝 RustDesk 服務端4.1.1 下載并…