程序管理器能夠建立多個posix程序(每個程序可以包含多個posix執行緒)。在qnx中微子rtos中,微核與程序管理器(procnto)是成對的,所有執行時系統都需要此模組。其主要職責包括:
程序管理——管理程序的建立、銷毀和程序屬性,如使用者id (uid)和組id (gid)。
記憶體管理——管理一系列記憶體保護功能、共享庫和程序間posix共享記憶體原語。
路徑名管理——管理資源管理器可能附加到的路徑名空間。
使用者程序可以向procnto傳送訊息,通過核心呼叫和程序管理器函式直接訪問微核心函式。注意,使用者程序通過呼叫msgsend*()核心呼叫來傳送訊息。
需要注意的是,在procnto中的執行緒呼叫微核心的方式與其他程序中的執行緒完全相同。程序管理器**和微核心共享相同的程序位址空間這一事實表明不存在「特殊」或「私有」介面。系統中的所有執行緒共享相同的一致核心介面,並在呼叫微核心時執行特權切換。
procnto的第乙個職責是動態建立新程序。這些程序將依賴於procnto的記憶體管理和路徑名管理的其他職責。程序管理包括程序建立和銷毀,以及程序屬性(如程序id、程序組、使用者id等)的管理。
posix_spawn() :
posix_spawn()函式通過直接指定要載入的可執行檔案來建立子程序。對於那些熟悉unix系統的人來說,posix_spawn()呼叫被模式化為fork()後面跟著exec*()。然而,qnx中它的操作效率要高得多,因為不需要複製fork()中的位址空間,而只需在呼叫exec*()時銷毀並替換它。
在unix系統中,使用fork()-then-exec*()方法建立子程序的主要優點之一是可以靈活地更改新子程序繼承的預設環境。這是在fork child中完成的,僅僅在exec*()之前。例如,以下簡單的shell命令將在exec*()ing之前關閉並重新開啟標準輸出:ls >file
您可以使用posix_spawn()執行相同的操作;它使您可以控制環境繼承的以下類,這些類在建立新的子程序時經常進行調整:
spawn()
qnx中微子spawn()函式類似於posix_spawn()。spawn()函式使您可以控制以下內容:
spawn()函式的一些基本形式是:
當乙個程序是spawn()'ed,子程序繼承了它的父程序的以下屬性:
子程序與父程序有幾個不同之處:
fork()
fork()函式通過與呼叫程序共享相同的**並複製呼叫程序的資料來建立乙個新的子程序,從而為子程序提供乙個完全相同的副本。大多數流程資源都是繼承的。以下資源是顯式不繼承的:
vfork()
當fork()的目的是為對exec*()函式之一的呼叫建立乙個新的系統上下文時,vfork()函式(應該只從單執行緒程序中呼叫)非常有用。vfork()函式與fork()函式的不同之處在於,子程序不會獲得呼叫程序資料的副本。相反,它借用呼叫程序的記憶體和控制線程,直到對exec*()函式之一進行呼叫。當子程序使用它的資源時,呼叫程序被掛起。
vfork()子程序不能從呼叫vfork()的過程中返回,因為最終從父程序vfork()返回的將是乙個不再存在的堆疊框架。
exec*()
exec*()函式家族用乙個從可執行檔案載入的新程序替換當前程序。
exe函式家族有:execl() execle() execlp() execlpe() execv() execve() execvp() execvpe()。exec*()函式通常位於fork()或vfork()之後,以便載入新的子程序。這可以通過使用posix_spawn()呼叫來更好地實現。
使用exec*()、posix_spawn()或spawn()呼叫從檔案系統載入的程序是elf(可執行和鏈結格式)。如果檔案系統位於面向塊的裝置上,則將**和資料載入到主記憶體中。預設情況下,包含二進位制檔案的記憶體頁是按需載入的,但是您可以使用procnto -m選項來更改這一點;有關更多資訊,請參見後面"locking memory"。
如果檔案系統是記憶體對映的(例如,rom/flash映像),則不必將**載入到ram中,但可以在適當的地方執行。這種方法使所有的ram都可用於資料和堆疊,而將**留在rom或flash中。在所有情況下,如果同乙個程序被載入超過一次,那麼它的**將被共享。
記憶體保護不僅在開發過程中很有用,它也可以為現場安裝的嵌入式系統提供更高的可靠性。許多嵌入式系統已經使用了硬體「看門狗定時器」來檢測軟體或硬體是否「失去了理智」,但是這種方法缺乏mmu輔助。
硬體看門狗定時器通常被實現為乙個可重觸發的單穩態定時器,附加在處理器復位線路上。如果系統軟體沒有定期地對硬體計時器進行頻閃,則計時器將過期並強制處理器復位。通常,系統軟體的某些元件將檢查系統完整性,並對計時器硬體進行頻閃,以表明系統是「正常的」。
儘管這種方法可以從與軟體或硬體故障相關的鎖定中恢復,但是它會導致完全的系統重新啟動,並且在重新啟動時可能會導致重大的「停機」。
軟體看門狗
當在受記憶體保護的系統**現間歇性的軟體錯誤時,作業系統可以捕獲該事件並將控制權傳遞給使用者編寫的執行緒,而不是記憶體轉儲工具。這個執行緒可以對如何最好地從故障中恢復做出明智的決定,而不是像硬體看門狗定時器那樣強制進行完全重置。軟體看門狗可以:
中止由於記憶體訪問衝突而失敗的程序,並簡單地重新啟動該程序,而不關閉系統的其餘部分。
終止失敗的程序和任何相關程序,將硬體初始化為「安全」狀態,然後以協同的方式重啟相關程序。
如果故障非常嚴重,關閉整個系統,並發出聲音警報。
這裡的重要區別是,我們保留了嵌入式系統的智慧型、程式化控制,即使控制軟體中的各種程序和執行緒可能由於各種原因而失敗。硬體看門狗定時器仍然用於從硬體「掛起」中恢復,但是對於軟體故障,我們現在有了更好的控制。
在執行這些恢復策略的某些變體時,系統還可以收集有關軟體故障性質的資訊。例如,如果嵌入式系統包含或能夠訪問某些大容量儲存(快閃儲存器、硬碟驅動器、連線到另一台具有磁碟儲存的計算機的網路),軟體監控器可以生成按時間順序歸檔的轉儲檔案序列。然後可以使用這些轉儲檔案進行崩潰診斷。
嵌入式控制系統通常採用這些「部分重啟」方法來避免操作人員經歷任何系統「停機」,甚至意識不到這些快速恢復軟體故障。由於轉儲檔案是可用的,軟體開發人員可以檢測和糾正軟體問題,而不必在不方便的時間處理關鍵系統發生故障時所導致的緊急事件。如果我們將其與硬體看門狗定時器方法和其導致的服務中斷時間進行比較,我們的選擇就很明顯了!
事後轉儲檔案分析對於任務關鍵型嵌入式系統尤其重要。當某一關鍵系統在該領域出現故障時,應作出重大努力確定故障的原因,以便在其他系統出現類似故障之前設計並應用「修復」。轉儲檔案為程式設計師提供了他們解決問題所需的資訊,如果沒有這些資訊,程式設計師可能除了客戶神秘的抱怨「系統崩潰」之外就沒什麼其他資訊可獲取了。
通過將嵌入式軟體劃分為一組協作的、受記憶體保護的程序(包含執行緒),我們可以很容易地將這些程序視為「元件」,以便在新專案中再次使用。由於顯式定義(以及硬體強制的)介面,可以將這些程序整合到應用程式中,並且確信它們不會破壞系統的整體可靠性。
此外,由於流程的精確二進位制映像(而不僅僅是源**)正在被重用,我們可以更好地控制由於重新編譯源**、重新鏈結、開發工具的新版本、標頭檔案、庫例程等而可能導致的更改和不穩定性。由於程序的二進位制映像是重用的(其行為可能通過命令列選項進行修改),因此我們對該二進位制模組更有信心(比更改程序的二進位制映像),因為更容易傳遞到新的應用程式中。
儘管我們努力為所部署的系統生成無錯誤的**,但軟體密集型嵌入式系統的現實情況是,程式設計錯誤最終會出現在發布的產品中。與其假裝這些bug不存在(直到客戶打**報告它們),我們應該採用「關鍵任務」的心態。系統的設計應該能夠容忍並能夠從軟體故障中恢復。在我們構建的嵌入式系統中利用整合mmus提供的記憶體保護是朝著這個方向邁出的良好的一步。
我們的完全保護模型將映像中的所有**重新定位到乙個新的虛擬空間中,啟用mmu硬體並設定初始頁表對映。這允許procnto在正確的、支援mmu的環境中啟動。然後,流程管理器將接管此環境,根據其啟動的程序的需要更改對映表。
在全保護模型中,每個程序都有自己的私有虛擬記憶體,記憶體大小為2或3.5 g(取決於cpu)。這是通過使用cpu的mmu來實現的。由於在兩個完全私有的位址空間之間獲取可定址性的複雜性增加,程序切換和訊息傳遞的效能成本將會增加。
對於每個程序的頁表,每個程序的記憶體成本可能增加4 kb到8 kb。注意,這個記憶體模型支援posix fork()呼叫。
todo
FastCGI 程序管理器(FPM)
pm fastcgi 程序管理器 用於替換 php fastcgi 的大部分附加功能,對於高負載 是非常有用的。它的功能包括 php fpm即php fastcgi process manager.php fpm是fastcgi的實現,並提供了程序管理的功能。程序包含 master 程序和 work...
取程序管理器中的程序路徑
void cpathdlg onbnclickedok dwstyle m list.getstyle dwstyle lvs ex gridlines lvs ex fullrowselect m list.settextbkcolor rgb 0xfe,0xff,0xc6 m list.inse...
QNX系列 五 資源管理器(3)簡單的例子
資源管理器主要是解決多工不阻塞的問題,系統提供封裝好的函式給使用者使用。在系統中伺服器可以在不阻塞的條件下進行訊號的接收並且進行資料處理工作。這兩個歷程表示了大部分程式中的邏輯,比較重要的點總結如下 解決了阻塞問題之後,伺服器可以不斷的接受訊號並進行處理。include include includ...