Linux--迷宮探秘:從路徑解析到存儲哲學

上一篇博客我們說完了文件系統在硬件層面的意義,今天我們來說說文件系統在軟件層是怎么管理的。

?Linux--深入EXT2文件系統:數據是如何被組織、存儲與訪問的?-CSDN博客

🌌 引言:文件系統的宇宙觀

"在Linux的宇宙中,一切皆文件。路徑是星辰的坐標,inode是物質的本質,而掛載機制則是連接平行世界的蟲洞。我們每一次cdls,都是在與這個精妙的設計對話——看似簡單的命令行背后,隱藏著一場關于命名、鏈接與空間折疊的史詩級工程。"

這本書將帶你穿越:

  • 路徑的遞歸迷宮:從根目錄/出發,揭開"無限套娃"式解析的終極出口

  • dentry的緩存魔法:看內核如何用哈希表和LRU算法加速萬億次路徑查找

  • 掛載的維度跳躍:理解如何讓多個獨立分區在用戶視角無縫拼接

  • 軟硬連接的量子糾纏:探索文件名與inode之間既獨立又共生的奇妙關系

準備好開始這場從比特到哲學的探險了嗎?🚀

一.路徑解析

🌟拋磚引玉

問題:打開當前?作?錄?件,查看當前?作?錄?件的內容?

當前?作?錄不也是?件嗎?我們訪問當前?作?錄不也是只知道當前?作?錄的?件名嗎?

要訪問它,不也得知道當前?作?錄的inode嗎?

"要打開當前目錄,得先打開它的父目錄?那父目錄的父目錄呢?" —— 這就像一場無限套娃的思維游戲🎭!

答:所以也要打開:當前?作?錄的上級?錄,額....,上級?錄不也是?錄嗎??不還是上?的問題嗎?
?

是的,所以類似"遞歸",需要把路徑中所有的?錄全部解析,出?是"/"根?錄

?實際上,任何?件,都有路徑,訪問?標?件。

都要從根?錄開始,依次打開每?個?錄,根據?錄名,依次訪問每個?錄下指定的?錄,直到訪問到test.c。這個過程叫做Linux路徑解析。

所以,我們知道了:訪問?件必須要有?錄+?件名=路徑的原因。

根?錄固定?件名,inode號,?需查找,系統開機之后就必須知道。

可是路徑誰提供?

你訪問?件,都是指令/?具訪問,本質是進程訪問,進程有CWD!進程提供路徑。

你open?件,提供了路徑

?可是最開始的路徑從哪?來?

  • 所以 Linux 為什么要有根目錄,根目錄下為什么要有那么多缺省目錄?
  • 你為什么要有家目錄,你自己可以新建目錄?
  • 上面所有行為:本質就是在磁盤文件系統中,新建目錄文件。而你新建的任何文件,都在你或者系統指定的目錄下新建,這不就是天然就有路徑了嘛!
  • 系統 + 用戶共同構建 Linux 路徑結構。
🌟 思考題解答
1.?cd ~的魔法原理

# 當輸入 cd ~ 時:
1. Shell會讀取/etc/passwd中你的用戶配置
2. 找到對應的家目錄路徑(如/home/yourname)
3. 通過環境變量$HOME獲取該路徑
4. 最終執行 cd /home/yourname

💡 秘密武器:getpwuid()系統調用負責這個轉換過程!

2. 新建文件的"自動路徑"奧秘

# 創建新文件時的隱藏邏輯:
1. 進程維護著當前工作目錄(CWD)的inode
2. 新建文件時:
?? a. 在CWD的目錄數據塊添加新條目
?? b. 新條目自動繼承完整路徑前綴
3. 就像在樹上長出新葉子🍃,自然帶有枝干路徑

🎯 關鍵點:路徑是"從根向下生長"的,不是從文件向上回溯的!

3. 根目錄inode為什么是2?

# 這個歷史設計選擇的原因:
1. inode 0:保留不用(錯誤檢查)
2. inode 1:傳統上用于壞塊追蹤
3. inode 2:因此成為根目錄的"專屬VIP號"

📜 Unix傳統:早期文件系統需要預留特殊inode

?二.路徑緩存

🌟拋磚引玉

問題 1: Linux 磁盤中,存在真正的目錄嗎?
答案:不存在,只有文件。只保存文件屬性 + 文件內容


