【云動世紀:Apache Doris 技術之光】

本文節選自《基礎軟件之路:企業級實踐及開源之路》一書,該書集結了中國幾乎所有主流基礎軟件企業的實踐案例,由 28 位知名專家共同編寫,系統剖析了基礎軟件發展趨勢、四大基礎軟件(數據庫、操作系統、編程語言與中間件)的領域難題與行業實踐以及開源戰略、生態建設與人才培養。

作者介紹

陳明雨,百度 Doris 團隊前技術負責人、Apache Doris 項目 管理委員會主席

注:本文整理自 Apache Doris 項目管理委員會主席陳明雨在 DIVE 全球基礎軟件創新大會(2022)的演講,由李冬梅整理。

Apache Doris 是由百度自研并開源的一款 MPP(大規模并行處理技術)的分析型數據庫產品,其項目已于 2022 年 6 月正式從 Apache 孵化器 “畢業”,成為 Apache 頂級項目。

Apache Doris 特性

Doris 數據流程如圖 2-5-1 所示。

image-20240223143505890

? 圖 2-5-1 Doris 數據流程圖

其中,上游數據源包括 OLTP 數據庫中的數據、業務的應用 日志、 Web 端的埋點日志以及本地文件等,通過批處理或流處理 系統,比如 Hadoop 、Spark 、Flink 等,對數據進行加工以后,把 數據 “灌入”Doris 中。

Doris 可以直接對外提供查詢服務,比如支持實時大屏的數 據展示服務、多維報表分析、用戶畫像場景支持等。同時,用戶 還可以通過 Doris-Spark(Flink)-Connector 等連接組件,使用外部 系統直接讀取 Doris 中存儲的數據。最后,用戶還可以利用 Doris 高效的分布式 SQL 查詢引擎,對外部數據源如 Hive 、Iceberg、 Elasticsearch 等提供查詢加速服務。

我們選取了六個 Doris 的特點,向大家介紹 Doris 在分析型

數據庫領域的一些特點。

極簡架構

Doris 的第一個特點就是它的極簡架構,如圖 2-5-2 所示。

image-20240223143702548

? 圖 2-5-2 Doris 極簡架構

從圖 2-5-2 可以看到,Doris 只有兩類服務節點:FE(Frontend) 節點和 BE(Backend )節點。除了這兩類節點以外, Doris 不再依 賴任何第三方的服務。FE 、BE 節點都可以橫向擴展,以應對不 斷增長的數據。

此外, Doris 支持 MySQL 協議和標準 SQL 語法,用戶通過 標準的 MySQL 客戶端,或者各種語言的 MySQL 連接庫,就可 以方便地接入 Doris,并使用標準 SQL 進行數據分析。

通過極簡的系統架構和較低的學習成本,用戶可以方便、快 速地把原有業務遷移到 Doris 上來。

高效自運維

在分布式系統中,存在很多系統故障,比如網絡故障、磁盤 故障、節點下線,甚至機房下線等。在這些故障發生的時候,分 布式系統需要有一個很好的分布式管理層來自動進行故障恢復,

降低用戶的運維成本。如圖 2-5-3 所示,在磁盤故障或者節點上 下線時,Doris 可以自動地在分片(Tablet)級別對數據進行均衡 或修復,保證整個集群能夠在較短的時間內從故障中恢復過來, 從而保證整個集群的可用性和可靠性。

image-20240223143722937

? 圖 2-5-3 Doris 高效自運維

整個故障修復過程不會影響用戶使用 Doris,整個過程是一 個透明的、自動的過程。對于一個分布式系統來說,較低的運維 成本和較高的故障容忍度,可以極大地提升整個系統的健壯性, 保證業務 7×24 小時提供可靠的服務。

高并發場景支持

市面上很多 OLAP 數據庫都支持高吞吐的業務場景,而對高 并發查詢場景的支持并不是很友好。Doris 不僅支持高吞吐的業務 場景,也提供了對高并發場景的支持。在單機情況下, Doris 可以 支持 1000 QPS 的高并發點查詢場景,同時可以通過橫向擴展更 多的計算節點來提高 QPS 的峰值。

