① c語言popen的描述
popen() 函數 用 創建管道 的 方式 啟動 一個 進程, 並調用 shell. 因為 管道 是被定義成 單向的, 所以 type 參數 只能 定義成 只讀 或者 只寫, 不能是 兩者同時, 結果流 也相應的 是 只讀 或者 只寫.
command 參數 是 一個 字元串指針, 指向的 是 一個 以 null 結束符 結尾的字元串, 這個 字元串 包含 一個 shell 命令. 這個命令 被送到 /bin/sh 以 -c 參數 執行, 即由 shell 來執行. type 參數 也是 一個 指向 以 null 結束符 結尾的 字元串的指針, 這個字元串 必須是 'r' 或者 'w』 來指明 是 讀還是寫.
popen() 函數 的 返回值 是 一個 普通的 標准I/O流, 它只能用 pclose() 函數 來關閉, 而不是 fclose(). 函數. 向 這個流 的 寫入 被轉化為 對 command 命令的 標准輸入; 而 command 命令的 標准輸出 則是和 調用 popen(), 函數 的 進程 相同,除非 這個 被command命令 自己 改變. 相反的, 讀取 一個 「被popen了的」 流, 就相當於 讀取 command 命令的 標准輸出, 而 command 的 標准輸入 則是和 調用 popen, 函數的 進程 相同.
注意, popen 函數的 輸出流 默認是 被全緩沖的.
pclose 函數 等待 相關的進程 結束 並返回 一個 command 命令的 退出狀態, 就像 wait4 函數 一樣
② 關於進程
操作系統進程描述(1)
system process
進程文件:[system process] or [system process]
進程名稱:Windows內存處理系統進程
描述:Windows頁面內存管理進程,擁有0級優先。
是否為系統進程:是
alg.exe
進程文件:alg or alg.exe
進程名稱:應用層網關服務
描述:這是一個應用層網關服務用於網路共享。
是否為系統進程:是
csrss.exe
進程文件:csrss or csrss.exe
進程名稱:Client/Server Runtime Server Subsystem
描述:客戶端服務子系統,用以控制Windows圖形相關子系統。
是否為系統進程:是
ddhelp.exe
進程文件:ddhelp or ddhelp.exe
進程名稱:DirectDraw Helper
描述:DirectDraw Helper是DirectX這個用於圖形服務的一個組成部分。
是否為系統進程:是
dllhost.exe
進程文件:dllhost or dllhost.exe
進程名稱:DCOM DLL Host進程
描述:DCOM DLL Host進程支持基於COM對象支持DLL以運行Windows程序。
是否為系統進程:是
inetinfo.exe
進程文件:inetinfo or inetinfo.exe
進程名稱:IIS Admin Service Helper
描述:InetInfo是Microsoft Internet Infomation Services (IIS)的一部分,用於Debug調試除錯。
是否為系統進程:是
internat.exe
進程文件:internat or internat.exe
進程名稱:Input Locales
描述:這個輸入控制圖標用於更改類似國家設置、鍵盤類型和日期格式。
是否為系統進程:是
kernel32.dll
進程文件:kernel32 or kernel32.dll
進程名稱:Windows殼進程
描述:Windows殼進程用於管理多線程、內存和資源。
是否為系統進程:是
lsass.exe
進程文件:lsass or lsass.exe
進程名稱:本地安全許可權服務
描述:這個本地安全許可權服務控制Windows安全機制。
是否為系統進程:是
mdm.exe
進程文件:mdm or mdm.exe
進程名稱:Machine Debug Manager
描述:Debug除錯管理用於調試應用程序和Microsoft Office中的Microsoft Script Editor腳本編輯器。
是否為系統進程:是
mmtask.tsk
進程文件:mmtask or mmtask.tsk
進程名稱:多媒體支持進程
描述:這個Windows多媒體後台程序控制多媒體服務,例如MIDI。
是否為系統進程:是
mprexe.exe
進程文件:mprexe or mprexe.exe
進程名稱:Windows路由進程
描述:Windows路由進程包括向適當的網路部分發出網路請求。
是否為系統進程:是
msgsrv32.exe
進程文件:msgsrv32 or msgsrv32.exe
進程名稱:Windows信使服務
描述:Windows信使服務調用Windows驅動和程序管理在啟動。
是否為系統進程:是
mstask.exe
進程文件:mstask or mstask.exe
進程名稱:Windows計劃任務
描述:Windows計劃任務用於設定繼承在什麼時間或者什麼日期備份或者運行。
是否為系統進程:是
regsvc.exe
進程文件:regsvc or regsvc.exe
進程名稱:遠程注冊表服務
描述:遠程注冊表服務用於訪問在遠程計算機的注冊表。
是否為系統進程:是
rpcss.exe
進程文件:rpcss or rpcss.exe
進程名稱:RPC Portmapper
描述:Windows 的RPC埠映射進程處理RPC調用(遠程模塊調用)然後把它們映射給指定的服務提供者。
是否為系統進程:是
services.exe
進程文件:services or services.exe
進程名稱:Windows Service Controller
描述:管理Windows服務。
是否為系統進程:是
smss.exe
進程文件:smss or smss.exe
進程名稱:Session Manager Subsystem
描述:該進程為會話管理子系統用以初始化系統變數,MS-DOS驅動名稱類似LPT1以及COM,調用Win32殼子系統和運行在Windows登陸過程。
是否為系統進程:是
snmp.exe
進程文件:snmp or snmp.exe
進程名稱:Microsoft SNMP Agent
描述:Windows簡單的網路協議代理(SNMP)用於監聽和發送請求到適當的網路部分。
是否為系統進程:是
spool32.exe
進程文件:spool32 or spool32.exe
進程名稱:Printer Spooler
描述:Windows列印任務控製程序,用以列印機就緒。
是否為系統進程:是
spoolsv.exe
進程文件:spoolsv or spoolsv.exe
進程名稱:Printer Spooler Service
描述:Windows列印任務控製程序,用以列印機就緒。
是否為系統進程:是
stisvc.exe
進程文件:stisvc or stisvc.exe
進程名稱:Still Image Service
描述:Still Image Service用於控制掃描儀和數碼相機連接在Windows。
是否為系統進程:是
svchost.exe
進程文件:svchost or svchost.exe
進程名稱:Service Host Process
描述:Service Host Process是一個標準的動態連接庫主機處理服務。
是否為系統進程:是
system
進程文件:system or system
進程名稱:Windows System Process
描述:Microsoft Windows系統進程。
是否為系統進程:是
taskmon.exe
進程文件:taskmon or taskmon.exe
進程名稱:Windows Task Optimizer
描述:windows任務優化器監視你使用某個程序的頻率,並且通過載入那些經常使用的程序來整理優化硬碟。
是否為系統進程:是
tcpsvcs.exe
進程文件:tcpsvcs or tcpsvcs.exe
進程名稱:TCP/IP Services
描述:TCP/IP Services Application支持透過TCP/IP連接區域網和Internet。
是否為系統進程:是
winlogon.exe
進程文件:winlogon or winlogon.exe
進程名稱:Windows Logon Process
描述:Windows NT用戶登陸程序。
是否為系統進程:是
winmgmt.exe
進程文件:winmgmt or winmgmt.exe
進程名稱:Windows Management Service
描述:Windows Management Service透過Windows Management Instrumentation data (WMI)技術處理來自應用客戶端的請求。
是否為系統進程:是
程序進程
absr.exe
進程文件:absr or absr.exe
進程名稱:Backdoor.Autoupder Virus
描述:這個進程是Backdoor.Autoupder後門病毒程序創建的。
是否為系統進程:否
acrobat.exe
進程文件:acrobat or acrobat.exe
進程名稱:Adobe Acrobat
描述:Acrobat Writer用於創建PDF文檔。
是否為系統進程:否
acrord32.exe
進程文件:acrord32 or acrord32.exe
進程名稱:Acrobat Reader
描述:Acrobat Reader是一個用於閱讀PDF文檔的軟體。
是否為系統進程:否
agentsvr.exe
進程文件:agentsvr or agentsvr.exe
進程名稱:OLE automation server
描述:OLE Automation Server是Microsoft Agent的一部分。
是否為系統進程:否
aim.exe
進程文件:aim or aim.exe
進程名稱:AOL Instant Messenger
描述:AOL Instant Messenger是一個在線聊天和即時通訊IM軟體客戶端。
是否為系統進程:否
airsvcu.exe
進程文件:airsvcu or airsvcu.exe
進程名稱:Microsoft Media Manager
描述:OLE 這是一個用於在硬碟上建立索引文件和文件夾,在Microsoft Media Manager媒體管理啟動時運行的進程。它可以在控制面板被禁用。
是否為系統進程:否
alogserv.exe
進程文件:alogserv or alogserv.exe
進程名稱:McAfee VirusScan
描述:McAfee VirusScan是一個反病毒軟體用於掃描你的文檔和E-mail中的病毒。
是否為系統進程:否
avconsol.exe
進程文件:avconsol or avconsol.exe
進程名稱:McAfee VirusScan
描述:McAfee VirusScan是一個反病毒軟體用於掃描你的文檔和E-mail中的病毒。
是否為系統進程:否
avsynmgr.exe
進程文件:avsynmgr or avsynmgr.exe
進程名稱:McAfee VirusScan
描述:McAfee VirusScan是一個反病毒軟體用於掃描你的文檔和E-mail中的病毒。
是否為系統進程:否
backWeb.exe
進程文件:backWeb or backWeb.exe
進程名稱:Backweb Adware
描述:Backweb是一個Adware(廣告插件,一般是由於安裝某些免費軟體而伴隨安裝上的程序)來自Backweb Technologies。
是否為系統進程:否
bcb.exe
進程文件:bcb or bcb.exe
進程名稱:Borland C++ Builder
描述:Borland C++ Builder
是否為系統進程:否
calc.exe
進程文件:calc or calc.exe
進程名稱:Calculator
描述:Microsoft Windows計算器程序
是否為系統進程:否
ccapp.exe
進程文件:ccapp or ccapp.exe
進程名稱:Symantec Common Client
描述:Symantec公用應用客戶端包含在Norton AntiVirus 2003和Norton Personal Firewall 2003。
是否為系統進程:否
cdplayer.exe
進程文件:cdplayer or cdplayer.exe
進程名稱:CD Player
描述:Microsoft Windows包含的CD播放器
是否為系統進程:否
charmap.exe
進程文件:charmap or charmap.exe
進程名稱:Windows Character Map
描述:Windows字元映射表用來幫助你尋找不常見的字元。
是否為系統進程:否
idaemon.exe
進程文件:cidaemon or cidaemon.exe
進程名稱:Microsoft Indexing Service
描述:在後台運行的Windows索引服務,用於幫助你搜索文件在下次變得更快。
是否為系統進程:
cisvc.exe
進程文件:cisvc or cisvc.exe
進程名稱:Microsoft Index Service Helper
描述:Microsoft Index Service Helper監視Microsoft Indexing Service (cidaemon.exe) 的內存佔用情況,如果cidaemon.exe內存使用超過了40M,則自動重新啟動該進程。
是否為系統進程:否
cmd.exe
進程文件:cmd or cmd.exe
進程名稱:Windows Command Prompt
描述:Windows控制台程序。不像舊的command.com,cmd.exe是一個32位的命令行使用在WinNT/2000/XP。
是否為系統進程:否
cmesys.exe
進程文件:cmesys or cmesys.exe
進程名稱:Gator GAIN Adware
描述:Gator GAIN是一個Adware插件(廣告插件,一般是由於安裝某些免費軟體而伴隨安裝上的程序)。
是否為系統進程:否
ctfmon.exe
進程文件:ctfmon or ctfmon.exe
進程名稱:Alternative User Input Services
描述:控制Alternative User Input Text Processor (TIP)和Microsoft Office語言條。Ctfmon.exe提供語音識別、手寫識別、鍵盤、翻譯和其它用戶輸入技術的支持。
是否為系統進程:否
ctsvccda.exe
進程文件:ctsvccda or ctsvccda.exe
進程名稱:Create CD-ROM Services
描述:在Win9X創建CD-ROM訪問服務。
是否為系統進程:否
cutftp.exe
進程文件:cutftp or cutftp.exe
進程名稱:CuteFTP
描述:CuteFTP是一個流行的FTP客戶端用於從FTP伺服器上傳/下載文件。
是否為系統進程:否
defwatch.exe
進程文件:defwatch or defwatch.exe
進程名稱:Norton AntiVirus
描述:Norton Anti-Virus掃描你的文件和email以檢查病毒。
是否為系統進程:否
devldr32.exe
進程文件:devldr32 or devldr32.exe
進程名稱:Create Device Loader
描述:Creative Device Loader屬於Create Soundblaster驅動。
是否為系統進程:否
directcd.exe
進程文件:directcd or directcd.exe
進程名稱:Adaptec DirectCD
描述:Adaptec DirectCD是一個用文件管理器式的界面,燒錄文件到光碟的軟體。
是否為系統進程:否
dreamweaver.exe
進程文件:dreamweaver or dreamweaver.exe
進程名稱:Macromedia DreamWeaver
描述:Macromedia DreamWeaver是一個HTML編輯器用於創建站點和其它類別的HTML文檔。
是否為系統進程:否
em_exec.exe
進程文件:em_exec or em_exec.exe
進程名稱:Logitech Mouse Settings
描述:這是Logitech MouseWare狀態欄圖標的進程,用於用戶訪問控制滑鼠屬性和察看MouseWare幫助。
是否為系統進程:否
excel.exe
進程文件:excel or excel.exe
進程名稱:Microsoft Excel
描述:Microsoft Excel是一個電子表格程序包括在Microsoft Office中。
是否為系統進程:否
findfast.exe
進程文件:findfast or findfast.exe
進程名稱:Microsoft Office Indexing
描述:Microsoft Office索引程序,用於提高Microsoft Office索引Office文檔的速度。
是否為系統進程:否
frontpage.exe
進程文件:frontpage or frontpage.exe
進程名稱:Microsoft FrontPage
描述:Microsoft FrontPage是一個HTML編輯器用於創建站點和其它類別的HTML文檔。
是否為系統進程:否
gmt.exe
進程文件:gmt or gmt.exe
進程名稱:Gator Spyware Component
描述:Gator Spyware是一個廣告插件,隨Gator安裝和啟動。
是否為系統進程:否
hh.exe
進程文件:hh or hh.exe
進程名稱:Gator Windows Help
描述:Windows Help程序用以打開幫助文件和文檔,包括在很多Windows程序中。
是否為系統進程:否
hidserv.exe
進程文件:hidserv or hidserv.exe
進程名稱:Microsoft Human Interface Device Audio Service
描述:後台服務,用來支持USB音效部件和USB多媒體鍵盤。
是否為系統進程:否
QQ.exe
進程文件:QQ or QQ.exe
進程名稱:QQ
描述:QQ是一個在線聊天和即時通訊客戶端。
是否為系統進程:否
iexplore.exe
進程文件:iexplore or iexplore.exe
進程名稱:Internet Explorer
描述:Microsoft Internet Explorer網路瀏覽器透過HTTP訪問WWW萬維網。
是否為系統進程:否
kodakimage.exe
進程文件:kodakimage or kodakimage.exe
進程名稱:Imaging
描述:Kodak Imaging是一個圖片察看軟體。包括在Windows,用以打開圖像文件。
是否為系統進程:否
loadqm.exe
進程文件:loadqm or loadqm.exe
進程名稱:MSN Queue Manager Loader
描述:MSN Queue Manager Loader被隨著MSN Explorer和MSN Messenger安裝。他在一些時候會佔用很多系統資源。
是否為系統進程:否
loadwc.exe
進程文件:loadwc or loadwc.exe
進程名稱:Load WebCheck
描述:Load WebCheck用以定製一些Internet Explorer的設定,添加、刪除或者更新用戶profiles設定。
是否為系統進程:否
mad.exe
進程文件:mad or mad.exe
進程名稱:System Attendant Service
描述:System Attendant Service是Microsoft Exchange Server的後台程序。它用以讀取Microsoft Exchange的DLLs文件,寫log信息和生成離線地址薄。
是否為系統進程:否
mcshield.exe
進程文件:mcshield or mcshield.exe
進程名稱:McAfee VirusScan
描述:McAfee VirusScan是一個反病毒軟體用以掃描你的文件和email中的病毒。
是否為系統進程:否
mgabg.exe
進程文件:mgabg or mgabg.exe
進程名稱:Matrox BIOS Guard
描述:Matrox BIOS守護進程。
是否為系統進程:否
mmc.exe
進程文件:mmmc or mmc.exe
進程名稱:Microsoft Management Console
描述:Microsoft Management Console管理控製程序集成了很多的系統控制選項。例如設備管理(系統、硬體)或者計算機許可權控制(Administrative管理工具)。
是否為系統進程:否
mobsync.exe
進程文件:mobsync or mobsync.exe
進程名稱:Microsoft Synchronization Manager
描述:Internet Explorer的一個組成部分,用以在後台同步離線察看頁面。
是否為系統進程:否
mplayer.exe
進程文件:mplayer or mplayer.exe
進程名稱:Windows Media Player
描述:Windows Media Player是一個用以打開音樂、聲音和視頻文件的軟體。
是否為系統進程:否
mplayer2.exe
進程文件:mplayer2 or mplayer2.exe
進程名稱:Windows Media Player
描述:Windows Media Player是一個用以打開音樂、聲音和視頻文件的軟體。
是否為系統進程:否
msaccess.exe
進程文件:msaccess or msaccess.exe
進程名稱:Microsoft Access
描述:Microsoft Access是一個資料庫軟體包括在Microsoft Office。
是否為系統進程:否
msbb.exe
進程文件:msbb or msbb.exe
進程名稱:MSBB Web3000 Spyware Application
描述:MSBB Web3000 Spyware是包括在一些adware產品中,利用注冊表隨Windows啟動。
是否為系統進程:否
msdtc.exe
進程文件:msdtc or msdtc.exe
進程名稱:Distributed Transaction Coordinator
描述:Microsoft Distributed Transaction
Coordinator控制多個伺服器的傳輸,被安裝在Microsoft Personal Web Server和Microsoft SQL Server。
是否為系統進程:否
msiexec.exe
進程文件:msiexec or msiexec.exe
進程名稱:Windows Installer Component
描述:Windows Installer的一部分。用來幫助Windows Installer package files (MSI)格式的安裝文件。
是否為系統進程:否
msimn.exe
進程文件:msimn or msimn.exe
進程名稱:Microsoft Outlook Express
描述:Microsoft Outlook Express是一個Email和新聞組客戶端包括在Microsoft Windows。
是否為系統進程:否
msmsgs.exe
進程文件:msmsgs or msmsgs.exe
進程名稱:MSN Messenger Traybar Process
描述:MSN Messenger是一個在線聊天和即時通訊客戶端。
是否為系統進程:否
msoobe.exe
進程文件:msoobe or msoobe.exe
進程名稱:Windows Proct Activation
描述:Windows XP License的Proct Activation產品激活程序。
是否為系統進程:否
mspaint.exe
進程文件:mspaint or mspaint.exe
進程名稱:Microsoft Paint
描述:Microsoft Paint畫圖是一個圖像編輯器包括在Microsoft Windows,它能夠編輯bmp圖像。
是否為系統進程:否
③ c語言編程,請求大佬們的幫忙
你在存儲信息的時候,同時要把這個鏈表的一些信息放進去,這樣的話,你下次都取出來,也可以再次把他還原成一個列表,便於你下次的一個查找,希望可以幫到你
④ C語言中怎麼用fork()創建子進程運行程序並且計算時間
1、fork一般用於處理多線程任務。比如在網路中,需要同時發送多種請求報文,則可以fork出子進程來進行發包任務,而父進程則直接去做自己的邏輯任務。
2、所謂運行時間指的是已經運行了多長時間還是從進程創建到進程退出的時間?輸入的程序是由程序啟動還是已經在運行的
,如果是已經存在的,就試著去獲取進程創建時間(WIN32
提供這樣的API),然後獲取當前時間,就可以得到進程已經運行了多久。如果是程序啟動的,那就用類似time這種函數打樁就可以了。
⑤ 操作系統課程設計
最近沒什麼寫日記,想寫,但是對於感情方面的寫多了沒意思,變得庸俗。於是,我決定來一個科學的日誌。下面就寫寫我在操作系統那門課中的一個實驗:銀行家演算法。自從學了java,在我對游戲和網路情有獨鍾的基礎上,我拋棄了c語言,因此,這個實驗我是用java來編寫的。線程我沒學,所以就簡單地寫幾個輸入,然後得出結果。
銀行家演算法大家懂嗎?我想,我們學院的都應該懂的。簡單地來講,就是假設系統有n種資源,每種資源有m個數量。又假設有k個進程。如果某進程要取得一些資源則系統首先測試是否滿足資源請求要求,如果滿足,則嘗試分配,接著就判斷分配後系統有沒有發生死鎖,有,就還原,沒有就繼續。如果某進程要求進入內存,則系統要判斷所有進程的請求資源數有沒有超過可用資源,有則不許建立,沒有就可以建立該進程。
花了幾個小時(其實大概一個小時就能搞定,不過可能困的原因,有兩個錯誤沒有看出來。我在此要提醒大家,編寫程序的格式非常重要,不然檢查錯誤是在很難。),終於寫完程序和報告。下面就貼上我的代碼吧。
/*
* 操作系統實驗:
* 《銀行家演算法》本程序參考課本的例子,資源種數為3.如果要求更多可作相應更改。
*/
/**
*
* @author Kevin 華南農業大學
*/
//銀行家演算法,此為Banker類。
import java.util.ArrayList;
import java.util.Random;
public class Banker {
static int[] available = {10,5,7}; //各個資源可用的數量。
static ArrayList processM = new ArrayList(); //線性表,裡面裝的是進程。
public static void main(String[] args){ //主函數,調試用。
Process p1 = new Process(7,5,3);
Process p2 = new Process(3,2,2);
Process p3 = new Process(9,0,2);
Process p4 = new Process(2,2,2);
Process p5 = new Process(4,3,3);
processM.add(p1);
processM.add(p2);
processM.add(p3);
processM.add(p4);
processM.add(p5);
while(!p1.isOK() || !p2.isOK() || !p3.isOK() || !p4.isOK() || !p5.isOK()){ //進程都還有沒滿足的就繼續申請。
p1 = (Process)processM.get(0);
p2 = (Process)processM.get(1);
p3 = (Process)processM.get(2);
p4 = (Process)processM.get(3);
p5 = (Process)processM.get(4);
if(!p1.isOK())
allocation(p1.request(),p1,0); //申請資源,以下同。
if(!p2.isOK())
allocation(p2.request(),p2,1);
if(!p3.isOK())
allocation(p3.request(),p3,2);
if(!p4.isOK())
allocation(p4.request(),p4,3);
if(!p5.isOK())
allocation(p5.request(),p5,4);
}
}
public static boolean allocation(int[] rq ,Process process,int n){ //進程請求分配函數,
if(process.have[0] + rq[0] > process.claim[0] || process.have[1] + rq[1] > process.claim[1] || process.have[2] + rq[2] > process.claim[2]){
System.out.println("申請失敗。"+ (n+1)); //如果請求的資源比最大需求大,則申請失敗。
return false;
}
else{
if(rq[0] > available[0] || rq[0] > available[0] || rq[0] > available[0]){
//如果要求的資源暫時不夠,則先掛起。
}
else{
process.have[0] = process.have[0] + rq[0];
process.have[1] = process.have[1] + rq[1];
process.have[2] = process.have[2] + rq[2];
available[0] = available[0]-rq[0];
available[1] = available[1]-rq[1];
available[2] = available[2]-rq[2];
processM.add(n, process);
processM.remove(n+1);
}
if(safe()){ //如果安全,則分配成功。
System.out.println("申請成功。"+"進程"+ (n+1)+"已獲得資源分別為:"+ process.have[0]+" "+process.have[1]+" "+process.have[2]);
return true;
//如果安全,那資源被該進程利用。
}
else{
process.have[0] = process.have[0] - rq[0];
process.have[1] = process.have[1] - rq[1];
process.have[2] = process.have[2] - rq[2];
available[0] = available[0]+ rq[0];
available[1] = available[1]+ rq[1];
available[2] = available[2]+ rq[2];
processM.add(n, process);
processM.remove(n+1);
System.out.println("申請失敗。" + (n+1)); //不安全,則申請失敗.
return false;
//如果不安全,則還原,並且掛起該進程。
}
}
}
public static boolean safe(){ //判斷分配後是否安全。
ArrayList rest = new ArrayList(processM);
Process test ;
int num = rest.size();
int found = num*num;
while(found > 0 && !rest.isEmpty()){
test = (Process)rest.remove(0);
if(test.claim[0] - test.have[0] <= available[0] && test.claim[1] - test.have[1] <= available[1] && test.claim[2] - test.have[2] <= available[2] ){
available[0] = available[0] + test.have[0];
available[1] = available[1] + test.have[1];
available[2] = available[2] + test.have[2];
}
else {
rest.add(test);
}
found--;
}
if(rest.isEmpty()){
return true;
}
else
return false;
}
}
class Process{ //此類為進程類,描述的是一個進程。
int[] claim =new int[3]; //這個進程需要的資源數。
int[] have = new int[3];
public Process(int n1,int n2,int n3){ //初始化進程
claim[0] = n1;
claim[1] = n2;
claim[2] = n3;
have[0] = 0;
have[1] = 0;
have[2] = 0;
}
public boolean isOK(){ //判斷這個進程得到滿足沒有。
if(have[0] == claim[0] && have[1] == claim[1] && have[2] == claim[2]){
return true;
}
else return false;
}
public int[] request(){ //這個函數隨機生成3個數,作為某個進程的請求。
Random random = new Random(); //實例化隨機對象。
int[] num = new int[3];
num[0] = random.nextInt(10);
System.out.println(num[0]);
num[1] = random.nextInt(10);
System.out.println(num[1]);
num[2] = random.nextInt(10);
System.out.println(num[2]);
return num;
}
}
⑥ 怎樣用C語言描述操作系統里的死鎖演算法謝謝。
利用銀行家演算法避免死鎖 . 銀行家演算法 設Requesti是進程Pi的請求向量,如果Requesti〔j〕=K,表示進程Pi需要K個Rj類型的資源。當Pi發出資源請求後,系統按下述步驟進行檢查:� (1) 如果Requesti〔j〕≤Need〔i,j〕,便轉向步驟2;否則認為出錯,因為它所需要的資源數已超過它所宣布的最大值。 (2) 如果Requesti〔j〕≤Available〔j〕,便轉向步驟(3);否則, 表示尚無足夠資源,Pi須等待。 (3) 系統試探著把資源分配給進程Pi,並修改下面數據結構中的數值:� Available〔j〕∶=Available〔j〕-Requesti〔j〕;� Allocation〔i,j〕∶=Allocation〔i,j〕+Requesti〔j〕;� Need〔i,j〕∶=Need〔i,j〕-Requesti〔j〕;� (4) 系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則, 將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。 (3) 系統試探著把資源分配給進程Pi,並修改下面數據結構中的數值:� Available〔j〕∶=Available〔j〕-Requesti〔j〕;� Allocation〔i,j〕∶=Allocation〔i,j〕+Requesti〔j〕;� Need〔i,j〕∶=Need〔i,j〕-Requesti〔j〕;� (4) 系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則, 將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。 (3) 系統試探著把資源分配給進程Pi,並修改下面數據結構中的數值:� Available〔j〕∶=Available〔j〕-Requesti〔j〕;� Allocation〔i,j〕∶=Allocation〔i,j〕+Requesti〔j〕;� Need〔i,j〕∶=Need〔i,j〕-Requesti〔j〕;� (4) 系統執行安全性演算法,檢查此次資源分配後,系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則, 將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。
⑦ C語言如何創建並發進程
WIN32API函數CreateProcess用來創建一個新的進程和它的主線程,這個新進程運行指定的可執行文件。
函數原型:
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_
);參數:
lpApplicationName
指向一個NULL結尾的、用來指定可執行模塊的字元串。
這個字元串可以是可執行模塊的絕對路徑,也可以是相對路徑,在後一種情況下,函數使用當前驅動器和目錄建立可執行模塊的路徑。
這個參數可以被設為NULL,在這種情況下,可執行模塊的名字必須處於 lpCommandLine 參數最前面並由空格符與後面的字元分開。
lpCommandLine
指向一個以NULL結尾的字元串,該字元串指定要執行的命令行。
這個參數可以為空,那麼函數將使用lpApplicationName參數指定的字元串當做要運行的程序的命令行。
如果lpApplicationName和lpCommandLine參數都不為空,那麼lpApplicationName參數指定將要被運行的模塊,lpCommandLine參數指定將被運行的模塊的命令行。新運行的進程可以使用GetCommandLine函數獲得整個命令行。C語言程序可以使用argc和argv參數。
lpProcessAttributes
指向一個SECURITY_ATTRIBUTES結構體,這個結構體決定是否返回的句柄可以被子進程繼承。如果lpProcessAttributes參數為空(NULL),那麼句柄不能被繼承。
在Windows NT中:SECURITY_ATTRIBUTES結構的lpSecurityDescriptor成員指定了新進程的安全描述符,如果參數為空,新進程使用默認的安全描述符。
lpThreadAttributes
同lpProcessAttribute,不過這個參數決定的是線程是否被繼承.通常置為NULL.
bInheritHandles
指示新進程是否從調用進程處繼承了句柄。
如果參數的值為真,調用進程中的每一個可繼承的打開句柄都將被子進程繼承。被繼承的句柄與原進程擁有完全相同的值和訪問許可權。
dwCreationFlags
指定附加的、用來控制優先類和進程的創建的標志。以下的創建標志可以以除下面列出的方式外的任何方式組合後指定。
⑴值:CREATE_DEFAULT_ERROR_MODE
含義:新的進程不繼承調用進程的錯誤模式。CreateProcess函數賦予新進程當前的默認錯誤模式作為替代。應用程序可以調用SetErrorMode函數設置當前的默認錯誤模式。
這個標志對於那些運行在沒有硬體錯誤環境下的多線程外殼程序是十分有用的。
對於CreateProcess函數,默認的行為是為新進程繼承調用者的錯誤模式。設置這個標志以改變默認的處理方式。
⑵值:CREATE_NEW_CONSOLE
含義:新的進程將使用一個新的控制台,而不是繼承父進程的控制台。這個標志不能與DETACHED_PROCESS標志一起使用。
⑶值:CREATE_NEW_PROCESS_GROUP
含義:新進程將是一個進程樹的根進程。進程樹中的全部進程都是根進程的子進程。新進程樹的用戶標識符與這個進程的標識符是相同的,由lpProcessInformation參數返回。進程樹經常使用GenerateConsoleCtrlEvent函數允許發送CTRL+C或CTRL+BREAK信號到一組控制台進程。
⑷值:CREATE_SEPARATE_WOW_VDM
如果被設置,新進程將會在一個私有的虛擬DOS機(VDM)中運行。另外,默認情況下所有的16位Windows應用程序都會在同一個共享的VDM中以線程的方式運行。單獨運行一個16位程序的優點是一個應用程序的崩潰只會結束這一個VDM的運行;其他那些在不同VDM中運行的程序會繼續正常的運行。同樣的,在不同VDM中運行的16位Windows應用程序擁有不同的輸入隊列,這意味著如果一個程序暫時失去響應,在獨立的VDM中的應用程序能夠繼續獲得輸入。
⑸值:CREATE_SHARED_WOW_VDM
如果WIN.INI中的Windows段的DefaultSeparateVDM選項被設置為真,這個標識使得CreateProcess函數越過這個選項並在共享的虛擬DOS機中運行新進程。
⑹值:CREATE_SUSPENDED
含義:新進程的主線程會以暫停的狀態被創建,直到調用ResumeThread函數被調用時才運行。
⑺值:CREATE_UNICODE_ENVIRONMENT
含義:如果被設置,由lpEnvironment參數指定的環境塊使用Unicode字元,如果為空,環境塊使用ANSI字元。
⑻值:DEBUG_PROCESS
含義:如果這個標志被設置,調用進程將被當做一個調試程序,並且新進程會被當做被調試的進程。系統把被調試程序發生的所有調試事件通知給調試器。
如果你使用這個標志創建進程,只有調用進程(調用CreateProcess函數的進程)可以調用WaitForDebugEvent函數。
⑼值:DEBUG_ONLY_THIS_PROCESS
含義:如果此標志沒有被設置且調用進程正在被調試,新進程將成為調試調用進程的調試器的另一個調試對象。如果調用進程沒有被調試,有關調試的行為就不會產生。
⑽值:DETACHED_PROCESS
含義:對於控制台進程,新進程沒有訪問父進程式控制制台的許可權。新進程可以通過AllocConsole函數自己創建一個新的控制台。這個標志不可以與CREATE_NEW_CONSOLE標志一起使用。
〔11〕值:CREATE_NO_WINDOW
含義:系統不為新進程創建CUI窗口,使用該標志可以創建不含窗口的CUI程序。
dwCreationFlags參數
還用來控制新進程的優先類,優先類用來決定此進程的線程調度的優先順序。如果下面的優先順序類標志都沒有被指定,那麼默認的優先類是NORMAL_PRIORITY_CLASS,除非被創建的進程是IDLE_PRIORITY_CLASS。在這種情況下子進程的默認優先類是IDLE_PRIORITY_CLASS。
可以選擇下面的標志中的一個:
優先順序:HIGH_PRIORITY_CLASS
含義:指示這個進程將執行時間臨界的任務,所以它必須被立即運行以保證正確。這個優先順序的程序優先於正常優先順序或空閑優先順序的程序。一個例子是Windows任務列表,為了保證當用戶調用時可以立刻響應,放棄了對系統負荷的考慮。確保在使用高優先順序時應該足夠謹慎,因為一個高優先順序的CPU關聯應用程序可以佔用幾乎全部的CPU可用時間。
優先順序:IDLE_PRIORITY_CLASS
含義:指示這個進程的線程只有在系統空閑時才會運行並且可以被任何高優先順序的任務打斷。例如屏幕保護程序。空閑優先順序會被子進程繼承。
優先順序:NORMAL_PRIORITY_CLASS
含義:指示這個進程沒有特殊的任務調度要求。
優先順序:REALTIME_PRIORITY_CLASS
含義:指示這個進程擁有可用的最高優先順序。一個擁有實時優先順序的進程的線程可以打斷所有其他進程線程的執行,包括正在執行重要任務的系統進程。例如,一個執行時間稍長一點的實時進程可能導致磁碟緩存不足或滑鼠反映遲鈍。
lpEnvironment
指向一個新進程的環境塊。如果此參數為空,新進程使用調用進程的環境。
一個環境塊存在於一個由以NULL結尾的字元串組成的塊中,這個塊也是以NULL結尾的。每個字元串都是name=value的形式。
因為相等標志被當做分隔符,所以它不能被環境變數當做變數名。
與其使用應用程序提供的環境塊,不如直接把這個參數設為空,系統驅動器上的當前目錄信息不會被自動傳遞給新創建的進程。對於這個情況的探討和如何處理,請參見注釋一節。
環境塊可以包含Unicode或ANSI字元。如果lpEnvironment指向的環境塊包含Unicode字元,那麼dwCreationFlags欄位的CREATE_UNICODE_ENⅥRONMENT標志將被設置。如果塊包含ANSI字元,該標志將被清空。
請注意一個ANSI環境塊是由兩個零位元組結束的:一個是字元串的結尾,另一個用來結束這個快。一個Unicode環境塊是由四個零位元組結束的:兩個代表字元串結束,另兩個用來結束塊。
lpCurrentDirectory
指向一個以NULL結尾的字元串,這個字元串用來指定子進程的工作路徑。這個字元串必須是一個包含驅動器名的絕對路徑。如果這個參數為空,新進程將使用與調用進程相同的驅動器和目錄。這個選項是一個需要啟動應用程序並指定它們的驅動器和工作目錄的外殼程序的主要條件。
lpStartupInfo
指向一個用於決定新進程的主窗體如何顯示的STARTUPINFO結構體。
lpProcessInformation
指向一個用來接收新進程的識別信息的PROCESS_INFORMATION結構體。返回值:
如果函數執行成功,返回非零值。
如果函數執行失敗,返回零,可以使用GetLastError函數獲得錯誤的附加信息。進程的查看、創建和撤銷(C語言)
常式:
#include<stdio.h>
#include<windows.h>
#include<tlhelp32.h>
intshowallproc()
{
PROCESSENTRY32pe32;//用來存儲進程信息的結構體
pe32.dwSize=sizeof(pe32);
HANDLEhProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//獲取進程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("調用失敗 ");
return1;
}
BOOLbProc=Process32First(hProcessSnap,&pe32);
while(bProc)
{
printf("%5d%s ",pe32.th32ProcessID,pe32.szExeFile);//輸出進程ID和進程名
bProc=Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return0;
}
intcreatproc()
{
charstr[256]={0};
printf("請輸入可執行文件路徑(*.exe): ");
scanf("%s",str);
STARTUPINFOsi={0};
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOW;
PROCESS_INFORMATIONpi;
if(!CreateProcess(NULL,str,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
printf("創建失敗 ");
return-1;
}
else
{
printf("創建成功 ");
printf("進程號:%d ",pi.dwProcessId);
}
return0;
}
intstopproc()
{
DWORDProcessID;
printf("請輸入想要終止的進程ID ");
scanf("%d",&ProcessID);
HANDLEhProcess=OpenProcess(PROCESS_TERMINATE,FALSE,ProcessID);//打開對應進程句柄
if(hProcess==NULL)
{
printf("失敗 ");
return-1;
}
if(!TerminateProcess(hProcess,0))//關閉進程
{
printf("關閉失敗 ");
}
else
{
printf("關閉成功 ");
}
CloseHandle(hProcess);
return0;
}
intmain()
{
intn=0;
while(n!=4)
{
printf("1查看進程 ");
printf("2創建進程 ");
printf("3終止進程 ");
printf("4結束 ");
printf("請選擇:");
scanf("%d",&n);
switch(n)
{
case1:
showallproc();
break;
case2:
creatproc();
break;
case3:
stopproc();
break;
case4:
break;
default:
printf("輸入有誤! ");
break;
}
}
return0;
}
⑧ C語言程序。。請求幫忙注釋下
access(user_id,inode,mode)的作用就是判斷判user_id的用戶對inode節點對應的文件是否擁有mode許可權,如果擁有mode許可權返回1,如果不擁有mode許可權返回0.
以下代碼中inode->di_mode是inode的文件許可權屬性值,通過位與(&)判斷該屬性值是否擁有包含相應的許可權屬性,如inode->di_mode&ODIREAD,如果值不為零,則inode的文件訪問許可權屬性值包含ODIREAD許可權,也就是其它用戶對inode的文件擁有READ許可權。
只要你明白了Linux下或Unix下的文件/目錄訪問許可權關系,下面的代碼就很簡單了。
case READ: //mode == READ
/*如果inode的其它用戶擁有READ許可權(即inode->di_mode&ODIREAD 不等於0),那麼user_id當然也擁有inode對應的文件的READ許可權了*/
if (inode->di_mode&ODIREAD) return 1;
/*如果inode許可權包含GDIREAD(inode->di_mode&GDIREAD不等於0,也就是文件組用戶擁有對該文件的READ許可權),user_id又屬於相應的用戶組(user[k].u_gid==inode->di_gid)) ),當然也就擁有READ許可權了*/
if ((inode->di_mode&GDIREAD)&&(user[k].u_gid==inode->di_gid)) return 1;
/*如果inode屬主擁有READ許可權(也就是文件組用戶擁有對該文件的READ許可權),而user_id就是inode的用戶屬主(即user[k].u_uid==inode->di_uid),那user_id當然就有READ許可權了*/
if ((inode->di_mode&UDIREAD)&&(user[k].u_uid==inode->di_uid)) return 1;
return 0;
...
其它類似
⑨ 操作系統題目,好的追加高分,感謝大蝦
http://tieba..com/f?kz=588380474
http://blog.163.com/mqt_signature/blog/static/1049595722009429104343122/
或者看看這個,可是你需要的
《操作系統--銀行家演算法》
課程設計報告
1 課程設計目的 …………………………………………………… 1
2 課程設計的要求 ………………………………………………… 1
3 課程設計題目描述 ……………………………………………… 2
4 課程設計之銀行家演算法原理 …………………………………… 2
5 源程序結構分析及代碼實現 …………………………………… 4
6 課程設計總結 …………………………………………………… 25
一、課程設計的目的
操作系統是計算機系統的核心系統軟體,它負責控制和管理整個系統的資源並組織用戶協調使用這些資源,使計算機高效的工作。《操作系統課程設計》是《操作系統》理論課的必要補充,是復習和檢驗所學課程的重要手段,本課程設計的目的是綜合應用學生所學知識,通過實驗環節,加深學生對操作系統基本原理和工作過程的理解,提高學生獨立分析問題、解決問題的能力,增強學生的動手能力。
二、課程設計的要求
1.分析設計內容,給出解決方案(要說明設計實現的原理,採用的數據結構)。
2.畫出程序的基本結構框圖和流程圖。
3.對程序的每一部分要有詳細的設計分析說明。
4.源代碼格式要規范。
5.設計合適的測試用例,對得到的運行結果要有分析。
6.設計中遇到的問題,設計的心得體會。
7.按期提交完整的程序代碼、可執行程序和課程設計報告。
三、課程設計題目描述
銀行家演算法是一種最有代表性的避免死鎖的演算法。
要解釋銀行家演算法,必須先解釋操作系統安全狀態和不安全狀態。
安全狀態:如果存在一個由系統中所有進程構成的安全序列P1,…,Pn,則系統處於安全狀態。安全狀態一定是沒有死鎖發生。
不安全狀態:不存在一個安全序列。不安全狀態不一定導致死鎖。
那麼什麼是安全序列呢?
安全序列:一個進程序列{P1,…,Pn}是安全的,如果對於每一個進程Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩餘資源量與所有進程Pj (j < i )當前佔有資源量之和。
銀行家演算法:
我們可以把操作系統看作是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。操作系統按照銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程已佔用的資源數與本次申請的資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統現存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。
四、課程設計之銀行家演算法原理
1.銀行家演算法的思路
先對用戶提出的請求進行合法性檢查,即檢查請求的是不大於需要的,是否不大於可利用的。若請求合法,則進行試分配。最後對試分配後的狀態調用安全性檢查演算法進行安全性檢查。若安全,則分配,否則,不分配,恢復原來狀態,拒絕申請。
2.銀行家演算法中用到的主要數據結構
可利用資源向量 int Available[j] j為資源的種類。
最大需求矩陣 int Max[i][j] i為進程的數量。
分配矩陣 int Allocation[i][j]
需求矩陣 int need[i][j]= Max[i][j]- Allocation[i][j]
申請各類資源數量 int Request i[j] i進程申請j資源的數量
工作向量 int Work[x] int Finish[y]
3.銀行家演算法bank()
進程i發出請求申請k個j資源,Request i[j]=k
(1)檢查申請量是否不大於需求量:Request i[j]<=need[i,j],若條件不符重新輸入,不允許申請大於需求量。
(2)檢查申請量是否小於系統中的可利用資源數量:Request i[j]<=available[i,j],若條件不符就申請失敗,阻塞該進程,用goto語句跳轉到重新申請資源。
(3)若以上兩個條件都滿足,則系統試探著將資源分配給申請的進程,並修改下面數據結構中的數值:
Available[i,j]= Available[i,j]- Request i[j];
Allocation[i][j]= Allocation[i][j]+ Request i[j];
need[i][j]= need[i][j]- Request i[j];
(4)試分配後,執行安全性檢查,調用safe()函數檢查此次資源分配後系統是否處於安全狀態。若安全,才正式將資源分配給進程;否則本次試探分配作廢,恢復原來的資源分配狀態,讓該進程等待。
(5)用do{…}while 循環語句實現輸入字元y/n判斷是否繼續進行資源申請。
4.安全性檢查演算法(safe()函數)
(1)設置兩個向量:
工作向量Work,它表示系統可提供給進程繼續運行所需的各類資源數目,在執行安全性演算法開始時,Work= Available。
Finish,它表示系統是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]=0;當有足夠的資源分配給進程時,再令Finish[i]=1。
(2)在進程中查找符合以下條件的進程:
條件1:Finish[i]=0;
條件2:need[i][j]<=Work[j]
若找到,則執行步驟(3)否則,執行步驟(4)
(3)當進程獲得資源後,可順利執行,直至完成,並釋放出分配給它的資源,故應執行:
Work[j]= Work[j]+ Allocation[i][j];
Finish[i]=1;
goto step 2;
(4)如果所有的Finish[i]=1都滿足,則表示系統處於安全狀態,否則,處於不安全狀態。
五、源程序結構分析及代碼實現
1.程序結構
程序共有以下五個部分:
(1).初始化chushihua():用於程序開始進行初始化輸入數據:進程數量、資源種類、各種資源可利用數量、各進程的各種資源已分配數量、各進程對各類資源最大需求數等。
(2).當前安全性檢查safe():用於判斷當前狀態安全性,根據不同地方的調用提示處理不同。
(3).銀行家演算法bank():進行銀行家演算法模擬實現的模塊,調用其他各個模塊進行銀行家演算法模擬過程。
(4).顯示當前狀態show():顯示當前資源分配詳細情況,包括:各種資源的總數量(all)、系統目前各種資源可用的數量、各進程已經得到的資源數量、各進程還需要的資源量。
(5).主程序main()
逐個調用初始化、顯示狀態、安全性檢查、銀行家演算法函數,使程序有序的進行。
2.數據結構
程序使用的全局變數:
const int x=10,y=10; //定義常量
int Available[x]; //各種資源可利用的數量
int Allocation[y][y]; //各進程當前已分配的資源數量
int Max[y][y]; //各進程對各類資源的最大需求數
int Need[y][y]; //還需求矩陣
int Request[x]; //申請各類資源的數量
int Work[x]; //工作向量,表系統可提供給進程運行所需各類資源數量
int Finish[y]; //表系統是否有足夠的資源分配給進程,0為否,1為是
int p[y]; //存儲安全序列
int i,j; //全局變數,主要用於循環語句中
int n,m; //n為進程的數量,m為資源種類數
int l=0,counter=0;
3.函數聲明
void chushihua(); //系統初始化函數
void safe(); //安全性演算法函數
void bank(); //銀行家演算法函數
void show (); //輸出當前資源分配情況
4.主函數main()
int main()
{
cout<<…… //顯示程序開始提示信息
chushihua(); //初始化函數調用
cout<<endl<<endl;
showdata(); //輸出初始化後的狀態
//===判斷當前狀態的安全性===
safe(); //安全性演算法函數調用
if (l<n){
cout<<"\n當前狀態不安全,無法申請,程序退出!!!!!"<<endl;
cout<<endl;
system("pause");
sign(); //調用簽名函數
return 0; // break;
}
else{
int i; //局部變數
l=0;
cout<<"\n安全的狀態!!!"<<endl;
cout<<"安全序列為: ";
cout<<endl<<"進程"<<"("<<p[0]<<")"; //輸出安全序列,考慮顯示格式,先輸出第一個
for (i=1; i<n; i++){
cout<<"==>>"<<"進程"<<"("<<p[i]<<")";
}
for (i=0; i<n; i++) Finish[i]=0; //所有進程置為未分配狀態
cout<<endl<<endl;
}
bank(); //銀行家演算法函數調用
return 0;
}
5. 操作系統銀行家演算法流程圖:
2.源程序代碼:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定義全局變數
const int x=10,y=10; //常量,便於修改
int Available[x]; //各資源可利用的數量
int Allocation[y][y]; //各進程當前已分配的資源數量
int Max[y][y]; //各進程對各類資源的最大需求數
int Need[y][y]; //尚需多少資源
int Request[x]; //申請多少資源
int Work[x]; //工作向量,表示系統可提供給進程繼續運行所需的各類資源數量
int Finish[y]; //表示系統是否有足夠的資源分配給進程,1為是
int p[y]; //存儲安全序列
int i,j; //i表示進程,j表示資源
int n,m; //n為進程i的數量,m為資源j種類數
int l=0; //l用來記錄有幾個進程是Finish[i]=1的,當l=n是說明系統狀態是安全的
int counter=0;
//函數聲明
void chushihua(); //初始化函數
void safe(); //安全性演算法
void show(); //函數show,輸出當前狀態
void bank(); //銀行家演算法
void jieshu(); //結束函數
void chushihua()
{
cout<<"輸入進程的數量: ";//從此開始輸入有關數據
cin>>n;
cout<<"輸入資源種類數: ";
cin>>m;
cout<<endl<<"輸入各種資源當前可用的數量( "<<m<<" 種): "<<endl;
for (j=0; j<m; j++)
{
cout<<"輸入資源 "<<j<<" 可利用的數量Available["<<j<<"]: ";
cin>>Available[j]; //輸入數字的過程...
Work[j]=Available[j]; //初始化Work[j],它的初始值就是當前可用的資源數
}
cout<<endl<<"輸入各進程當前已分配的資源數量Allocation["<<n<<"]["<<m<<"]: "<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cout<<" 輸入進程 "<<i<<" 當前已分配的資源 "<<j<<" 數量: ";
cin>>Allocation[i][j];
}
cout<<endl;
Finish[i]=0;//初始化Finish[i]
}
cout<<endl<<"輸入各進程對各類資源的最大需求Max["<<n<<"]["<<m<<"]: "<<endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
cout<<" 輸入進程 "<<i<<" 對資源 "<<j<<" 的最大需求數: ";
cin>>Max[i][j];
if(Max[i][j]>=Allocation[i][j]) //若最大需求大於已分配,則計算需求量
Need[i][j] = Max[i][j]-Allocation[i][j];
else
Need[i][j]=0;//Max小於已分配的時候,此類資源已足夠不需再申請
}
cout<<endl;
}
cout<<endl<<"初始化完成"<<endl;
}
//安全性演算法函數
void safe()
{
l=0;
for (i=0; i<n;i++)
{ //i++
if (Finish[i]==0)
{ //逐個查找Finish[i]==0的進程 條件一
counter=0; //記數器
for (j=0; j<m; j++)
{
if (Work[j]>=Need[i][j]) counter=counter+1;//可用大於需求,記數
}
if(counter==m) //i進程的每類資源都符合Work[j]>=Need[i][j] 條件二
{
p[l]=i; //存儲安全序列
Finish[i]=1; //i進程標志為可分配
for (j=0; j<m;j++)
Work[j]=Work[j]+Allocation[i][j]; //釋放資源
l=l+1; //記數,現在有L個進程是安全的,當L=N時說明滿足安全序列
i= -1; //從第一個進程開始繼續尋找滿足條件一二的進程
}
}
}
}
//顯示當前狀態函數
void show() //函數show,輸出當前資源分配情況
{
int i,j; //局部變數
int All[y]; //各種資源的總數量
int L1; //局部變數L1
cout<<"當前的狀態為:"<<endl;
cout<<"各種資源的總數量:"<<endl;
for (j=0;j<m;j++)
{
cout<<" 資源"<<j<<": ";
All[j]=Available[j]; //總數量=可用的+已分配的
for (i=0;i<n;i++) All[j]+=Allocation[i][j];
cout<<All[j]<<" ";
}
cout<<endl<<"當前各種資源可用的量為(available):"<<endl;
for (j=0;j<m;j++)
cout<<" 資源"<<j<<": "<<Available[j]<<" ";
cout<<endl<<"各進程已經得到的資源量(allocation): "<<endl;
for(i=0;i<=m;i++)
{
for (j=i;j<m;j++) cout<<" 資源"<<j;
cout<<endl;
for(L1=0;L1<n;L1++)
{
cout<<"進程"<<L1<<":";
for (j=i;j<m;j++) cout<<Allocation[L1][j]<<" ";
cout<<endl;
}
}
cout<<endl<<"各進程還需要的資源量(need):"<<endl;
for(i=0;i<=m;i++)
{
for (j=i;j<m;j++) cout<<" 資源"<<j;
cout<<endl;
for(L1=0;L1<n;L1++)
{
cout<<"進程"<<L1<<":";
for (j=i;j<m;j++) cout<<Need[L1][j]<<" ";
cout<<endl;
}
}
}
//銀行家演算法函數
void bank()
{
cout<<endl<<"進程申請分配資源:"<<endl;
int k=0; //用於輸入進程編號
bool r=false; // 初值為假,輸入Y繼續申請則置為真
do{//輸入請求
cout<<"輸入申請資源的進程(0-"<<n-1<<"): ";
cin>>k;
cout<<endl;
while(k>n-1) //輸入錯誤處理
{
cout<<endl<<"輸入錯誤,重新輸入:"<<endl;
cout<<endl<<"輸入申請資源的進程(0--"<<n-1<<"): ";
cin>>k;
cout<<endl;
}
cout<<endl<<"輸入該進程申請各類資源的數量: "<<endl;
for (j=0; j<m; j++)
{
do{ //do……while 循環判斷申請輸入的情況
cout<<"進程 "<<k<<" 申請資源["<<j<<"]的數量:";
cin>>Request[j];
cout<<endl;
if(Request[j]>Need[k][j]){ //申請大於需求量時出錯,提示重新輸入(貸款數目不允許超過需求數目)
cout<<"申請大於需要量!"<<endl;
cout<<"申請的資源"<<j<<"的數量為"<<Request[j]<<",大於進程"<<k<<"對該資源需求量"<<Need[k][j]<<"。"<<endl;
cout<<"重新輸入!"<<endl;
}
else //先判斷是否申請大於需求量,再判斷是否申請大於可利用量
if(Request[j]>Available[j]){ //申請大於可利用量, 應該阻塞等待?…… ???
cout<<"\n沒有那麼多資源,目前可利用資源"<<j<<"數量為"<<Available[j]<<",本次申請不成功,進程等待!"<<endl;
Finish[k]=0; //該進程等待
goto ppp; //goto語句 跳轉,結束本次申請
}
}while(Request[j]>Need[k][j]); //Request[j]>Available[j]||
}
//改變Avilable、Allocation、Need的值
for (j=0; j<m; j++) {
Available[j] = Available[j]-Request[j];
Allocation[k][j] = Allocation[k][j]+Request[j];
Need[k][j] = Need[k][j]-Request[j];
Work[j] = Available[j];
}
//判斷當前狀態的安全性
safe(); //調用安全性演算法函數
if (l<n)
{
l=0;
cout<<"\n試分配後,狀態不安全,所以不予分配!恢復原狀態"<<endl;
//恢復數據
for (j=0; j<m; j++)
{
Available[j] = Available[j]+Request[j];
Allocation[k][j] = Allocation[k][j]-Request[j];
Need[k][j] = Need[k][j]+Request[j];
Work[j] = Available[j];
}
for (i=0; i<n; i++)
Finish[i]=0; //進程置為未分配狀態
}
else
{
l=0;
cout<<"\n申請資源成功!!!"<<endl;
for(j=0;j<m;j++)
{
if(Need[k][j]==0);
else { //有一種資源還沒全部申請到,則該進程不可執行,不能釋放擁有的資源
l=1; //置l為1,作為判斷標志
break;
}
}
if(l!=1){ //進程可以執行,則釋放該進程的所有資源
for (j=0;j<m;j++){
Available[j]=Available[j]+Allocation[k][j];
Allocation[k][j]=0;
}
cout<<"該進程已得到所有需求資源,執行後將釋放其所有擁有資源!"<<endl;
}
l=0; //歸零
cout<<"\n安全的狀態!"<<endl;
cout<<"安全序列為: ";
cout<<endl<<"進程"<<"("<<p[0]<<")"; //輸出安全序列,考慮顯示格式,先輸出第一個
Finish[0]=0;
for (i=1; i<n; i++){
cout<<"==>>"<<"進程"<<"("<<p[i]<<")";
Finish[i]=0; //所有進程置為未分配狀態
}
cout<<endl<<endl;
}
show(); //顯示當前狀態
ppp: //申請大於可利用量, 應該阻塞等待,結束本次資源申請,GOTO 語句跳轉至此
cout<<endl<<"是否繼續申請資源(y/n) ?";
char* b=new char; //輸入y/n,判斷是否繼續申請 <<endl
cin>>b;
cout<<endl;
cout<<"-------------------------------------------"<<endl<<endl;
cout<<endl;
if(*b=='y'||*b=='Y')
r=true;
else{
r=false; //輸入非 Y 則令 R =false
jieshu(); //調用結束函數
}
} while (r==true);
}
//結束函數
void jieshu()
{
cout<<endl<<endl;
cout<<"\t\t 演示計算完畢"<<endl;
cout<<endl<<endl;
}
//主函數
int main()
{
cout<<endl<<endl<<"\t\t\t\t模擬銀行家演算法"<<endl<<endl;
chushihua(); //初始化函數調用
cout<<endl;
show(); //輸出當前狀態
safe(); //判斷當前狀態的安全性
if (l<n) //l在safe中是用來記錄安全的進程的個數的
{
cout<<"\n當前狀態不安全,拒絕申請!"<<endl;
cout<<endl;
return 0;
}
else
{
int i; //局部變數
l=0;
cout<<endl<<"\n當前的狀態是安全的!安全序列為:"<<endl;
cout<<"進程"<<"("<<p[0]<<")"; //輸出安全序列
for (i=1; i<n; i++) cout<<"->>"<<"進程"<<"("<<p[i]<<")";
for (i=0; i<n; i++) Finish[i]=0; //所有進程置為未分配狀態
cout<<endl;
}
bank(); //調用銀行家演算法函數
cout<<"\t\t 演示計算完畢"<<endl;
return 0;
}
運行結果:
1.初始化結果
2.檢測系統資源分配是否安全結果:
六、課程設計的總結
操作系統的基本特徵是並發與共享。系統允許多個進程並發執行,並且共享系統的軟、硬體資源。為了最大限度的利用計算機系統的資源,操作系統應採用動態分配的策略,但是這樣就容易因資源不足,分配不當而引起「死鎖」。而我本次課程設計就是得用銀行家演算法來避免「死鎖」。銀行家演算法就是一個分配資源的過程,使分配的序列不會產生死鎖。此演算法的中心思想是:按該法分配資源時,每次分配後總存在著一個進程,如果讓它單獨運行下去,必然可以獲得它所需要的全部資源,也就是說,它能結束,而它結束後可以歸還這類資源以滿足其他申請者的需要。
本次程序就是按照上面的思路展開的。但是因為時間上的倉促,本課程設計的存在著以下不足:一、不能實現並發操作,即當總資源同時滿足幾個進程所需要的資源數時,這些進程不能同時進行,只能一一按進程順序執行。二、掃描進程順序單一,只能按進程到來的順序(即編號)來掃描,從而產生的安全順序只能是在這個順序的基礎上產生的,而其實安全順序是有多個的。三、對進程數和資源數進行的數量進行了限制,都只能最多有十個。四、運行程序後,界面較差,進程數,所需要資源數,已分配資源數,能用資源數,不能一目瞭然。
這次課程設計時間上雖說倉促點,但是我依然學到了很多的實用性知識。除了更深的了解這個演算法,而且對C語言進行了復習,而且其過程中有很多的知識點都不記得了,所以在此感謝在此過程中幫助過我的老師和同學。
最後的感悟就是:只要你親自動手,你就能學到知識。
再次感謝幫助過我的老師和同學!