問題 2: 訪問任何文件,都要從 / 目錄開始進行路徑解析?
答案:原則上是,但是這樣太慢,所以 Linux 會緩存歷史路徑結構


問題 3: Linux 目錄的概念,怎么產生的?
答案:打開的文件是目錄的話,由 OS 自己在內存中進行路徑維護

Linux中,在內核中維護樹狀路徑結構的內核結構體叫做: struct dentry

struct dentry {atomic_t d_count;unsigned int d_flags;        /* protected by d_lock */spinlock_t d_lock;           /* dentry lock */struct inode *d_inode;       /* Where the name belongs to - NULL is* negative *//* The next three fields are touched by __d_lookup.  Place them here* so they all fit in a cache line.*/struct hlist_node d_hash;    /* lookup hash list */struct dentry *d_parent;     /* parent directory */struct qstr d_name;struct list_head d_lru;      /* LRU list *//** d_child and d_rcu can share memory*/union {struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs;  /* our children */struct list_head d_alias;    /* inode alias list */unsigned long d_time;        /* used by d_revalidate */struct dentry_operations *d_op;struct super_block *d_sb;    /* The root of the dentry tree */void *d_fsdata;              /* fs-specific data */
#ifdef CONFIG_PROFILINGstruct dentry *d_cookie;     /* cookie, if any */
#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};

注意:

  • 每個文件其實都要有對應的 dentry 結構,包括普通文件。這樣所有被打開的文件,就可以在內存中形成整個樹形結構
  • 整個樹形節點也同時會隸屬于 LRU (Least Recently Used,最近最少使用) 結構中,進行節點淘汰
  • 整個樹形節點也同時會隸屬于 Hash,方便快速查找
  • 更重要的是,這個樹形結構,整體構成了 Linux 的路徑緩存結構,打開訪問任何文件,都在先在這棵樹下根據路徑進行查找,找到就返回屬性 inode 和內容,沒找到就從磁盤加載路徑,添加 dentry 結構,緩存新路徑

?

三.掛載分區

3.1🔍 核心矛盾:跨分區的路徑統一性

當系統存在多個分區時,每個分區擁有獨立的inode體系(如分區A的inode=100與分區B的inode=100互不沖突)。但用戶看到的卻是統一的路徑樹,例如:

  • /home(可能位于SSD分區)

  • /mnt/data(可能掛載HDD分區)

解決方案掛載(Mount)——將分區的根目錄"嫁接"到全局路徑樹的某個節點上,形成邏輯統一的文件系統視圖。

問題不就是:inode 不是不能跨分區嗎?Linux 不是可以有多個分區嗎?我怎么知道我在哪一個分區???

我們用一個實驗證明:

# 制作一個大的磁盤塊,就當做一個分區
$ dd if=/dev/zero of=./disk.img bs=1M count=5  
# 格式化寫入文件系統
$ mkfs.ext4 disk.img  
# 建立空目錄
$ mkdir ./mnt/mydisk  
# 查看可以使用的分區
$ df -h  
Filesystem      Size  Used Avail Use% Mounted on
udev            956M     0  956M   0% /dev
tmpfs           199M  724K  197M   1% /run
/dev/vda1        50G   26G   28G  42% /
tmpfs           988M     0  988M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           988M     0  988M   0% /sys/fs/cgroup
tmpfs           199M     0  199M   0% /run/user/0
tmpfs           199M     0  199M   0% /run/user/1002
# 將分區掛載到指定的目錄
$ sudo mount -t ext4 ./disk.img /mnt/mydisk/  
$ df -h  
Filesystem      Size  Used Avail Use% Mounted on
udev            956M     0  956M   0% /dev
tmpfs           199M  724K  197M   1% /run
/dev/vda1        50G   26G   28G  42% /
tmpfs           988M     0  988M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           988M     0  988M   0% /sys/fs/cgroup
tmpfs           199M     0  199M   0% /run/user/0
tmpfs           199M     0  199M   0% /run/user/1002
/dev/loop0      4.9M   24K  4.5M   1% /mnt/mydisk
# 卸載分區
$ sudo umount /mnt/mydisk  
$ df -h  
Filesystem      Size  Used Avail Use% Mounted on
udev            956M     0  956M   0% /dev
tmpfs           199M  724K  197M   1% /run
/dev/vda1        50G   26G   28G  42% /
tmpfs           988M     0  988M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           988M     0  988M   0% /sys/fs/cgroup
tmpfs           199M     0  199M   0% /run/user/0
tmpfs           199M     0  199M   0% /run/user/1002

注意:/dev/loop0 在 Linux 系統中代表第一個循環設備(loop device)。循環設備,也被稱為回環設備或 loopback 設備,是一種偽設備(pseudo-device),它允許將文件作為塊設備(block device)來使用。這種機制使得可以將文件(比如 ISO 鏡像文件)掛載(mount)為文件系統,就像它們是物理磁盤分區或者外部存儲設備一樣

$ ls /dev/loop*
brw-rw---- 1 root disk 7, 0 Oct 17 18:24 /dev/loop0
brw-rw---- 1 root disk 7, 1 Jul 17 10:26 /dev/loop1
brw-rw---- 1 root disk 7, 2 Jul 17 10:26 /dev/loop2
brw-rw---- 1 root disk 7, 3 Jul 17 10:26 /dev/loop3
brw-rw---- 1 root disk 7, 4 Jul 17 10:26 /dev/loop4
brw-rw---- 1 root disk 7, 5 Jul 17 10:26 /dev/loop5
brw-rw---- 1 root disk 7, 6 Jul 17 10:26 /dev/loop6
crw-rw---- 1 root disk 16, 23 Jul 17 10:26 /dev/loop-control
brw-rw---- 1 root disk 7, 7 Jul 17 10:26 /dev/loop7

結論:

  • 分區,寫入文件系統,無法直接使用,需要和指定的目錄關聯,進行掛載才能使用。
  • 所以,可以根據訪問目標文件的 [路徑前綴] 準確判斷我在哪一個分區

3.2?? 掛載機制深度解析

3.2.1?掛載點(Mount Point)的本質

  • 掛載點是一個空目錄,其作用類似于"魔法門":

    • 訪問/mnt/mydisk時,內核檢查該目錄是否被掛載

    • 若已掛載,則跳轉到目標分區的根目錄,后續路徑解析在該分區內進行

?3.2.2?掛載表(Mount Table)
內核通過全局掛載表記錄所有掛載關系,關鍵字段包括:

struct mount {struct dentry *mnt_mountpoint;  // 掛載點目錄(如/mnt/mydisk)struct vfsmount mnt;           // 掛載的分區元數據struct super_block *mnt_sb;     // 目標分區的超級塊// ...
};

掛載過程:

用戶路徑: /mnt/mydisk/file.txt  
內核動作:  
1. 解析到/mnt/mydisk時發現掛載點  
2. 切換到分區/dev/loop0的根目錄  
3. 在分區內解析file.txt  

3.2.3?循環設備(Loop Device)的魔法

$ sudo mount -t ext4 ./disk.img /mnt/mydisk
  • disk.img是普通文件,但通過/dev/loop0被偽裝成塊設備

  • 內核為其分配獨立的inode空間,實現"文件中的文件系統"

?三.文件系統總結

以下我們通過圖示來理解:

  1. struct task_struct?:進程控制塊,是 Linux 中描述進程的核心結構體,里面的?fs(指向?struct fs_struct?)記錄進程的文件系統信息(如根目錄、當前工作目錄) ,files(指向?struct files_struct?)管理進程打開的文件。
  2. struct fs_struct?:維護進程的文件系統上下文,像根目錄(root?)、當前工作目錄(pwd?)等路徑信息,讓進程知道 “我在文件系統的哪里” 。
  3. struct files_struct?:進程的 “打開文件表”,管理進程打開的文件描述符,通過?fd_array?等結構,記錄哪些文件被進程打開,以及對應文件描述符的狀態 。
  4. struct file?:代表一個打開的文件實例?,保存文件讀寫位置(f_pos?)、文件操作方法(f_op?,關聯?read/write?等函數邏輯 )、所屬目錄項(f_path?里的?dentry?)等,是操作文件時的直接載體 。
  5. struct dentry?:目錄項結構體,是內存中 “目錄樹節點” ,關聯文件的路徑信息,幫系統快速定位文件在目錄樹中的位置,還會參與路徑緩存,加速文件訪問 。
  6. struct path?:輔助結構體,通過?mnt(掛載相關 )和?dentry?,把文件關聯到具體的掛載點與目錄項,明確文件在整個文件系統掛載結構里的位置 。

?“進程 - 打開的文件 - 文件系統位置”?的關系:進程(task_struct?)通過?fs_struct?知曉自己在文件系統的 “大位置”,用?files_struct?管理打開的文件;每個打開的文件對應?struct file?,它借助?path?和?dentry?,錨定到文件系統的目錄樹與掛載點,讓系統能找到、操作實際的文件 。

四.軟硬連接

4.1 硬鏈接:文件的“分身術”

🔍 硬鏈接的本質

硬鏈接(Hard Link)是同一個inode的多個文件名,就像一個人的多個別名。