這得益于 Doris 內部的一些技術實現。如通過分區裁剪,可 以保證用戶的查詢最終僅落到某一個具體的數據分片上,避免不 必要的數據讀取。

此外, Doris 內部還提供了不同類型的緩存。例如,數據文件 塊級別的緩存,可以減少熱點數據的磁盤 I/O 開銷;SQL 結果緩 存直接將查詢結果進行緩存,對于相同的查詢語句,可以直接返 回緩存的結果;分區緩存可以緩存歷史分區的數據,并在用戶查 詢時,將歷史分區緩存的數據和最新分區的實時數據合并,返回 最終的結果。

通過緩存機制,降低查詢時的磁盤 I/O 開銷,并減少需要實 時計算的數據量,保證單個查詢的資源開銷足夠小,以提升同一 時刻,整個系統能夠承載的查詢數量。

此外,在后續的 2.0 版本中,Doris 將通過包括短路規劃、查 詢計劃緩存、PreparedStatement 等更多技術,進一步提升高并發 場景的支持能力,使得 Doris 能夠在一些偏服務化(Serving)的 場景中發揮作用。

MPP 執行引擎

Doris 具有完備的 MPP 查詢執行框架,可以充分利用集群內 的計算資源,完成高吞吐的多維數據分析請求。

MPP 查詢執行框架的一個重要特點是其擁有對數據的重分布 ( Shuffle)能力。首先,數據掃描算子將數據從對應的存儲節點讀 出,數據重分布,可以將數據發送到更多的計算節點,從而利用 更多的計算資源完成上層算子的計算。數據重分布能力,使得查 詢所能利用的計算資源不再和數據存儲資源綁定,從而提升集群 的資源利用率。Doris 內部 MPP 執行引擎示意如圖 2-5-4 所示。

此外,因為 Doris 采用無共享(Share-Nothing)的架構,每個 節點都獨立存儲、管理整個數據集的一部分,所以 Doris 的 MPP 查詢執行框架會將查詢計劃切片,不同的切片可以在不同的節 點上并行處理各自節點上存儲的數據。同時,在同一個節點內,

Doris 還會將一個切片進一步拆分,充分利用多核 CPU 的能力。通過節點間和節點內的并行執行,進一步增強 Doris 的數據處理能力。

image-20240223143746008

? 圖 2-5-4 Doris 內部 MPP 執行引擎示意

在后續版本中,Doris 還將引入 Pipeline 執行框架。該執行框 架會在現有的并行執行能力基礎上,為 Doris 提供細粒度的資源 管控、隔離能力,進一步發揮 Doris 查詢執行框架的能力。

明細與聚合模型的統一

Doris 的第五個特點是明細與聚合模型的統一。在實際業務 操作中,用戶可以首先將細粒度的原始數據存儲在 Doris 中, 這 一部分數據稱為明細數據,對應的表稱為明細表。在明細表基 礎上,用戶可以進一步建立針對任意維度的聚合表(或稱物化視圖)。

這里我們通過一個示例進行說明。如圖 2-5-5 所示,原始的 明細表包含 ID、日期、城市和消費四列。其中 ID、日期和城市 是維度列,消費是指標列。

image-20240223143805227

? 圖 2-5-5 Doris 明細 + 聚合

如果用戶查詢 “某一個日期的消費的總和”,則可以在明細表 上建立一個由“日期” 和“消費”列組成的物化視圖。這個物化 視圖會自動地將相同 “日期” 的“消費”數據進行預聚合(累加, SUM),然后把累加后的數據直接物化存儲在節點上。當用戶查詢 某一日期的消費總和時,可以直接讀取已經預先算好的數據,這 樣能夠極大地加速數據查詢。在整個查詢過程中,不需要進行實 時的數據累加計算,而是直接獲取最終結果。同時,明細數據依 然保留在明細表中,用戶依然可以自由查詢明細數據。這就是明 細和聚合的統一。

