[OS_4] 數學視角 | 多狀態 | 模型檢查器 | 程序驗證(math)

程序 = 狀態機

  • gdb 單步執行 = 狀態遷移
    • 狀態里有什么?gdb 可以打印
    • 有一些特殊的狀態遷移

硬件 = 狀態機

  • 指令執行 = 狀態遷移
    • 從 CPU Reset 開始執行 Firmware
    • Firmware 加載操作系統 (程序)

操作系統 = 狀態機 (毫無疑問)


程序是一種真正意義上的 “數學嚴格” 的對象

  • Everything is a state machine
    • 程序 = 初始狀態 + 遷移函數
    • 在這個視角下,程序和數學對象已經無限接近了:

Quick Quiz

  • 怎樣給出 f 的定義? (《離散數學》課程內容)
  • 用數學嚴格的語言描述計算機世界中的對象
    • 《計算機科學的數學基礎》
      • Proof Assistant (妄想)

為什么會有程序?

  • 是因為程序必須在無情執行指令的機器上執行
  • 只有程序才配得上它

程序天生是 “人類” 的,也是 “反人類” 的

  • 人類的一面:程序連接了人類世界需求
    • 語言模型有非常驚艷的編程能力
  • 反人類的一面:程序會在機器上執行
    • 語言模型還是經常有幻覺
      • (對程序的行為的 100% 掌控就是非常困難的)
  • “Maintainability”: 代碼字面意義實際行為直接關聯
  • 軟件:物理世界實際的事 在 計算機世界的需求投影

所以我們要 盡量寫出寫 絕對正確的代碼

  • 我們能證明程序的正確性嗎?
int popcount(int x) {int count = 0;while (x) {x -= (x & -x);count++;}return count;
}
  • 我們還需要 “什么叫對”
  • Specification: 不 crash; 沒有 UB; assert satisfy, ...