  • 創建方式ln <源文件> <硬鏈接名>

  • 底層機制

    • 文件系統中,目錄項(dentry)僅記錄文件名 → inode的映射

    • 硬鏈接只是新增一個目錄項指向相同inode

📊 硬鏈接的特性

特性說明
inode共享硬鏈接和源文件共用同一個inode,文件屬性(權限、大小、時間戳)完全相同
鏈接計數inode的i_nlink字段記錄硬鏈接數,rm命令實際是減少該計數,歸零才刪文件
不能跨文件系統因為不同文件系統的inode編號獨立,無法直接關聯
不能鏈接目錄避免目錄樹形成環路(僅超級用戶可ln -d,但仍不推薦)

💡 經典案例:.?和?..

  • .:當前目錄的硬鏈接(ls -ai可驗證inode相同)

  • ..:父目錄的硬鏈接

$ mkdir test && cd test
$ ls -ali
total 8
263466 drwxr-xr-x. 2 root root 4096 Sep 16 00:00 .   # ← 當前目錄
263465 drwxr-xr-x. 3 root root 4096 Sep 15 23:59 ..  # ← 父目錄

4.2 軟鏈接:文件的“快捷方式”

🔍 軟鏈接的本質

軟鏈接(Symbolic Link,又稱symlink)是一個獨立的文件,其內容存儲目標文件的路徑

  • 創建方式ln -s <目標文件> <軟鏈接名>

  • 底層機制

    • 軟鏈接擁有自己的inode和磁盤空間(存放目標路徑字符串)