Doris 也通過導入操作的事務性機制,來保證明細表和所有 物化視圖的數據的一致性。當用戶將數據導入明細表時, Doris 會 自動生成對應的物化視圖的數據,并保證明細表和所有物化視圖 的數據原子性生效。這樣用戶無須擔心臟數據,或者數據不一致 的問題。

此外, Doris 還支持針對物化視圖的查詢的自動路由。用戶無 須指定要查詢的具體物化視圖 Doris 的查詢優化器能夠自動選擇 最合適的物化視圖并返回正確的數據。

目前上述能力僅限于單表上的操作。Doris 會在 2.0 版本中提 供多表物化視圖的能力,支持對物化視圖定義連接(Join)、聚合、 過濾等操作,進一步提升在復雜數據查詢場景下的能力。

便捷數據接入

Doris 在數據接入方面做了非常多的工作,來保證任何一個 數據源都可以很快地接入 Doris,如圖 2-5-6 所示。比如 Doris 支 持例行導入作業,通過一條簡單的 SQL 語句就可以訂閱 Kafka 中 的數據,并提供精確一次(Exactly-Once)的消費語義,實時地 消費和存儲流式數據。同時,Doris 提供了 Flink 和 Spark 連接器 (Connector),通過這些連接器,用戶可以通過批處理和流處理系 統來讀取 Doris 中的數據,或寫入數據到 Doris 中。

image-20240223143823327

? 圖 2-5-6 便捷的數據接入

Doris 同時提供流式的和批量的數據導入方式,不管數據是 存在對象存儲系統、HDFS 上,還是 Kafka 中,都可以通過適合 的導入方式來便捷地加工處理數據,并存儲到 Doris 中,以進行 快速的查詢分析。

Apache Doris 極速 1.0 時代

在已經發布的 Apache Doris 1.0 中,主要突出以下三個特點:極速、穩定和多源。

極速

在 1.0 版本中,Doris 引入了全新的向量化執行引擎,極大提 升了查詢性能。向量化技術的提出已有十幾年的歷史,而在近幾 年,通過 ClickHouse 等優秀的開源的數據庫引擎,這一技術真正 被帶入生產級別的實踐中,讓大家真正意識到向量化能夠給數據 分析帶來怎樣的變革。

Doris 借鑒了包括 ClickHouse 在內的很多開源系統的優秀設 計, 同時也結合自身的特點,打造了一個完整的向量化執行引 擎。通過對所有的算子和函數進行向量化改造, Doris 極大地提升 了整體查詢執行效率。這里我們從列式內存布局、向量化的計算 框架、 Cache(高速緩存)親和度、虛函數調用、SIMD 指令集等 幾個主要技術點,介紹 Doris 在向量化執行引擎方面的技術實現。

列式內存布局

Doris 的存儲引擎采用的是列式存儲。在數據分析領域,列 式存儲相比行式存儲有諸多優勢,比如更高的壓縮比,數據可以 按需讀取以提升 I/O 的效率等。

雖然 Doris 采用列式存儲,但在 1.0 版本之前,數據從磁 盤讀取到內存后,在內存中依然是以行的形式進行布局的,如 圖 2-5-7 中左邊部分(RowBatch)所示。RowBatch 中的數據是 按行排列的,這種內存布局對向量化計算框架不友好,所以向量 化引擎改造的第一步就是把整個行式內存布局改為列式內存布 局,即采用圖 2-5-7 中右邊部分(Block)數據結構。可以看到, 在 Block 數據結構中數據是按列排列的,這種布局可以充分利用

Cache 親和度、 SIMD 指令集等特性,從而加速查詢。

image-20240223143927579

? 圖 2-5-7 列式內存分布

向量化的計算框架

基于改造后的列式內存布局, Doris 實現了全新的向量化計算 框架,在新的計算框架中,所有算子之間的數據都是以 Block 的 格式傳遞的,如圖 2-5-8 所示。

image-20240223143943386

? 圖 2-5-8 向量化的計算框架

在圖 2-5-8 的左邊,原始的 Block 是 a 、b 兩列,我們在 b 列 上進行了一次 abs 函數計算。函數計算會生成一個新的列,來存

