第31篇:塊設備與字符設備管理深度解析(基于OpenEuler 24.03)

塊設備與字符設備管理深度解析(基于OpenEuler 24.03)

文章目錄

  • 塊設備與字符設備管理深度解析(基于OpenEuler 24.03)
    • 一、設備基礎概念體系
      • 1.1 塊設備的核心特性與分類
      • 1.2 字符設備的流式數據模型
      • 1.3 設備標識系統:主設備號與次設備號
    • 二、設備信息查詢與管理工具
      • 2.1 系統設備注冊表:/proc/devices
      • 2.2 塊設備可視化工具:lsblk
        • 2.2.1 基本用法與輸出解析
        • 2.2.2 高級查詢功能
      • 2.3 設備號查詢工具:ls -l
    • 三、設備文件操作與管理
      • 3.1 手動創建設備文件:mknod
      • 3.2 自動創建設備文件:MAKEDEV
    • 四、udev設備管理系統
      • 4.1 udev概述與發展歷程
      • 4.2 udev核心配置文件
        • 4.2.1 udev.conf配置文件
        • 4.2.2 規則文件目錄:/etc/udev/rules.d
      • 4.3 udev規則語法詳解
        • 4.3.1 操作符類型
        • 4.3.2 常用匹配鍵
        • 4.3.3 常用賦值鍵
      • 4.4 udev規則實例解析
      • 4.5 udev設備信息查詢工具:udevadm
        • 4.5.1 查詢設備路徑信息
        • 4.5.2 全面設備信息查詢
      • 4.6 udev服務控制
    • 五、實戰案例:自定義udev規則
      • 5.1 案例:為USB打印機分配固定名稱
      • 5.2 案例:設置串口設備權限
  • 移除并重新插入打印機
  • 應看到指向實際設備文件的符號鏈接

一、設備基礎概念體系

1.1 塊設備的核心特性與分類

塊設備是Linux系統中以"數據塊"為基本單位進行數據傳輸的設備類型,其核心特征是支持隨機訪問。在OpenEuler 24.03中,塊設備的典型代表包括:

  • 存儲介質類:硬盤(HDD/SSD)、U盤、SD卡等,這類設備以512字節或其整數倍的塊為單位讀寫數據
  • 光學存儲類:CD-ROM、DVD驅動器,數據組織為固定大小的邏輯塊
  • 虛擬存儲類:Loop設備(用于掛載鏡像文件)、RAM磁盤(基于內存的塊設備)

塊設備在文件系統中的標識遵循特定規范:

  • SCSI/SATA設備:/dev/sd[a-z],如/dev/sda表示第一塊SCSI磁盤
  • 光驅設備:/dev/sr[0-9],如/dev/sr0對應系統識別的第一個光驅
  • 軟RAID設備:/dev/md[0-9],用于軟件磁盤陣列
  • 內存磁盤:/dev/ram[0-0]/dev/ram19,基于物理內存創建的塊設備

1.2 字符設備的流式數據模型