    • 訪問軟鏈接時,內核遞歸解析指向的最終文件

📊 軟鏈接的特性

特性說明
獨立inode軟鏈接是單獨的文件,有自己的元數據和存儲空間(存目標路徑)
可跨文件系統因為存儲的是路徑字符串,可指向其他分區/NFS甚至不存在的文件
可鏈接目錄常用于目錄快捷訪問(如/tmp -> /var/tmp
依賴目標文件若目標被刪除,軟鏈接成為“懸空引用”(dangling link),訪問報ENOENT

💡 經典案例:系統目錄的路徑優化?

$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Apr  1  2023 /bin/sh -> bash  # /bin/sh是bash的軟鏈接

4.3 軟硬鏈接對比

維度硬鏈接軟鏈接
inode與源文件相同獨立inode
跨分區? 不可跨文件系統? 可跨文件系統
鏈接目標必須存在可指向不存在的路徑
目錄支持? 一般不適用(除./..? 支持
存儲開銷僅增加一個目錄項占用獨立inode和數據塊(存路徑字符串)
命令示例ln file1 file2ln -s file1 file2

4.4 軟硬鏈接的實戰用途

🛠? 硬鏈接的典型場景

  1. 文件備份

    ln important.txt important_backup.txt  # 不占用額外空間,修改任一文件同步更新
  2. 防止誤刪

    touch data.log && ln data.log data.lock  # 刪除data.log后,仍可通過data.lock訪問

🛠? 軟鏈接的典型場景

  1. 版本切換

    ln -s python3.9 /usr/bin/python  # 動態切換默認Python版本
  2. 路徑簡化

    ln -s /opt/complex/path/config ~/.config  # 家目錄快速訪問

4.5?進階思考:為什么硬鏈接不能跨分區?

根本原因

  • 硬鏈接依賴inode編號,而不同文件系統的inode編號獨立(如ext4的inode=100和XFS的inode=100可能指向不同文件)

  • 若允許跨分區,刪除源文件后,另一分區的硬鏈接可能指向無效數據,破壞文件系統一致性

替代方案

  • 使用軟鏈接(存儲路徑而非inode)

  • 使用mount --bind掛載跨分區目錄(內核維護映射關系)


🎯 終極總結

  • 硬鏈接是文件的“克隆體”,軟鏈接是文件的“指針”。

  • 硬鏈接用于節省空間+防誤刪,軟鏈接用于靈活路徑管理

  • 理解ACM時間戳,可精準追蹤文件變動歷史。

  • 文件系統的設計,處處體現“共享與隔離”的平衡藝術。

Linux哲學
“硬鏈接是嚴謹的契約,軟鏈接是自由的詩歌。”
—— 通過這兩種鏈接,我們既能共享數據,又能保持系統的優雅與靈活。

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

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

相關文章

淘寶商品數據實時獲取方案|API 接口開發與安全接入

在電商數據獲取領域&#xff0c;除了官方 API&#xff0c;第三方數據 API 接入也是高效獲取淘寶商品數據的重要途徑。第三方數據 API 憑借豐富的功能、靈活的服務&#xff0c;為企業和開發者提供了多樣化的數據解決方案。本文將聚焦第三方數據 API 接入&#xff0c;詳細介紹其優…

什么是防抖和節流?它們有什么區別?

文章目錄 一、防抖&#xff08;Debounce&#xff09;1.1 什么是防抖&#xff1f;1.2 防抖的實現 二、節流&#xff08;Throttle&#xff09;2.1 什么是節流&#xff1f;2.2 節流的實現方式 三、防抖與節流的對比四、總結 在前端開發中&#xff0c;我們經常會遇到一些高頻觸發的…

Springboot集成阿里云OSS上傳

Springboot集成阿里云OSS上傳 API 接口描述 DEMO提供的四個API接口&#xff0c;支持不同方式的文件和 JSON 數據上傳&#xff1a; 1. 普通文件上傳接口 上傳任意類型的文件 2. JSON 字符串上傳接口 上傳 JSON 字符串 3. 單個 JSON 壓縮上傳接口 上傳并壓縮 JSON 字符串…

刪除大表數據注意事項

數據庫是否會因刪除操作卡死&#xff0c;沒有固定的 “安全刪除條數”&#xff0c;而是受數據庫配置、表結構、操作方式、當前負載等多種因素影響。以下是關鍵影響因素及實踐建議&#xff1a; 一、導致數據庫卡死的核心因素 硬件與數據庫配置 CPU / 內存瓶頸&#xff1a;刪除…

Redis 是單線程模型?|得物技術

一、背景 使用過Redis的同學肯定都了解過一個說法&#xff0c;說Redis是單線程模型&#xff0c;那么實際情況是怎樣的呢&#xff1f; 其實&#xff0c;我們常說Redis是單線程模型&#xff0c;是指Redis采用單線程的事件驅動模型&#xff0c;只有并且只會在一個主線程中執行Re…

[特殊字符] AIGC工具深度實戰:GPT與通義靈碼如何徹底重構企業開發流程

&#x1f50d; 第一模塊&#xff1a;理念顛覆——為什么AIGC不是“玩具”而是“效能倍增器”&#xff1f; ▍企業開發的核心痛點圖譜&#xff08;2025版&#xff09; ??研發效能瓶頸??&#xff1a;需求膨脹與交付時限矛盾持續尖銳&#xff0c;傳統敏捷方法論已觸天花板?…

(LeetCode 面試經典 150 題) 169. 多數元素(哈希表 || 二分查找)

題目&#xff1a;169. 多數元素 方法一&#xff1a;二分法&#xff0c;最壞的時間復雜度0(nlogn)&#xff0c;但平均0(n)即可。空間復雜度為0(1)。 C版本&#xff1a; int nnums.size();int l0,rn-1;while(l<r){int mid(lr)/2;int ans0;for(auto x:nums){if(xnums[mid]) a…

(17)java+ selenium->自動化測試-元素定位大法之By css上

1.簡介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表達式有其自己的格式。CSS定位方式擁有比xpath定位速度快,且比CSS穩定的特性。下面詳細介紹CSS定位方式的使用方法。相對CSS來說,具有語法簡單,定位速度快等優點。 2.CSS定位優勢 CSS定位是平常使用過程中非常重要…

【軟考高級系統架構論文】企業集成平臺的技術與應用

論文真題 企業集成平臺是一個支持復雜信息環境下信息系統開發、集成和協同運行的軟件支撐環境。它基于各種企業經營業務的信息特征,在異構分布環境(操作系統、網絡、數據庫)下為應用提供一致的信息訪問和交互手段,對其上運行的應用進行管理,為應用提供服務,并支持企業信息…

i.MX8MP LVDS 顯示子系統全解析:設備樹配置與 DRM 架構詳解

&#x1f525; 推薦&#xff1a;《Yocto項目實戰教程&#xff1a;高效定制嵌入式Linux系統》 京東正版促銷&#xff0c;歡迎支持原創&#xff01; 鏈接&#xff1a;https://item.jd.com/15020438.html i.MX8MP LVDS 顯示子系統全解析&#xff1a;設備樹配置與 DRM 架構詳解 在…

keep-alive實現原理及Vue2/Vue3對比分析

一、keep-alive基本概念 keep-alive是Vue的內置組件&#xff0c;用于緩存組件實例&#xff0c;避免重復渲染。它具有以下特點&#xff1a; 抽象組件&#xff1a;自身不會渲染DOM&#xff0c;也不會出現在父組件鏈中包裹動態組件&#xff1a;緩存不活動的組件實例&#xff0c;…

安卓jetpack compose學習筆記-Navigation基礎學習

目錄 一、Navigation 二、BottomNavigation Compose是一個偏向靜態刷新的UI組件&#xff0c;如果不想要自己管理頁面切換的復雜狀態&#xff0c;可以以使用Navigation組件。 頁面間的切換可以NavHost&#xff0c;使用底部頁面切換欄&#xff0c;可以使用腳手架的bottomBarNav…

基于大數據技術的在UGC數據分析與路線推薦的研究

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

flask通過表單自動產生get請求的參數、form表單實現POST請求的自動提交

通過表單自動產生get請求的參數 相關代碼如下&#xff1a; import flaskapp flask.Flask(__name__)app.route(/) def login():html <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>flask表單實現get…

《情感反詐模擬器》2025學習版

1.2 專業內容支持 67篇情感詐騙案例研究14萬字心理學分析資料783條專業配音對白 二、安裝與運行 2.1 系統要求 最低配置&#xff1a; 顯卡&#xff1a;GTX 1060CPU&#xff1a;i5-8400存儲&#xff1a;25GB空間 2.2 運行步驟 解壓游戲文件&#xff08;21.7GB&#xff09;…

預訓練 vs. 微調:大模型落地的核心兩步,究竟有何不同?

在人工智能領域&#xff0c;尤其是自然語言處理&#xff08;NLP&#xff09;和計算機視覺&#xff08;CV&#xff09;&#xff0c;大型模型如GPT系列、BERT、Stable Diffusion等取得了令人矚目的成就。支撐這些模型廣泛應用的關鍵技術流程&#xff0c;通常包含兩個核心階段&…

微信原生小程序轉uniapp過程及錯誤總結

https://ask.dcloud.net.cn/article/35786 此文章尤為重要&#xff0c;可以使用輔助工具 1、this.setData 源代碼&#xff1a; this.setData({dateTime: obj.dateTime, });需更換為 this.dateTime obj.dateTime2、cookie問題 在此文章有解釋 https://blog.csdn.net/ni155…

關于Spring JBDC

一、什么是Spring JDBC&#xff1f; 什么是JDBC&#xff1f; JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 語言訪問數據庫的標準 API&#xff0c;它定義了一組接口和類&#xff0c;允許 Java 程序與各種數據庫進行交互。JDBC 提供了執行 SQL 語句、處理結果…

【SpringBoot】Spring Boot實現SSE實時推送實戰

以下是一個完整的基于 Spring Boot 的 Server-Sent Events (SSE) 示例&#xff0c;包括服務端和客戶端的實現。 一、服務端實現 1. 創建 Spring Boot 項目 首先&#xff0c;創建一個基本的 Spring Boot 項目&#xff0c;并添加 spring-boot-starter-web 依賴。在 pom.xml 中…

若依導出模板時設置動態excel下拉框(表連接的)

若依導出模板時設置動態excel下拉框&#xff08;表連接的&#xff09; 一、問題二、解決1、實體類2.1、臨時使用2.2、統一工具類3、調用 一、問題 若依導出只能&#xff1b;使用dictType、combo、comboReadDict、readConverterExp這些來控制字典的導出下拉&#xff0c;如果不是…