儲計算后的結果。之后,我們會對列進行裁剪。比如,如果上層 不再用到原始的 b 列,我們會把 b 列刪除,最終往上一層算子只 傳遞 a 列和 abs 函數計算后的結果列。通過這種方式,我們可以 通過內存預分配、內存復用等多種手段對算子提速。

Cache 親和度

Cache 親和度也跟內存布局息息相關。前文提到,所有數據 都是以列的方式,緊密排列在一個 Block 中的。所以在一次 CPU 指令中,可以盡可能地在一個 CPU 緩存行(Cache Line)中處理 更多的數據。現代 CPU 有多級緩存,比如 L1 、L2、主存,每級 緩存的數據處理的延遲都是指數級增加的,所以要盡可能地在更 貼近 CPU 的緩存中完成更多的數據處理。

虛函數調用

虛函數調用問題也是 Doris 之前版本的計算框架存在的問 題。現代 CPU 都提供多級流水能力以及分支預測能力。CPU 會 根據依賴關系,將一條指令拆分到多個流水線(Pipeline)中并行 處理,并且通過分支預測,搶先執行一些預測后的計算邏輯,如 圖 2-5-9 所示。

image-20240223143959393

? 圖 2-5-9 虛函數調用

但是如果出現了預測失敗,那么多級流水就會被打亂,從而 嚴重降低整個 CPU 在一個時鐘周期內的處理能力。每一次虛函 數調用,都會有一個虛函數表的查找操作,這個查找操作會打斷 CPU 的指令流水,降低 CPU 的分支預測和指令流水的性能。所

以在新的向量化執行框架中,Doris 引入了大量 C++ 模板和 C++ 11、 17 的新語言特性,避免運行時的虛函數調用,提升 CPU 分支預 測的準確度,提高 CPU 的利用率。

SIMD 指令集

SIMD 指令能夠在一條指令集中處理更多的數據。SIMD 指令 集的實現分為兩種,其中一種是自動向量化實現。現代化的 C++ 編譯器,可以智能地將一些函數轉換為 SIMD 指令。比如圖 2-5-10 所示的例子中,for 循環是一個簡單的兩個數組的相加計算,編譯 器會自動地把這樣一條指令變成一個 SIMD 指令。

image-20240223144013489

? 圖 2-5-10 SIMD 指令集

通過 SIMD 指令,整個算法的耗時可以從 100 多 ms 降低到 30 多 ms ,獲得三倍的性能提升。這也就是說,通過對代碼級別 的改造以及編譯器的自動編譯優化,可以顯著提升一些簡單計算 場景下的性能。

對于復雜的函數計算,編譯器的自動向量化可能無法完成, 因此需要開發者通過手寫 SIMD 指令的方式,幫助提升一些算子 的效率。通過編譯器的自動向量化和手寫向量化,可以極大地提 升很多算子的效率。

通過向量化引擎的改造,Doris 在 ClickHouse 公司推出的