int popcount(int x) {int count = 0;while (x) {x -= (x & -x);count++;}return count;
}void popcount_spec() {for (uint64_t x = 0; x <= 0xffffffff; x++) {assert( ((x >> 0) & 1) + ((x >> 1) & 1) + ...((x >> 31) & 1) == popcount(x) );}

For all executions of ff, the specification is satisfied.

暴力枚舉

  • 寫一個 driver code,枚舉所有的 xx,運行 f(x)f(x)
    • Testing: 選一些有代表性的

寫出證明

  • 直接證明 “For all executions of ff, the specification is satisfied.”
    • 就和在《離散數學》課上的證明一樣

“Proof Assistant” (Coq, Lean, ...)

  • 它會拒絕一切偽證
    • EMMS Lecture by Terence Tao


計算機輔助證明

這并不是一個新概念:我們不再用自然語言,而是用嚴格的、機器可檢查的邏輯語言書寫證明,核心技術是 揭示了數學證明與類型系統之間的深刻聯系的 Curry-Howard Correspondence:

  1. 命題即類型:邏輯中的命題 (如 A→B) 對應函數類型 A→B。
  2. 證明即程序:命題的構造性證明過程對應該類型的一個具體程序(例如,一個實現 A→B的函數即為 “A 蘊含 B” 的證明)。

邏輯中的蘊含消除規則對應函數調用:若有一個類型為 A→B的函數 (證明),且輸入類型 AA的值 (前提),則輸出類型 B 的值 (結論)。而對于一階謂詞,例如 ?x.P(x),就必須提供一個 x 的實例,這構成了基于構造的 “直覺邏輯” 的基礎。

Proof assistant 是人工智能時代堪稱完美的輔助工具:如果我們要信任 AI 產生的結果,可以讓它們給出一個 proof assistant 認可的證明!延伸閱讀:科普文章: “Formal verification doesn’t result in perfect code; it simply narrows the possibility for errors and vulnerabilities to creep in,” Parno says. “What makes the technique so attractive is that you push the uncertainty or scope of problems down to smaller and smaller windows”

<<正式的軟件驗證措施>>


4.2 數學視角的操作系統

程序 = 狀態機

  • 狀態
    • 棧幀中的變量和 PC ; 局部變量
  • 初始狀態
    • main(argc, argv)
  • 狀態遷移
    • 執行 “當前棧幀 PC” 的語句
    • 有一種特殊的語句:syscall
  • (我們不妨就認可狀態機是可以 “數學定義” 的)

操作系統 = 狀態機的管理者

  • 可以同時容納多個 “程序狀態機”
    • 程序內計算:選一個程序執行一步
    • 系統調用:創建新狀態機、退出狀態機、打印字符……

有了一個有趣的想法……

  • 能不能我們自己定義 “狀態機”
    • 用我們喜歡的語言、喜歡的方式
    • 不要受限于 C、匯編……
  • 自己模擬狀態機的執行
    • 不就有了一個 “玩具操作系統” 嗎?

Life is short, you need Python!

def StateMachine():b = sys_read()if b == 0:sys_write('I got a zero.')else:sys_write('I got a one.')def main():sys_spawn(StateMachine)

操作系統中的對象

  • 狀態機 (進程)
    • Python 代碼
    • 初始時,僅有一個狀態機 (main)
    • 允許執行計算或 read, write, spawn 系統調用
  • 一個進程間共享的 buffer (“設備”)

系統調用

  • read(): 返回隨機的 0 或 1
  • write(s): 向 buffer 輸出字符串 s
  • spawn(f): 創建一個可運行的狀態機 f

難點是多狀態機的管理

  • 如何在狀態機之前來回切換
  • 實現我們單 CPU 上運行多個程序的效果?

一些途徑

  • 用一個模擬器去解釋執行語句 (2022 年的實現)
    • 創建多個模擬器對象單步執行 (J2ME KVM 就是如此)
    • “虛擬機” (QEMU TCG)
  • 是否有語言機制能 “暫存” 函數的運行狀態,并且之后回復?
    • 有:Generators/Coroutines

30 行代碼講完 UNIX 系統的基本模型

  • 進程
  • 系統調用
  • 上下文切換
  • 調度

你會在 Linux Kernel 中看到 “類似” 的代碼

  • “procs” → cpu->runqueue
  • “current” → current = (current_thread_info()->task)

借助 py 來看看

操作系統是最早的實用并發程序

  • 每個進程 (程序) 都是順序狀態機
    • 但發生中斷/系統調用以后,操作系統代碼直接執行
    • 如果有多個處理器 (或者允許此時切換到另一個程序執行),就有了并發

4.3 狀態機模型與模型檢查器

Mosaic Model and Checker

狀態

  • 多個 “應用程序” 狀態機
    • 當然,可以是模型

初始狀態

  • 僅有一個 “main” 狀態機
    • 這個狀態機處于初始狀態

遷移

  • 選擇一個狀態機執行一步
    • 就像我們在操作系統模型上看到的那樣

計算機系統中的不確定性 (non-determinism)

程序中的不確定性都是操作系統給的

調度:狀態機的選擇不確定

  • 多處理器的 “選擇” 是無法控制的
  • 操作系統可以主動隨機選擇狀態機執行一步

I/O:系統外的輸入不確定

  • read 返回的結果也有兩種可能性

這樣程序的執行就不是 “一條線” 了

  • 從初始狀態出發,可能有多個可能的 “下一個狀態”

這就是為什么 并發 程序難以預測了


Mosaic Model and Checker

看到并發的這個模型圖,《離散數學》忽然更有用了

程序定義了狀態機 G(V,E)

  • 加上一個起點 v0
  • 再加上 F?V是 “壞” (faulty) 的狀態
    • 程序正確 ≡ 不存在從 v0到 v∈F 的路徑

  • 也可以通過這個來理解 網絡安全的 驗證思路

還記得你們怎么在 G 里找路徑嗎

  • DFS/BFS 啊!
  • 恭喜你!你離圖靈獎進了一步 (邁出了重要的第一步 Bush)
    • 要有一個瘋狂的想法:軟件是可以自動證明的
    • Turing Award Lecture: Model checking: algorithmic verification and debugging

插曲:如果你想得圖靈獎?

需要找一個 tractable 的問題

  • F?V+ 暴力枚舉 顯然太 trivial 了
    • 我們有更好的方式表達規約 (temporal logic)
    • G(A→FB)
      • “如果 A 發生,則最終 B 會發生”
      • 哦!你需要構建一個好的邏輯系統
  • 提出一些有趣的檢查算法

在軟件系統里又是 useful

  • 要走很多彎路,而且今天 temporal logic(時序邏輯) 也沒落了
  • 但 Verification(驗證) 沒有死,而且在 AI 時代肯定會走得更遠

Putting Them Together

模型

  • 理論上,我們可以建模任何系統調用
  • 當然,我們選擇建模最重要的那些
    • Three Easy Pieces!

檢查器

  • 最簡單的 BFS 就行 (只要能獲得狀態機的狀態)

可視化

  • 我們就是繪制一個頂點是狀態的圖 G(V,E)

于是,我們有了一個更復雜的“玩具”

模塊

系統調用

行為

基礎

choose(xs)

返回一個 xs 中的隨機的選擇

基礎

write(s)

向調試終端輸出字符串 s

基礎

sched()

切換到隨機的線程/進程執行

虛擬化

fork()

創建當前狀態機的完整復制

并發

spawn(fn)

創建從 fn 開始執行的線程

持久化

bread(k)

讀取虛擬設磁盤塊 kk 的數據

持久化

bwrite(k, v)

向虛擬磁盤塊 kk 寫入數據 vv

持久化

sync()

將所有向虛擬磁盤的數據寫入落盤

持久化

crash()

模擬系統崩潰


操作系統模型和檢查器

我們可以把 “狀態機的管理者” 這個思想在 Python 世界中構造出來:

  • 我們用 Python 的函數來聲明狀態機,并且實現狀態空間的遍歷。
  • 所有的實現都是 “最簡” 的——但它真的能用來澄清 Three Easy Pieces 里的概念:Concurrency, Virtualization, 和 Persistence。

下面是我們繪制一個 “Hello World” 狀態空間的例子。Hello 會調用一個有趣的系統調用 fork,它的行為是復制狀態機的當前狀態:

  • 將會在這個專欄里,同時分析模型和真實操作系統 (Linux) 系統調用的行為,在概念 (抽象) 和具體 (實現) 層面理解操作系統。

4.4 總結

Take-away Messages: 程序就是狀態機;狀態機可以用程序表示。因此:我們可以用更 “簡單” 的方式 (例如 Python) 描述狀態機、建模操作系統 的應用,并且實現操作系統的可執行模型。而一旦把操作系統、應用程序當做 “數學對象” 處理,那么我們圖論、數理邏輯中的工具就能被應用于處理程序,甚至可以用圖遍歷的方法證明程序的正確性。

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

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

相關文章

互聯網的“神經中樞”域名根服務器是如何演變的?

互聯網如同一條隱形的紐帶&#xff0c;將全球數十億人的生活和工作緊密相連。而在這龐大的網絡體系中&#xff0c;域名根服務器則是支撐其平穩運行的“神經中樞”。那么域名根服務器是如何演變的呢&#xff1f; 一、域名根服務器互聯網的“地址簿” 想象一下&#xff0c;當你…

【sylar-webserver】6 IO協程調度模塊

文章目錄 設計知識點 設計 IO協程調度模塊&#xff0c;整個項目里最重要的模塊~ 和 協程調度模塊 相比&#xff0c;增加了 IO 事件的 觸發條件。 所以需要重新封裝 Event 事件&#xff0c; 通過 epoll_wait 監測觸發事件&#xff08;重新實現了idle&#xff09;&#xff0c;…

6.2、認證主要產品與應用

目錄 認證主要產品認證產品主要技術指標認證技術應用認證技術應用 - 校園網應用認證技術應用 - 網絡路由認證認證技術應用 - 用戶登錄設備認證技術應用 - 人臉識別門禁與eID 認證主要產品 應用認證產品主要形態有三種&#xff0c;硬件模式、軟件模式和軟硬相結合。硬件比如說認…

一套SaaS多租戶醫療云his源碼,基于云計算的醫院信息管理系統(云HIS)

基于云計算的醫院信息管理系統&#xff08;云HIS&#xff09;&#xff0c;通過SaaS服務模式提供。這種云HIS系統設計考慮了模板化、配置化、智能化和可擴展性&#xff0c;覆蓋了基層醫療機構的核心工作流程&#xff0c;并且能夠與監管系統無縫對接&#xff0c;滿足未來的擴展需…

人工智能技術全景圖譜:從基礎理論到前沿應用

人工智能技術全景圖譜&#xff1a;從基礎理論到前沿應用 一、AI發展歷程與學科體系 1.1 人工智能三大學派 符號主義&#xff08;Symbolicism&#xff09; 邏輯推理&#xff1a;一階謂詞邏輯知識表示&#xff1a;語義網絡、框架系統 連接主義&#xff08;Connectionism&#…

基于杜鵑鳥鯰魚優化(Cuckoo Catfish Optimizer,CCO)算法的多個無人機協同路徑規劃(可以自定義無人機數量及起始點),MATLAB代碼

一、杜鵑鳥鯰魚優化算法 杜鵑鳥鯰魚優化&#xff08;Cuckoo Catfish Optimizer&#xff0c;CCO&#xff09;算法模擬了杜鵑鳥鯰魚的搜索、捕食和寄生慈鯛行為。該算法的早期迭代側重于執行多維包絡搜索策略和壓縮空間策略&#xff0c;并結合輔助搜索策略來有效限制慈鰾的逃逸空…

FPGA_DDS_IP核

接下來對FPGA的DDS的ip核進行學習。 首先對DDS需要有些了解 DDS信號發生器采用直接數字頻率合成&#xff08;Direct Digital Synthesis&#xff0c;簡稱DDS&#xff09;技術&#xff0c;簡單來說就是 需要一個系統頻率和一個輸入的數字數據 &#xff0c;用這個系統頻率計算出…

dbeaver連接mongodb 插入日期變成了字符串

dbeaver插入mongodb數據 日期默認使用ISODate處理&#xff0c;但是插入數據以后實際上是ISODate(2025-03-03T03:25:19.640Z)字符串 INSERT INTO xxx.aaa (_id, chatId, buddyId, pId, lastChatId, inspiration, createTime, modelType, version, selectedInspiration, _class)…

微服務管理 - NACOS學習

為什么了解&#xff0c;工作中會使用這個工具進行微服務管理。 入門介紹&#xff1a; Nacos 是阿里巴巴開源的一款專注于動態服務發現、配置管理和服務管理的平臺&#xff0c;主要用于簡化云原生應用架構中的微服務開發與運維。它幫助開發者實現服務的自動注冊與發現、實時配置…

外貿獨立站相關知識掃盲

常見的外貿獨立站類型 B2B外貿獨立站&#xff1a;主要面向企業客戶&#xff0c;展示公司產品、服務和解決方案&#xff0c;促進企業間貿易。例如&#xff0c;使用WordPress搭建的B2B外貿獨立站&#xff0c;可以靈活展示產品信息、發布行業資訊、提供在線詢盤功能等。 B2C外貿…

libpng-1.6.47-windows編譯

本文操作按照《c&c開源庫編譯指南》中內容規范編寫&#xff0c;編譯環境配置、工具下載、目錄規劃&#xff0c;及更多其他開源庫編譯方法請參考該文章。 c&c開源庫編譯指南&#xff1a;https://blog.csdn.net/binary0006/article/details/144086155 本文章中的源代碼已…

[250324] Kafka 4.0.0 版本發布:告別 ZooKeeper,擁抱 KRaft!| Wine 10.4 發布!

目錄 Kafka 4.0.0 版本發布&#xff1a;告別 ZooKeeper&#xff0c;擁抱 KRaft&#xff01;Wine 10.4 發布&#xff01; Kafka 4.0.0 版本發布&#xff1a;告別 ZooKeeper&#xff0c;擁抱 KRaft&#xff01; 近日&#xff0c;Apache Kafka 4.0.0 正式發布&#xff01;這是一個…

linux安裝配置Nacos

環境&#xff1a;centos7、mysql8.0、nacos2.5.1 1.下載Nacos安裝包 https://github.com/alibaba/nacos/releases?spm5238cd80.72a042d5.0.0.46bacd36C42EfG 我這邊選的是最新的穩定版本2.5.1 2. 放到 linux 服務器中解壓安裝 解壓 tar -xvf nacos-server-2.5.1.tar.gz 進入…

元宇宙浪潮下,數字孿生如何“乘風破浪”?

在當今科技飛速發展的時代&#xff0c;元宇宙的概念如同一顆璀璨的新星&#xff0c;吸引了全球的目光。元宇宙被描繪為一個平行于現實世界、又與現實世界相互影響且始終在線的虛擬空間&#xff0c;它整合了多種前沿技術&#xff0c;為人們帶來沉浸式的交互體驗。而數字孿生&…

[Effective C++]條款24:若所有參數皆需類型轉換,請為此采用non-menber函數

. 1、操作符重載&隱式類型轉換 C中&#xff0c;操作符重載可以通過成員函數或非成員函數來實現。當操作符重載是成員函數時&#xff0c;左操作數必須是該類的對象。如果左操作數不是該類的對象&#xff0c;而是需要進行隱式轉換的類型&#xff0c;編譯器將無法找到匹配的成…

C++———— Vector

一、vector的介紹及使用 1.1 vector的介紹 1.2 vector 的使用 1.21 vector的定義 演示&#xff1a; 1.22 vector iterator 的使用 1.beginend 主要作用&#xff1a;獲取第一個數據位置的迭代器和最后一個數據的下一個位置的迭代器。 演示&#xff1a; 2.rbeginrend 主要…

STL入門

STL入門 作者&#xff1a;blue 時間&#xff1a;2024.3 文章目錄 STL入門0.概述1.pair2.set(集合)3.vector4.string字符串類型5.queue&#xff0c;deque&#xff0c;priority_queue6.list的用法 0.概述 本文討論部分常用的STL的運用 1.pair pair是將2個數據組合成一組數據…

洛谷 P10463 Interval GCD Solution

Description 給定序列 a ( a 1 , a 2 , ? , a n ) a(a_1,a_2,\cdots,a_n) a(a1?,a2?,?,an?)&#xff0c;有 m m m 個操作分兩種&#xff1a; add ? ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k)&#xff1a;對每個 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 執行 …

從聲源定位(DOA)算法仿真到工程源碼實現-第八節

一、概述 本節我們記錄在respeaker core v2 開發板上部署一個完整的聲源定位(DOA)系統&#xff0c;演示可以看第一節中的視頻。整個模塊可以分為三部分&#xff0c;第一部分為控制開發板上的LED燈顯示&#xff0c;這樣可以實時的測試算法的效果&#xff1b;第二部分為從ALSA上取…

在linux部署網站

在Linux部署網站&#xff0c;需要準備一個純凈的系統 一、系統環境準備 1.設置靜態IP地址 ? 2.關閉默認防火墻 systemctl disable firewalld --now ? 3.配置SSH密鑰登錄 4.yum update -y && reboot # 更新系統內核 5.yum install -y wget curl unzip # 安裝…