精華區beta Programming 關於我們 聯絡資訊
※ 引述《tester.bbs@bbs.csie.ncu.edu.tw (try or test)》之銘言: > > 如果你主要是回應 gsj 的問題, 那麼在你提出不同 process 的情況時, > > gsj 已經說這不是他認為 "OO非循序" 的情況了, 如下: > > "我的循序是指 "行程內" 的循序" > > "行程間也是有一個順序規則的" > > "Process 的執行順序會由Scheduler 來排定" > > "(這些東西已經算是OS的議題了,詳情去看看教科書吧)" > > "至於Interrupt 有的是隨機發生(如網路卡、Keyboard),有的是定時發生(如Timer)" > > "但是ISR內部的執行也是循序" > > "如果它有Task要註冊到Task Queue內執行,它也是循序的" > > [恕刪] > > 直接引用 Booch 在 Object-Oriented Analysis and Design 中的定義, > > Object Model 的必要條件有: > > 1. Abstraction > > 2. Encapsulation > > 3. Modularity > > 4. Hierarchy > > 非必要條件為: > > 1. Typing > > 2. Concurrency > > 3. Persistence. > > 既然 concurrency 是在非必要條件, 那麼就算 concurrency 確算真的 > > 會造成 gsj 所說的 "用非循序的程式設計方式不適合循序的CPU", 又 > 1. 不受 interrupt 影響的 CPU 執行是循序的, 但有 interrupt 機制的 > CPU 就不全然是循序做事的. 看了一連串的討論...實在是霧煞煞... 為何 MCU 一收到 interrupt signal 就不是"循序" 的? interrupt controller 也不過是通知 MCU 有 hardware event 到了 至於這個 event 要不要處理,完全是由 MCP (CPU)控制的,不是嗎? 你不高興的話大可將該 interrupt 的 trigger bit mask 掉...這樣該 int 應該 就不會來煩你了 收到 interrupt 至少需要做的是把 ack bit 寫回 interrupt controller register 我想這是 ISRᆰ먠minimal critera 吧, return 後 MCU 可以從 Stack register 取回前一次的 PC...我實在是看不出來特別強調"循序"或"非尋序"的 意義 > 2. 把 interrupt 用 OS 掌管 ISR , 透過 Dispatcher , Process 隔開, > 是在 OS 層之上提供分隔的虛擬執行環境, 這時候的各 process 是併行 > 的. 只是用起來像是 concurrent or parallel 吧...事實上還是是切成一段段的 quantum ,而這段 time slice 可能從幾個 ms 到幾百個 ms....看你高興要在那邊用吧 這應該是由 RTOS 的 Kernel 設計來決定要怎麼切 process/thread processes 看起來同時執行要跟 interrupt controller/ISR handler 擺在一起講...實在是... > 首先, 實體的 processor 有了 interrupt 機制, 其本質就不全然是循序的. > OS 都被歸類有 Concurrent Operation 的成份, 而這種非循序特性還是因應 > interrupt 這機制而來的, 這特性並無 "不自然對應" 的現象. > 其次, OOPL 在目前的實現形式是架在 OS 之上的 process , 使用者也只是 > 在個別的 single process 下, 執行其程式, 模組間依舊是同步的 call- > return 或 Synchronous Remote Procedure Call 關係, 在這一點上跟目前 > 的傳統 PL 是相同的. 從 MCU/INT(ISR)/OS 的角度...至少不講繼承跟封裝或虛擬或多型... RTOS 或是 OO-application 都是可以獨立存在的 找個比較簡單的 RTOS trace 一下(ex. 日系的 ITRON, nucleus, eLinux, WinCe...) 至少在 HAL/Kernel 層你是不太會看到啥 CPP 的東西的...有的話頂多是一些 3rd party 給的 driver 會有 C++ 的結構 就這個部分看來...硬把 OO 跟 hardware/OS 綁這麼緊....實在是看不出來 其必要性在哪裡 (好吧...我必須承認我的資質弩頓...無法參透 orz) > 但 OO 的 message passing 與 code+data encapsulation 就跨越出不必然 > 是在 shared memory 架構之上執行的限制, 至少在單機上透過 Virtual > Memory 隔離的 multi process 間, 其記憶體就不能隨意來往. 假如 OOPL > 子程式間(如某些不透過 interpreter 執行的 OOPL Compiler)是在不同 > process 或 thread 執行時, message passing 的機制(因為使用這個術語 > 就是有擺脫 synchronous call-return 的習慣涵義), 至少很容易可以透過 > 外部模組(通常是 OS)同時啟動兩個以上的 server process 併行運作. 因 > 此架在 OS 之上的 OOPL 有非循序的併行處理能力, 也不儘然是不對稱的. > 再進一步, 假如 OS 的 ISR 與 Process Dispatcher 機制被用混合的語言 > 寫成可配合語言呼叫的模組, 送到 process 外的 message passing 也用 > communication ISR 來處理, 這種 "非循序現象" 就更自然了. OS/OO-application 的 message passing 難道就不是循序執行的嗎? 那究竟是誰負責傳遞 event 進出 event queue 的呢? 還不是 system process, 這段程式用 OO 寫或是直接用 SDK 寫有很大的差異嗎? > > 跟 OOP 有什麼關係. > > 你在探討的似乎是 "到底要不要把 process model 從 OS 整合成為 > > OOPL 的語法", > > 只是如果把 process model 歸類到 OS 中, 可以廣為大眾所接受, > > 又可以讓 process model 有更大的發展空間, > > 又何必一定要把所有的東西都放到 programming language 中? > 想說的是合理又有效率的 "銜接" , 不是誰整合誰. 回歸主題...除非有多個各自獨立的 SOC 在同一個系統...否則單一處理器的系統中 指令的部分是循序執行的,有 OS 頂多是讓你看不到 context switch 的作業 用起來像是多工執行,實際上還是用一行行的指令讓 CPU 循序執行的 反過來想,難不成用了 goto 或是 long jump, CPU 就會只執行 line 1, 3, 5 的指令嗎, 將 instruction 跟 data 擺在一起,CPU 就會錯亂嗎? 看了老半天,還是不懂 CPU 要不要循序執行指令跟程式要不要用 OO 開發有啥關係 有效率的銜接? 這邊的效率指的是花多少 man-power 還是花多少 $$ 還是程式跑多快? -- 進來亂的 -- ※ Origin: 交大資管心靈小站 <bbs.iim.nctu.edu.tw> ◆ From: mx.iim.nctu.edu.tw