Clickbench(https://benchmark.clickhouse.com/ )性能測試中,從 眾多數據庫中脫穎而出,獲得了前三的優異成績。

穩定

Doris 1.0 的第二個主要特點就是 “穩定”。

首先, Doris 的 MPP 執行引擎是基于內存的,即所有數據的 處理都需要在內存中。不論是導入操作、查詢操作,還是系統內 部的任務,都會產生內存開銷。所以 Doris 也是一個內存密集型 的系統。如果沒有一個優秀的內存管理框架,很容易出現 OOM (Out Of Memory)錯誤,從而降低在高負載場景下或者復雜查詢 場景下系統的穩定性。

在 1.0 版本中,Doris 重構了整體內存管理框架,目標就是 “對 OOM 說不”。

在 Doris 內部,我們通過 MemTracker 對內存進行管理和跟 蹤。MemTracker 是一個樹狀結構。根節點的 MemTracker 負責進 程級別的內存總控,子節點由不同模塊的 MemTracker 組成,比 如查詢模塊的、導入模塊的等。這些 Mem Tracker 共同組成了一 個完整的內存管理和跟蹤框架。

再進一步,不同模塊的 MemTracker 還會有更細粒度的內存 管理。比如針對查詢模塊,會對一個查詢內部的多個執行分片, 以及執行分片下面多個執行算子,生成一個樹狀的 MemTracker 結構,幫助我們觀測一個查詢任務的總內存開銷、每一部分內存 開銷等,提升系統的可觀測性。

在具體技術實現上,每一個工作線程開始運行工作任務時, 都會生成線程級別的 MemTracker,同時還會基于 TcMalloc 的 Hook 機制,統一監控所有內存的申請和釋放操作,保證不會遺漏 任何一部分內存,使得整個內存是可控的且可被觀測的。

內存管理的優化只是一個開始,后續 Doris 還會提供細粒度

的 CPU 管理、 I/O 管理以及負載隔離機制,使得不同的工作負載 可以在同一個 Doris 集群中無干擾地運行,降低運維成本,提升 使用體驗。

多源

Doris 自 1.0 版本開始,就全面開展湖倉一體的生態建設。新 版本中的多源數據目錄(Multi-Catalog)功能,能夠幫助用戶自 動同步和映射外部數據源的元信息,并提供多種優化技術來提升 對外部數據源的查詢能力。比如,通過元數據緩存的能力提升訪 問 HiveMetastore 等元數據服務的穩定性和性能。通過分區裁剪、 謂詞下推,以及對 Parquet 、ORC 等格式的文件裁剪、延遲物化、 預讀功能的支持,用戶可以通過 Doris 獲得比其他查詢引擎快 3 ~ 10 倍的查詢加速效果。

在新版本中, Doris 支持了 Hive 、Iceberg 、Hudi 、ES 、JDBC 等多種連接方式。用戶可以將 Doris 作為查詢加速層,在不進行 數據遷移的情況下,直接分析湖上數據以及對多個數據源進行聯 邦查詢。此外,在后續的版本中,Doris 會進一步支持湖倉能力, 不僅提供對湖上數據的增量查詢功能,而且提供自管理的數據湖 表引擎,真正實現極速、統一的湖倉一體能力。

以上就是 Doris 在 1.0 時代最主要的三個方向的進展 —極 速、穩定和多源。當然,除此之外, Doris 還在不斷添加和優化更 多特性,歡迎大家前往 doris.apache.org 官網進行探索。

2023 年, Doris 會進入 2.0 時代。2.0 將是一次全面的進化。Doris 會在多模數據分析、湖倉一體、ETL、實時數據更新、查 詢優化器、云原生等領域提供更多的功能,并進行更多的功能 優化。

關于 Apache Doris 開源社區

Doris 在 2018 年進入 Apache 孵化器,并于 2022 年正式 “畢 業”,成為 Apache 頂級項目。整個社區的發展非常迅速,截至 2023 年 4 月,累計貢獻者人數已接近 500,每月活躍開發者人數 也超過 100 位。整個社區處于蓬勃發展的階段,也歡迎更多的人 加入社區, 一起開發和使用 Doris。

作為一個 Apache 項目, Doris 也將秉承 “社區大于代碼” 的 Apache 理念,不斷面向開發者和用戶推出更多的社區活動。

Doris 的 Github 地址是 https://github.com/apache/doris

在 Github 上可以找到很多豐富的新手任務,不論是在校學 生、職場新手,還是真正使用 Doris 的資深用戶,都可以通過新 手任務快速地加入 Doris 社區,在提升自身技術能力的同時,也 幫助 Doris 社區更好地發展。

基于云原生向量數據庫

Milvus 的云平臺設計實踐

作者介紹

欒小凡,Zilliz 合伙人與工程總監、LFAI & Data 基金會技 術咨詢委員會成員、康奈爾大學計算機工程碩士。先后任職于 Oracle 美國總部、軟件定義存儲創業公司 Hedvig、阿里云數據庫 團隊,曾負責阿里云開源 HBase 和自研 NoSQL 數據庫 Lindorm 的研發工作。

圖書推薦

隨著云計算和生成式 AI 的逐漸發展,基礎軟件的技術棧也在發生變化,市場現存的基礎軟件領域的圖書相對較少,且多數最近兩年沒有更新。但是,基礎軟件領域已經發生了巨大變化,我們現在所講的基礎軟件是以云、AI 為底座的基礎軟件,這些新的變化都可以在**《基礎軟件之路:企業級實踐及開源之路》**這本書里找到答案。

image-20240223144104195

購買鏈接

正版購買鏈接:https://item.jd.com/14328126.html

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

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

相關文章

MySQL-七種SQL優化

一、插入數據 普通插入: 采用批量插入(一次插入的數據不建議超過1000條) insert into tb_test values(1,Tom),(3, Cat),(3, Jerry)....手動提交事務 start transaction; insert into tb_test values(1,Tom),(3, Cat),(3, Jerry); insert …

LeetCode 2878.獲取DataFrame的大小

DataFrame players: ------------------- | Column Name | Type | ------------------- | player_id | int | | name | object | | age | int | | position | object | | … | … | ------------------- 編寫一個解決方案,計算并顯示 players 的 行數和列數。 將結…

maven插件wagon-ssh、os-maven-plugin、buildnumber-maven-plugin使用詳解

文章目錄 前言一、os-maven-plugin的使用二、buildnumber-maven-plugin使用1、時間戳策略2、數字策略 三、wagon-ssh使用1、上傳文件/文件夾2、執行Linux命令或者shell腳本 總結 前言 有時我們在構建項目時,希望能自動生成版本號或者生成不同操作系統標識的版本后綴…

Java實戰:Spring Boot實現郵件發送服務

本文將詳細介紹如何在Spring Boot應用程序中實現郵件發送服務。我們將探討Spring Boot集成郵件發送服務的基本概念,以及如何使用Spring Boot和第三方郵件服務提供商來實現郵件發送。此外,我們將通過具體的示例來展示如何在Spring Boot中配置和使用郵件發…

RS?FSVA3000 信號與頻譜分析儀

R&SFSVA3000 信號與頻譜分析儀 非常適用于實驗室以及生產過程中的高要求信號分析任務。R&SFSVA3000 信號與頻譜分析儀的分析帶寬高達 1 GHz,并具有低至 –120 dBc/Hz 的相位噪聲和高動態范圍,適用于要求嚴格的 5G NR 測量應用。分析儀測量速度快…

代碼隨想錄算法訓練營第二天

● 今日學習的文章鏈接和視頻鏈接 ● 自己看到題目的第一想法 977.有序數組的平方 方法一&#xff1a; 思路&#xff1a; 先將數據所有數據平方將數組排序 代碼&#xff1a; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vect…

vue后臺管理添加水印簡單方式watermark-package

詳情參考:https://www.npmjs.com/package/watermark-package 示例方法 <el-button type"primary" click"AddWatermark">添加水印</el-button><el-button type"primary" click"RemoveWatermark">清除水印</el-but…

Linux調試器——gdb的基礎使用

目錄 1.背景 2.指令的使用 2.1gdb的使用和退出 2.2顯示源代碼 2.3運行程序 2.4調試 1.打斷點 2.查斷點 3.去斷點 4.運行 5.關閉斷點 6.啟用斷點 7.逐過程 8.進入函數 9.顯示變量的值 1.背景 眾所周知&#xff0c;我們的程序發布有兩種&#xff0c;分別是debug模式和release模式…

18.貪心算法

排序貪心 區間貪心 刪數貪心 統計二進制下有多少1 int Getbit_1(int n){int cnt0;while(n){nn&(n-1);cnt;}return cnt; }暴力加一維前綴和優化 #include <iostream> #include <climits> using namespace std; #define int long long const int N2e510; in…

uni-app 經驗分享,從入門到離職(五)——由淺入深 uni-app 數據緩存

文章目錄 &#x1f4cb;前言?關于專欄 &#x1f3af;什么是數據存儲&#x1f9e9;數據存儲——存儲&#x1f4cc; uni.setStorage(OBJECT)&#x1f4cc; uni.setStorageSync(KEY,DATA) &#x1f9e9;數據存儲——獲取&#x1f4cc; uni.getStorage(OBJECT)&#x1f4cc; uni.g…

2024年【起重機司機(限橋式起重機)】找解析及起重機司機(限橋式起重機)考試總結

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年【起重機司機(限橋式起重機)】找解析及起重機司機(限橋式起重機)考試總結&#xff0c;包含起重機司機(限橋式起重機)找解析答案和解析及起重機司機(限橋式起重機)考試總結練習。安全生產模擬考試一點通結合國家…

[AI]部署安裝有道QanyThing

前提條件&#xff1a; 1、win10系統更新到最新的版本&#xff0c;系統版本最好為專業版本 winver 查看系統版本&#xff0c;內部版本要大于19045 2、CPU開啟虛擬化 3、開啟虛擬化功能&#xff0c;1、2、3每步完成后均需要重啟電腦&#xff1b; 注&#xff1a;windows 虛擬…

CSS輕松學:簡單易懂的CSS基礎指南

css基礎 更多web開發知識歡迎訪問我的專欄>>> 01-CSS初體驗 層疊樣式表 (Cascading Style Sheets&#xff0c;縮寫為 CSS&#xff09;&#xff0c;是一種 樣式表 語言&#xff0c;用來描述 HTML 文檔的呈現&#xff08;美化內容&#xff09;。 書寫位置&#xff1a;…

基于HAL庫的STM32-ADC學習(附帶代碼)

1.前言 STM32ADC是一種模擬/數字轉換器&#xff0c;可以將模擬信號轉換為數字信號。STM32ADC有多個通道&#xff0c;可以選擇不同的輸入源、轉換模式、觸發方式和采樣時間。STM32ADC的轉換結果可以通過中斷、DMA或者寄存器讀取。 在本文中&#xff0c;我將介紹如何使用STM32C…

第九屆大數據與計算國際會議 (ICBDC 2024) 即將召開!

2024年第九屆大數據與計算國際會議&#xff08;ICBDC 2024&#xff09;將于2024年5月24至26日在泰國曼谷舉行。本次會議由朱拉隆功大學工程學院工業工程系主辦。ICBDC 2024的宗旨是展示大數據和計算主題相關科學家的最新研究和成果&#xff0c;為來自不同地區的專家代表們提供一…

嵌入式學習筆記總結Day23----minshell項目總結

今天進行了linux系統高級編程io階段學習的結尾&#xff0c;完成了一個minshell的小項目。 一、項目介紹 利用Linux中IO接口實現MiniShell&#xff0c;實現常用的shell指令的實現。 項目想要實現需要思考的地方有&#xff1a; 1.如何打印終端命令 2.如何接受終端命令 3.實現對…

Sora - 探索AI視頻模型的無限可能-官方報告解讀與思考

一、引言 最近SORA火爆刷屏&#xff0c;我也忍不住找來官方報告分析了一下&#xff0c;本文將深入探討OpenAI最新發布的Sora模型。Sora模型不僅僅是一個視頻生成器&#xff0c;它代表了一種全新的數據驅動物理引擎&#xff0c;能夠在虛擬世界中模擬現實世界的復雜現象。本文將重…

[力扣 Hot100]Day33 排序鏈表

題目描述 給你鏈表的頭結點 head &#xff0c;請將其按 升序 排列并返回 排序后的鏈表 。 出處 思路 歸并排序即可。 代碼 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…

2024.2.22 C++QT 作業

思維導圖 練習題 1>完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示”登錄成功“&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面。如果賬…

Stream、Collections、Collectors用法

當涉及Java編程中的集合處理時&#xff0c;Stream、Collections和Collectors是三個常用的工具。以下是它們各自的主要功能和使用的一些方法的概要&#xff1a; Stream&#xff1a; 概要&#xff1a;Stream 是 Java 8 引入的一個強大工具&#xff0c;用于處理集合數據的流式操作…