字符設備以字節為單位順序處理數據,不支持隨機尋址,適用于數據流式傳輸場景。OpenEuler 24.03中的典型字符設備包括:

  • 輸入輸出設備:鍵盤(/dev/input/event*)、串口(/dev/ttyS[0-9]
  • 虛擬設備:空設備(/dev/null)、零設備(/dev/zero
  • 控制臺設備/dev/console(系統控制臺)、/dev/tty[0-31](虛擬終端)
  • 多媒體設備:幀緩沖設備(/dev/fb[0-31])、聲卡設備(/dev/snd/*

字符設備的訪問特性決定了其應用場景:

  • /dev/null:數據寫入后會被丟棄,常用于屏蔽命令輸出
  • /dev/zero:讀取時返回無限零數據流,可用于文件填充
  • /dev/tty:指向當前終端,實現終端無關的輸入輸出

1.3 設備標識系統:主設備號與次設備號

Linux系統通過設備號對設備進行唯一標識,設備號由兩部分組成:

  • 主設備號(Major Number):標識設備驅動程序,范圍0-255
  • 次設備號(Minor Number):標識具體的設備實例,范圍0-65535

在OpenEuler中查看設備號的典型方法:

# 查看光驅設備號
ls -l /dev/cdrom
# 輸出示例:lrwxrwxrwx. 1 root root 3 7月 1 2016 /dev/cdrom -> sr0
ls -l /dev/sr0
# 輸出示例:brw-rw----+ 1 root cdrom 11, 0 7月 1 2016 /dev/sr0
# 解析:主設備號11,次設備號0# 查看幀緩沖設備號
ls -l /dev/fb
# 輸出示例:lrwxrwxrwx. 1 root root 3 7月 1 2016 /dev/fb -> fb0
ls -l /dev/fb0
# 輸出示例:crw-rw----. 1 root root 29, 0 7月 1 2016 /dev/fb0
# 解析:主設備號29,次設備號0

二、設備信息查詢與管理工具

2.1 系統設備注冊表:/proc/devices

/proc/devices文件記錄了系統中所有已注冊的設備類型及其主設備號,在OpenEuler中分為字符設備和塊設備兩部分:

cat /proc/devices
# 輸出片段:
Character devices:1 mem4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound21 sg29 fb
116 alsa
128 ptm
136 pts
162 raw
180 usb
189 usb_device
202 cpu/msr
203 cpu/cpuid
249 hidraw
250 usbmon
251 bsg
252 pcmcia
253 watchdog
254 rtcBlock devices:1 ramdisk
259 blkext7 loop8 sd9 md11 sr65 sd66 sd67 sd68 sd69 sd70 sd71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp

2.2 塊設備可視化工具:lsblk

lsblk是OpenEuler中用于查看塊設備層次結構的強大工具,包含在util-linux包中(已默認安裝)。其核心功能包括:

2.2.1 基本用法與輸出解析
# 列出所有塊設備及其掛載關系
lsblk
# 輸出示例:
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                          11:0    1  4.2G  0 rom  /media/cdrom
sda                           8:0    0   50G  0 disk 
├─sda1                        8:1    0  500M  0 part /boot
└─sda2                        8:2    0 49.5G  0 part ├─VolGroup-lv_root (dm-0) 253:0    0 47.6G  0 lvm  /└─VolGroup-lv_swap (dm-1) 253:1    0    2G  0 lvm  [SWAP]# 字段解析:
# NAME:設備名稱
# MAJ:MIN:主設備號:次設備號
# RM:是否可移動設備(1為可移動)
# SIZE:設備容量
# RO:是否只讀(0為可寫)
# TYPE:設備類型(disk=磁盤,part=分區,rom=光驅等)
# MOUNTPOINT:掛載點
2.2.2 高級查詢功能
# 顯示文件系統信息
lsblk -f
# 輸出示例:
NAME   FSTYPE   LABEL          UUID                                   MOUNTPOINT
sr0    iso9660  CentOS_6.5_Final                                       /media/cdr
sda                                                                   
├─sda1 ext4                    294ad562-2483-41ce-b5c8-22feb620a766   /boot
└─sda2 LVM2_mem                sPD7DF-cTL5-R8XK-fl0y-9Hlr-8uic-LDgOpH ├─VolGroup-lv_root (dm-0)ext4                    95161875-59c2-4777-a7ba-599f1cc1fffc   /└─VolGroup-lv_swap (dm-1)swap                    17981850-c0ec-4b36-8f93-5c4e36165af5   [SWAP]# 顯示權限信息
lsblk -m
# 輸出示例:
NAME                         SIZE OWNER GROUP MODE
sr0                          4.2G root  cdrom brw-rw----
sda                           50G root  disk  brw-rw----
├─sda1                       500M root  disk  brw-rw----
└─sda2                      49.5G root  disk  brw-rw----├─VolGroup-lv_root (dm-0) 47.6G root  disk  brw-rw----└─VolGroup-lv_swap (dm-1)    2G root  disk  brw-rw----# 顯示拓撲結構
lsblk -t
# 輸出示例:
NAME   ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE   RA
sr0            0   2048      0    2048    2048    1 cfq       128  128
sda            0    512      0     512     512    1 cfq       128  128
├─sda1         0    512      0     512     512    1 cfq       128  128
└─sda2         0    512      0     512     512    1 cfq       128  128├─VolGroup-lv_root (dm-0)0    512      0     512     512    1           128  128└─VolGroup-lv_swap (dm-1)0    512      0     512     512    1           128  128

2.3 設備號查詢工具:ls -l

通過ls -l命令可以直接查看設備文件的主設備號和次設備號,這是最基礎的設備信息查詢方式:

# 查看硬盤設備號
ls -l /dev/sda
# 輸出示例:brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
# 解析:主設備號8,次設備號0# 查看串口設備號
ls -l /dev/ttyS0
# 輸出示例:crw-rw----. 1 root dialout 4, 64 7月 1 2016 /dev/ttyS0
# 解析:主設備號4,次設備號64

三、設備文件操作與管理

3.1 手動創建設備文件:mknod

mknod命令用于在OpenEuler中手動創建設備文件,支持塊設備、字符設備和FIFO文件:

# 命令語法
mknod [選項] 設備文件 類型 主設備號 次設備號# 選項說明:
# -Z:設置安全上下文
# -m:設置權限模式(如0666)
# --help:顯示幫助信息
# --version:顯示版本信息# 示例1:創建/dev/sda設備文件
ls -l /dev/sda  # 確認設備文件存在
# 輸出示例:brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
rm -rf /dev/sda  # 刪除原有設備文件
mknod /dev/sda b 8 0  # 創建塊設備文件
ls -l /dev/sda  # 驗證創建結果
# 輸出示例:brw-r--r--. 1 root root 8, 0 3月 24 21:24 /dev/sda# 示例2:創建字符設備文件
mknod /dev/test_char c 249 0  # 創建hidraw字符設備
ls -l /dev/test_char 
# 輸出示例:crw-r--r--. 1 root root 249, 0 3月 24 21:30 /dev/test_char# 示例3:創建FIFO文件
mknod /tmp/myfifo p  # 創建命名管道
ls -l /tmp/myfifo 
# 輸出示例:prw-r--r--. 1 root root 0 3月 24 21:35 /tmp/myfifo

3.2 自動創建設備文件:MAKEDEV

MAKEDEV是OpenEuler中的設備文件自動創建腳本,基于預設規則生成標準設備文件:

# 命令語法
MAKEDEV [選項] [設備類型]# 選項說明:
# -a:強制創建設備文件,覆蓋已存在的文件
# -d <目錄>:指定設備文件創建目錄
# -m <最大設備數>:限制創建的設備數量
# -n:僅顯示操作,不實際執行
# -v:顯示詳細執行過程# 示例1:自動創建/dev/sda設備文件
ls -l /dev/sda  # 確認設備文件存在
# 輸出示例:brw-rw----. 1 root disk 8, 0 7月 1 2016 /dev/sda
rm -rf /dev/sda  # 刪除原有設備文件
MAKEDEV sda  # 自動創建sda設備文件
ls -l /dev/sda  # 驗證結果
# 輸出示例:brw-r-----. 1 root disk 8, 0 3月 25 08:30 /dev/sda# 示例2:創建所有磁盤設備文件
MAKEDEV -a disk  # 強制創建所有磁盤相關設備文件

四、udev設備管理系統

4.1 udev概述與發展歷程

udev是OpenEuler中負責動態管理/dev目錄設備文件的用戶空間工具,其發展背景如下:

  • 早期階段:靜態設備文件(通過mknod手動創建)
  • devfs階段:內核動態設備文件系統(2.3內核引入,2.6.13后移除)
  • udev階段:用戶空間設備管理(當前主流方案,解決了devfs的諸多問題)

udev的核心優勢:

  • 動態管理:自動識別熱插拔設備,實時更新/dev目錄
  • 穩定命名:基于設備硬件特征(如序列號)分配固定名稱
  • 靈活配置:可自定義設備權限、屬主、符號鏈接等屬性
  • 資源優化:僅創建系統實際存在的設備文件,減少資源消耗

4.2 udev核心配置文件

4.2.1 udev.conf配置文件

/etc/udev/udev.conf是udev的主配置文件,控制udev的基本行為:

# 查看udev.conf內容
cat /etc/udev/udev.conf 
# 輸出示例:
# The initial syslog(3) priority: "err", "info", "debug" or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: "udevadm control --log-priority=<value>".
udev_log="err"# 主要配置參數:
udev_log="err"  # 日志級別(err/info/debug)
udev_root="/dev"  # 設備文件根目錄
udev_db="/dev/.udevdb"  # udev數據庫路徑
udev_rules="/dev/udev/rules.d"  # 規則文件目錄
4.2.2 規則文件目錄:/etc/udev/rules.d

udev規則文件存儲在/etc/udev/rules.d目錄中,文件名通常以兩位數字開頭表示執行順序:

# 查看規則文件列表
ls -l /etc/udev/rules.d/
# 輸出示例:
總用量 44
-rw-r--r--. 1 root root 1652 1112 2010 60-fprint-autosuspend.rules
-rw-r--r--. 1 root root 1060 1112 2010 60-pcmcia.rules
-rw-r--r--. 1 root root  316 1122 2013 60-raw.rules
-rw-r--r--. 1 root root  789 71 2016 70-persistent-cd.rules
-rw-r--r--. 1 root root  420 71 2016 70-persistent-net.rules
-rw-r--r--. 1 root root  320 912 2012 90-alsa.rules
-rw-r--r--. 1 root root   83 720 2011 90-hal.rules
-rw-r--r--. 1 root root 2486 1111 2010 97-bluetooth-serial.rules
-rw-r--r--. 1 root root  308 1123 2013 98-kexec.rules
-rw-r--r--. 1 root root   54 128 2011 99-fuse.rules
-rw-r--r--. 1 root root  341 71 2016 99-vmware-scsi-udev.rules

4.3 udev規則語法詳解

4.3.1 操作符類型

udev規則由鍵值對組成,通過操作符連接,主要操作符包括:

  • 匹配操作符
    • ==:等于
    • !=:不等于
  • 賦值操作符
    • =:賦值(可覆蓋)
    • +=:追加值
    • :=:賦值(不可覆蓋)
4.3.2 常用匹配鍵
鍵名說明示例
ACTION設備事件(add/remove等)ACTION==“add”
KERNEL內核設備名KERNEL==“sd*”
DEVPATH設備在sysfs中的路徑DEVPATH==“/devices/*”
SUBSYSTEM設備子系統SUBSYSTEM==“block”
BUS總線類型BUS==“usb”
DRIVER驅動程序名DRIVER==“ide-cdrom”
ATTRS{key}sysfs屬性值ATTRS{removable}==“1”
ENV{key}環境變量ENV{ID_FS_TYPE}==“ext4”
4.3.3 常用賦值鍵
鍵名說明示例
NAME設備文件名NAME=“mydevice”
SYMLINK符號鏈接名SYMLINK+=“link1 link2”
OWNER設備屬主OWNER=“root”
GROUP設備屬組GROUP=“disk”
MODE設備權限MODE=“0666”
ATTR{key}設置sysfs屬性ATTR{power/state}==“on”
RUN執行外部程序RUN+=“/sbin/modprobe sg”
OPTIONS特殊選項OPTIONS=“last_rule”

4.4 udev規則實例解析

以下是OpenEuler中典型的udev規則示例及其解析:

# 規則1:默認設備權限設置
KERNEL=="*", OWNER="root", GROUP="root", MODE="0600"
# 解析:匹配所有設備,設置屬主為root,屬組為root,權限0600(僅root可讀寫)# 規則2:終端設備配置
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
# 解析:
# - 匹配所有tty設備
# - 設備名為內核名稱(%k)
# - 屬組為tty
# - 權限0666(所有用戶可讀寫)
# - OPTIONS="last_rule"表示這是終端規則# 規則3:光驅符號鏈接
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"
# 解析:匹配SCSI光驅設備,創建符號鏈接cdrom和cdrom-內核名# 規則4:ATA光驅識別
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
# 解析:
# - 匹配ATA設備(hd[a-z])
# - 總線類型為IDE
# - 可移動設備(removable=1)
# - 媒體類型為cdrom
# - 創建光驅符號鏈接# 規則5:SCSI設備驅動加載
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"
# 解析:當SCSI設備添加時,加載sg驅動模塊

4.5 udev設備信息查詢工具:udevadm

udevadm是OpenEuler中用于查詢和管理udev數據庫的命令行工具:

4.5.1 查詢設備路徑信息
# 查詢/dev/sda的系統設備路徑
udevadm info -q path -n /dev/sda
# 輸出示例:/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda# 查詢符號鏈接信息
udevadm info -q symlink -n /dev/sda
# 輸出示例:block/8:0 disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
4.5.2 全面設備信息查詢
# 查詢所有設備信息
udevadm info -q all -n /dev/sda
# 輸出片段:
P: /devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
N: sda
W: 27
S: block/8:0
S: disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda
E: MAJOR=8
E: MINOR=0
E: DEVNAME=/dev/sda
E: DEVTYPE=disk
E: SUBSYSTEM=block
# (省略更多輸出)# 基于sysfs路徑查詢
udevadm info -a -p /sys/block/sda
# 輸出包含從設備到總線的完整層次結構信息

4.6 udev服務控制

在OpenEuler中控制udev服務的常用命令:

# 重啟udev服務使規則生效
systemctl restart udev# 查看udev進程狀態
ps -ef | grep udev
# 輸出示例:
root      42737      1  1 12:20 ?        00:00:00 /sbin/udevd -d
root      43263  12851  0 12:20 pts/0    00:00:00 grep udev# 重新加載udev規則
udevadm control --reload-rules

五、實戰案例:自定義udev規則

5.1 案例:為USB打印機分配固定名稱

需求:為特定USB打印機分配固定設備名/dev/usb_printer,避免因插拔順序導致設備名變化。

實現步驟:

  1. 查詢打印機硬件信息
# 插入打印機后執行
udevadm info -a -n /dev/usb/lp0
# 記錄關鍵信息:
# - 廠商ID(ATTRS{idVendor})
# - 產品ID(ATTRS{idProduct})
# - 序列號(ATTRS{serial})
  1. 創建自定義規則
# 在rules.d目錄創建新規則文件
vi /etc/udev/rules.d/99-usb-printer.rules
# 添加以下內容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0419", ATTRS{idProduct}=="0050", ATTRS{serial}=="PRN001", SYMLINK+="usb_printer"
# 解析:
# - 匹配USB子系統
# - 廠商ID 0419,產品ID 0050
# - 序列號PRN001
# - 創建符號鏈接usb_printer
  1. 應用規則并驗證
# 重新加載規則
udevadm control --reload-rules
# 移除并重新插入打印機
ls -l /dev/usb_printer
# 應看到指向實際設備文件的符號鏈接

5.2 案例:設置串口設備權限

需求:將串口設備/dev/ttyS0的權限設置為允許dialout組用戶訪問。

實現步驟:

  1. 創建規則文件
vi /etc/udev/rules.d/60-serial-port.rules
# 添加內容:
KERNEL=="ttyS0", GROUP="dialout", MODE="0660"
# 解析:
# - 匹配ttyS0設備
# - 屬組設為dialout
# - 權限設為0660(dialout組可讀寫)
  1. 應用規則
systemctl restart udev
# 或
udevadm control --reload-rules
  1. 驗證權限
ls -l /dev/ttyS0
# 應顯示權限為crw-rw----,屬組為dialout

ol --reload-rules

移除并重新插入打印機

ls -l /dev/usb_printer

應看到指向實際設備文件的符號鏈接


### 5.2 案例:設置串口設備權限需求:將串口設備`/dev/ttyS0`的權限設置為允許dialout組用戶訪問。實現步驟:1. **創建規則文件**:
```bash
vi /etc/udev/rules.d/60-serial-port.rules
# 添加內容:
KERNEL=="ttyS0", GROUP="dialout", MODE="0660"
# 解析:
# - 匹配ttyS0設備
# - 屬組設為dialout
# - 權限設為0660(dialout組可讀寫)
  1. 應用規則
systemctl restart udev
# 或
udevadm control --reload-rules
  1. 驗證權限
ls -l /dev/ttyS0
# 應顯示權限為crw-rw----,屬組為dialout

通過上述內容,我們全面解析了OpenEuler 24.03中塊設備與字符設備的管理體系,從基礎概念到高級配置,結合具體命令和案例,幫助讀者深入理解Linux設備管理的核心機制。無論是設備信息查詢、手動/自動創建設備文件,還是通過udev實現動態設備管理,都提供了完整的操作指南和實踐案例,適用于系統管理員和開發人員掌握設備管理的關鍵技術。

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

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

相關文章

Django Channels WebSocket實時通信實戰:從聊天功能到消息推送

引言 在Web開發中&#xff0c;實時通信功能&#xff08;如在線聊天、實時通知、數據推送&#xff09;已成為許多應用的核心需求。傳統的HTTP協議由于其請求-響應模式的限制&#xff0c;無法高效實現實時通信。WebSocket作為一種全雙工通信協議&#xff0c;為實時Web應用提供了…

day52 神經網絡調參指南

目錄 隨機種子 內參的初始化 神經網絡調參指南 參數的分類 調參順序 初始化參數 batchsize的選擇 學習率調整 激活函數的選擇 損失函數的選擇 模型架構中的參數 正則化系數 其他補充 隨機種子 import torch import torch.nn as nn# 定義簡單的線性模型&#xf…

.NET9 實現斐波那契數列(FibonacciSequence)性能測試

在 .NET 平臺上實現 斐波那契數列 并使用 BenchmarkDotNet 進行性能測試&#xff0c;是評估不同算法實現方式性能表現的一種高效且標準化的方法。通過該方式&#xff0c;可以對比遞歸、迭代、記憶化遞歸以及結合高性能優化技術&#xff08;如 Span<T>、Memory<T> 和…

三、docker軟件安裝:gitlab,nexus,mysql8,redis,nacos,nginx

目錄 1.gitlab安裝 2.nexus安裝 (1)下載啟動 (2)設置中央倉庫遠程地址 (3)配置maven的settings.xml 3.mysql8安裝 4.redis安裝 5.nacos安裝 6.nginx安裝 1.gitlab安裝 #創建目錄 cd /usr/local/ mkdir docker cd docker/ mkdir gitlab_docker cd gitlab_docker…

【與AI+】SAP WEBGUI集成開發與SAP INTERNET服務的關系

前言&#xff1a;這是我的水水專欄第五篇文章&#xff0c;這個專欄呢&#xff0c;是放一些我向AI提問的問題&#xff0c;以及AI的回答。因為感覺真的好方便哈哈哈~ 我不是很確定我的專欄文章內容是否涉及版權&#xff0c;以及也不確定這些整合過的文字是否涉嫌抄襲&#xff0c…

淺談幾種js設計模式

JavaScript設計模式是開發中常用的一種解決方案&#xff0c;它們幫助開發者以一種更結構化、更易維護的方式編寫代碼。本文將深入介紹幾種常見的JavaScript設計模式&#xff0c;包括單例模式、工廠模式、觀察者模式和策略模式。 一、單例模式&#xff08;Singleton Pattern&am…

手寫 Vue 中虛擬 DOM 到真實 DOM 的完整過程

目錄 一、虛擬 DOM 的核心概念 二、虛擬 DOM 到真實 DOM 的流程 三、手寫虛擬 DOM 到真實 DOM 的實現 1. 定義虛擬 DOM 的結構&#xff08;VNode&#xff09; 2. 創建虛擬 DOM 轉真實 DOM 的函數 3. 掛載虛擬 DOM 到頁面 4. 更新虛擬 DOM 的過程&#xff08;Diff 算法簡化…

jmm--volatile

指令重排基礎概念 在現代處理器和編譯器為了提高程序執行效率&#xff0c;會對指令進行優化&#xff0c;其中一種優化方式就是指令重排序。在單線程環境下&#xff0c;指令重排序不會影響最終執行結果&#xff0c;因為處理器和編譯器會保證重排序后的執行結果與按照代碼順序執行…

【硬件開發】濾波電容的選擇:原理、計算與多電壓值應用實踐

濾波電容的選擇&#xff1a;原理、計算與多電壓值應用實踐 1. 引言 在現代電子系統中&#xff0c;穩定的電源供應是保證電路可靠運行的基礎。然而&#xff0c;電源線上往往不可避免地存在各種噪聲和紋波&#xff0c;這些干擾可能源自電源本身&#xff08;如整流后的脈動直流&…

【seismic unix數據生成-unif2】

Seismic Unix簡介 Seismic Unix&#xff08;SU&#xff09;是由科羅拉多礦業學院&#xff08;Colorado School of Mines&#xff09;開發的開源地震數據處理軟件包&#xff0c;專為地震勘探數據分析和研究設計。它提供了一系列命令行工具&#xff0c;支持從數據加載、處理到可…

【逆向思考 并集查找】P2391 白雪皚皚|省選-

本文涉及知識點 C并集查找 P2391 白雪皚皚 題目背景 “柴門聞犬吠&#xff0c;風雪夜歸人”&#xff0c;冬天&#xff0c;不期而至。千里冰封&#xff0c;萬里雪飄。空中刮起了鴨毛大雪。雪花紛紛&#xff0c;降落人間。 美能量星球&#xff08;pty 在 spore 上的一個殖民地…

一文講清楚React中setState的使用方法和機制

文章目錄 一文講清楚React中setState的使用方法和機制1. setState是什么2. setState方法詳解2.1 setState參數詳解2.2 setState同步異步問題2.2.1 setState異步更新2.2.2 setState同步更新 一文講清楚React中setState的使用方法和機制 1. setState是什么 React中&#xff0c;…

01_軟件卓越之道:功能性與需求滿足

引言 在軟件的世界里&#xff0c;功能性是產品與用戶之間的第一橋梁。一個軟件即使擁有華麗的界面和極致的性能&#xff0c;如果不能解決用戶的核心需求&#xff0c;也終將被市場淘汰。本文將深入探討如何確保軟件的功能性與用戶需求完美契合。 1. 需求理解&#xff1a;從模糊…

StarRocks × Tableau 連接器完整使用指南 | 高效數據分析從連接開始

一、導語&#xff1a;為什么選擇 StarRocks Tableau 連接器&#xff1f; 在當今數據驅動的商業環境中&#xff0c;企業不僅需要一個能夠處理海量數據的高性能分析數據庫&#xff0c;還需要一個直觀、強大的可視化工具來解讀數據背后的故事。StarRocks 作為新一代極速全場景 MP…

基于 SpringBoot+VueJS 助農生鮮銷售系統設計與實現7000字論文實現

摘要本論文設計并實現了一個基于 SpringBoot 和 VueJS 的助農生鮮銷售系統。系統采用前后端分離架構&#xff0c;前端使用 VueJS 框架實現用戶界面&#xff0c;后端使用 SpringBoot 框架構建服務&#xff0c;通過 MyBatis 實現數據持久化。系統實現了農產品展示、在線購物、訂單…

Pytest 測試發現機制詳解:自動識別測試函數與模塊

概述 在編寫自動化測試時,如何讓 Pytest 自動找到你的測試代碼 是一個非常基礎但重要的問題。Pytest 通過其強大的 測試發現(Test Discovery)機制,能夠自動掃描項目目錄、識別測試模塊和測試函數,從而大大簡化了測試流程。 本文將為你詳細講解 Pytest 的測試發現機制,包…

MySQL 時間日期函數

時間日期類型 MySQL中主要支持以下幾種時間日期類型&#xff1a; DATE - 日期類型 格式&#xff1a;YYYY-MM-DD范圍&#xff1a;1000-01-01 到 9999-12-31示例&#xff1a;2023-05-20 TIME - 時間類型 格式&#xff1a;HH:MM:SS范圍&#xff1a;-838:59:59 到 838:59:59示例&…

408第三季part2 - 計算機網絡 - 物理層

理解 這里有8個波形&#xff0c;每個波形代表一個馬原&#xff0c;一個馬原代表多個比特&#xff0c;這里3個比特 求波特率就直接2W 求比特率就要乘log2V 這塊記兩公式就行&#xff0c;一個下面一個上面 題目 4個相位加4種幅度就是有16種波形 這里無噪聲就是奈奎斯特定理 這…

iOS 集成RN Installing glog (0.3.5)報錯的解決方案

在集成執行RN bundle exec pod install 命令到Installing glog (0.3.5)時報錯,報錯信息如下: Installing glog (0.3.5) [!] /bin/bash -c set -e #!/bin/bash # Copyright (c) Facebook, Inc. and its affiliates. # # This source code is licensed under the MIT license …

【進階篇-消息隊列】——MQTT協議如何支持海量的在線IoT設備

目錄 一、什么是IoT二、MQTT 和其他消息隊列的傳輸協議有什么不同三、如何選擇 MQTT 產品四、MQTT 集群如何支持海量在線的 IoT 設備五、總結本文來源:極客時間vip課程筆記 一、什么是IoT IoT,也就是物聯網,物聯網這個詞兒,它的含義還不那么直觀,但你看它的英文:IoT,也就…