操作系統(tǒng)課程設計報告操作系統(tǒng)模擬_第1頁
操作系統(tǒng)課程設計報告操作系統(tǒng)模擬_第2頁
操作系統(tǒng)課程設計報告操作系統(tǒng)模擬_第3頁
操作系統(tǒng)課程設計報告操作系統(tǒng)模擬_第4頁
操作系統(tǒng)課程設計報告操作系統(tǒng)模擬_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

操作系統(tǒng)

課程設計報告學院:信息科學與工程學院專業(yè)班級:學號:計算機科學與技術09**專業(yè)班級:學號:計算機科學與技術09**班岸」09090928**姓名:***指導教師:宋虹2012年6月目錄TOC\o"1-5"\h\z\o"CurrentDocument"一、 概述 1\o"CurrentDocument"二、 課程設計要求 1\o"CurrentDocument"三、 設計的基本原理和概念 1\o"CurrentDocument"四、 詳細設計:使用主要控件、函數(shù) 6\o"CurrentDocument"線程1函數(shù)(獲得兩個隨機數(shù))…… 6\o"CurrentDocument"線程2函數(shù)(計算它們的和) 7線程3函數(shù)(輸出結果) 8\o"CurrentDocument"信號量控制 8\o"CurrentDocument"登錄以及用戶切換 8\o"CurrentDocument"新增用戶函數(shù) 10\o"CurrentDocument"五、 運行及使用 11\o"CurrentDocument"六、 實驗總結 14參考文獻 15_、概述操作系統(tǒng)課程主要講述的內容是多道操作系統(tǒng)的原理與技術,與其它計算機原理、編譯原理、匯編語言、計算機網絡、程序設計等專業(yè)課程關系十分密切。本課程設計的目的綜合應用學生所學知識,建立系統(tǒng)和完整的計算機系統(tǒng)概念,理解和鞏固操作系統(tǒng)基本理論、原理和方法,掌握操作系統(tǒng)開發(fā)的基本技能。二、 課程設計要求采用VC、VB、java或C等編程語言,模擬開發(fā)一個多用戶多任務的類操作系統(tǒng)軟件。要求如下:模擬進程調度算法,模擬各種進程調度算法,并能管理各種進程調度算法的演示過程。模擬各種內存分配算法及回收過程,并能動態(tài)演示。結合進程調度算法,能為進程模擬分配內存,并設計一個跟蹤該內存模擬分配的進程或線程,記錄內存分配的結果;模擬多用戶登錄管理過程,能允許多個用戶登錄,為每個用戶建立進程或線程,并進行進程管理;能模擬文件系統(tǒng)管理,進程可以對文件系統(tǒng)(包括文件和目錄)進行讀、寫、創(chuàng)建、刪除、打開、關閉等操作;模擬磁盤管理過程,結合文件系統(tǒng)管理,顯示磁盤管理的結構和文件在磁盤上的分布情況。能模擬進程通信管理,用戶之間可以相互通信交流;最好能采用類似于Windows的窗口界面。三、 設計的基本原理和概念我所做的部分是模擬多用戶登錄管理過程,能允許多個用戶登錄,為每個用戶建立進程或線程,并進行進程管理。還有進程間的通信。進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享內存區(qū)。但是,系統(tǒng)空間卻是“公共場所”,所以內核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個進程當然也可以通過磁盤上的普通文件交換信息,或者通過“注冊表”或其它數(shù)據庫中的某些表項和記錄交換信息。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”。進程間通信目的:a) 數(shù)據傳輸:一個進程需要將它的數(shù)據發(fā)送給另一個進程,發(fā)送的數(shù)據量在一個字節(jié)到幾兆字節(jié)之間。b) 共享數(shù)據:多個進程想要操作共享數(shù)據,一個進程對共享數(shù)據的修改,別的進程應該立刻看到。c) 通知事件:一個進程需要向另一個或一組進程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進程終止時要通知父進程)。d) 資源共享:多個進程之間共享同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。e)進程控制:有些進程希望完全控制另一個進程的執(zhí)行(如Debug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,并能夠及時知道它的狀態(tài)改變。進程可以對任何信號指定另一個動作或重載缺省動作,指定的新動作可以是忽略信號。進程也可以暫時地阻塞一個信號。因此進程可以選擇對某種信號所采取的特定操作,這些操作包括:(a) 忽略信號:進程可忽略產生的信號,但SIGKILL和SIGSTOP信號不能被忽略,必須處理(由進程自己或由內核處理)。進程可以忽略掉系統(tǒng)產生的大多數(shù)信號。(b) 阻塞信號:進程可選擇阻塞某些信號,即先將到來的某些信號記錄下來,等到以后(解除阻塞后)再處理它。(c) 由進程處理該信號:進程本身可在系統(tǒng)中注冊處理信號的處理程序地址,當發(fā)出該信號時,由注冊的處理程序處理信號。(d) 由內核進行缺省處理:信號由內核的缺省處理程序處理,執(zhí)行該信號的缺省動作。例如,進程接收到SIGFPE(浮點異常)的缺省動作是產生core并退出。大多數(shù)情況下,信號由內核處理。對信號的任何處理,包括終止進程,都必須由接收到信號的進程來執(zhí)行。而進程要執(zhí)行信號處理程序,就必須等到它真正運行時。因此,對信號的處理可能需要延遲一段時間。信號沒有固有的優(yōu)先級。如果為一個進程同時產生了兩個信號,這兩個信號會以任意順序出現(xiàn)在進程中并會按任意順序被處理。另外,也沒有機制用于區(qū)分同一種類的多個信號。如果進程在處理某個信號之前,又有相同的信號發(fā)出,則進程只能接收到一個信號。進程間通信主要包括管道,系統(tǒng)IPC(包括消息隊列,信號量,共享存儲),SOCKETo操作系統(tǒng)通過信號來通知進程系統(tǒng)中發(fā)生了某種預先規(guī)定好的事件(一組事件中的一個),它也是用戶進程之間通信和同步的一種原始機制。一個鍵盤中斷或者一個錯誤條件(比如進程試圖訪問它的虛擬內存中不存在的位置等)都有可能產生一個信號。Shell也使用信號向它的子進程發(fā)送作業(yè)控制信號。信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數(shù)目.信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統(tǒng)中的PV操作相同。它指出了同時訪問共享資源的線程最大數(shù)目。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數(shù)目。信號的PV操作。信號量S是一個整數(shù),S大于等于零時代表可供并發(fā)進程使用的資源實體數(shù),但S小于零時則表示正在等待使用共享資源的進程數(shù)。P操作申請資源:(1) S減1;(2) 若S減1后仍大于等于零,則進程繼續(xù)執(zhí)行;(3) 若S減1后小于零,則該進程被阻塞后進入與該信號相對應的隊列中,然后轉入進程調度。V操作釋放資源:(1) S加1;(2) 若相加結果大于零,則進程繼續(xù)執(zhí)行;

(3)若相加結果小于等于零,則從該信號的等待隊列中喚醒一個等待進程,然后再返回原進程繼續(xù)執(zhí)行或轉入進程調度。本次試驗,我采用的線程模擬進程間的通信.線程主要有以下幾個操作BlockedPool融StRunningiUgk1/L偵己itPooiCPU謁度TBlockedPool融StRunningiUgk1/L偵己itPooiCPU謁度Tbilkedi^venlR.:jnricibletyhdjFdnizEdThread壕行機制(a)線程的啟動創(chuàng)建一個線程,首先要從類CwinThread產生一個派生類,同時必須使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來聲明和實現(xiàn)這個CwinThread派生類。第二步是根據需要重載該派生類的一些成員函數(shù)如:ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等函數(shù)。最后調用AfxBeginThread()函數(shù)的一個版本:CWinThread*AfxBeginThread(CRuntimeClass*pThreadClass,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL)啟動該用戶界面線程,其中第一個參數(shù)為指向定義的用戶界面線程類指針變量,第二個參數(shù)為線程的優(yōu)先級,第三個參數(shù)為線程所對應的堆棧大小,第四個參數(shù)為線程創(chuàng)建時的附加標志,缺省為正常狀態(tài),如為CREATE_SUSPENDED則線程啟動后為掛起狀態(tài)。對于工作線程來說,啟動一個線程,首先需要編寫一個希望與應用程序的其余部分并行運行的函數(shù)如Fun1(),接著定義一個指向CwinThread對象的指針變量*pThread,調用AfxBeginThread(Fun1,param,priority)函數(shù),返回值賦給pThread變量的同時一并啟動該線程來執(zhí)行上面的Fun1()函數(shù),其中Fun1是線程要運行的函數(shù)的名字,也既是上面所說的控制函數(shù)的名字,param是準備傳送給線程函數(shù)Fun1的任意32位值,priority則是定義該線程的優(yōu)先級別,它是預定義的常數(shù),讀者可參考MSDN。(b) 線程的懸掛和恢復CWinThread類中包含了應用程序懸掛和恢復它所創(chuàng)建的線程的函數(shù),其中SuspendThread()用來懸掛線程,暫停線程的執(zhí)行;ResumeThread()用來恢復線程的執(zhí)行。如果你對一個線程連續(xù)若十次執(zhí)行SuspendThread(),則需要連續(xù)執(zhí)行相應次的ResumeThread()來恢復線程的運行。(c) 線程的懸掛和恢復

CWinThread類中包含了應用程序懸掛和恢復它所創(chuàng)建的線程的函數(shù),其中SuspendThread()用來懸掛線程,暫停線程的執(zhí)行;ResumeThread()用來恢復線程的執(zhí)行。如果你對一個線程連續(xù)若十次執(zhí)行SuspendThread(),則需要連續(xù)執(zhí)行相應次的ResumeThread()來恢復線程的運行。(d)結束線程終止線程有三種途徑,線程可以在自身內部調用AfxEndThread()來終止自身的運行;可以在線程的外部調用BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode)來強行終止一個線程的運行,然后調用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變全局變量,使線程的執(zhí)行函數(shù)返回,則該線程終止。下面是第三種方式的代碼:CtestViewmessagehandlersSettoTruetoendthreadBoolbend=FALSE;//CtestViewmessagehandlersSettoTruetoendthreadBoolbend=FALSE;//定義的全局變量,用于控制線程的運行;TheThreadFunction;UINTThreadFunction(LPVOIDpParam)//線程函數(shù){while(!bend){Beep(100,100);Sleep(1000);}return0;}CwinThread*pThread;HWNDhWnd;VoidCtestView::OninitialUpdate(){hWnd=GetSafeHwnd();pThread=AfxBeginThread(ThradFunction,hWnd);//啟動線程pThread->m_bAutoDelete=FALSE;//線程為Cview::OnInitialUpdate();}VoidCtestView::OnDestroy(){bend=TRUE;//改變變量,線程結束WaitForSingleObject(pThread->m_hThread,INFINITE);//等待線程結束deletepThread;//刪除線程Cview::OnDestroy();共享內存式的通信方式通常由一個進程創(chuàng)建,其余進程對這塊內存區(qū)進行讀寫。得到共享內存有兩種方式:映射/dev/mem設備和內存映像文件。前一種方式不給系統(tǒng)帶來額外的開銷,但在現(xiàn)實中并不常用,因為它控制存取的是實際的物理內存;常用的方式是通過shmXXX函數(shù)族來實現(xiàn)共享內存:intshmget(key_tkey,intsize,intflag);/*獲得一個共享存儲標識符*/該函數(shù)使得系統(tǒng)分配size大小的內存用作共享內存;void*shmat(intshmid,void*addr,intflag);/*將共享內存連接到自身地址空間中*/如果一個進程通過fork創(chuàng)建了子進程,則子進程繼承父進程的共享內存,既而可以直接對共享內存使用,不過子進程可以自身脫離共享內存。shmid為shmget函數(shù)返回的共享存儲標識符,addr和flag參數(shù)決定了以什么方式來確定連接的地址,函數(shù)的返回值即是該進程數(shù)據段所連接的實際地址。此后,進程可以對此地址進行讀寫操作訪問共享內存。

對于共享內存,linux本身無法對其做同步,需要程序自己來對共享的內存做出同步計算,而這種同步很多時候就是用信號量實現(xiàn)。共享內存是存在于內核級別的一種資源,在 shell中可以使用ipcs命令來查看當前系統(tǒng)IPC中的狀態(tài),在文件系統(tǒng)/proc目錄下有對其描述的相應文件。函數(shù)shmget可以創(chuàng)建或打開一塊共享內存區(qū)。函數(shù)原型如下:#include<sys/shm.h>intshmget(key_tkey,size_tsize,intflag);函數(shù)中參數(shù)key用來變換成一個扁識符,而且每一個IPC對象與一個key相對應。當新建一個共享內存段時,size參數(shù)為要請求的內存長度(以字節(jié)為單位)。注意:內核是以頁為單位分配內存,當size參數(shù)的值不是系統(tǒng)內存頁長的整數(shù)倍時,系統(tǒng)會分配給進程最小的可以滿足size長的頁數(shù),但是最后一頁的剩余部分內存是不可用的。當打開一個內存段時,參數(shù)size的值為0。參數(shù)flag中的相應權限位初始化ipc_perm結構體中的mode域。同時參數(shù)flag是函數(shù)行為參數(shù),它指定一些當函數(shù)遇到阻塞或其他情況時應做出的反應。四、 詳細設計:使用主要控件、函數(shù);詳細設計:使用主要控件、函數(shù);本次試驗采用三個線程線程來模擬,采用共享內存的方式。線程1(input)獲取兩個隨機數(shù)hEvent計算兩個隨機數(shù)的和緩存1線程1(input)獲取兩個隨機數(shù)hEvent計算兩個隨機數(shù)的和緩存1線程2(calculate)HANDLEhEvent;〃事件對象信號量HANDLEhSemap;〃線程2.3之間的信號量1、 線程1函數(shù)(獲得兩個隨機數(shù))DWORDWINAPIinput(LPVOIDIpParameter){CvosDlg*Dlg=(CvosDlg*)lpParameter;inti=0;while(i<100){Dlg->editVal_1.Format(_T("%d"),rand()%100);Dlg->editVal_2.Format(_T("%d"),rand()%100);Dlg->m_Edit_1.SetWindowTextW(Dlg->editVal_1);Dlg->m_Edit_2.SetWindowTextW(Dlg->editVal_2);SetEvent(hEvent);//v操作i++;Sleep(1000);}return0;}2、 線程2函數(shù)(計算它們的和)DWORDWINAPIcalculate(LPVOIDlpParameter){CvosDlg*Dlg=(CvosDlg*)lpParameter;inti=0;while(i<100){WaitForSingleObject(hEvent,INFINITE);//p操作Sleep(200);intsum=_tstoi(Dlg->editVal_1)+_tstoi(Dlg->editVal_2);Dlg->editVal_3.Format(_T("%s+%s=%d"),Dlg->editVal_1,Dlg->editVal_2,sum);Dlg->m_Edit_3.SetWindowTextW(Dlg->editVal_3);Dlg->editVal_4.Format(_T("%d"),sum);ReleaseSemaphore(hSemap,1,NULL);i++;}CloseHandle(hEvent);return0;}3、 線程3函數(shù)(輸出結果)DWORDWINAPIprint(LPVOIDIpParameter){CvosDlg*Dlg=(CvosDlg*)lpParameter;inti=0;while(i<100){WaitForSingleObject(hSemap,INFINITE);Sleep(200);Dlg->m_Edit_4.SetWindowTextW(Dlg->editVal_4);i++;}CloseHandle(hSemap);return0;}4、 信號量控制voidCvosDlg::OnBnClickedProcom()//進程通信按鈕函數(shù){//TODO:在此添加控件通知處理程序代碼hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//ffi用事件對象hSemap=CreateSemaphore(NULL,0,1,NULL); //使用信號量CloseHandle(CreateThread(NULL,0,input,this,0,NULL));CloseHandle(CreateThread(NULL,0,calculate,this,0,NULL));CloseHandle(CreateThread(NULL,0,print,this,0,NULL));5、 登錄以及用戶切換密碼和賬號保存在pwd.ini文檔內voidChangeUsr::DoDataExchange(CDataExchange*pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX,IDC_COMBO1,m_usrList);for(inti=0;i<UsrCount;++i){m_usrList.AddString(usrName[i]);}DDX_Control(pDX,IDC_EDIT1,m_ChangPwd);}BEGIN_MESSAGE_MAP(ChangeUsr,CDialogEx)ON_BN_CLICKED(IDOK,&ChangeUsr::OnBnClickedOk)END_MESSAGE_MAP()//ChangeUsr消息處理程序voidChangeUsr::OnBnClickedOk(){//TODO:在此添加控件通知處理程序代碼index=m_usrList.GetCurSel();m_usrList.GetWindowTextW(Name);if(!checkPwd()){Name="";}CDialogEx::OnOK();}boolChangeUsr::checkPwd(){CStringUsrpwd;ifstreampwd;m_ChangPwd.GetWindowTextW(Usrpwd);pwd.open("pwd.ini");if(!pwd.is_open()){exit(0);charname[20]={0};charpassword[30]={0};while(!pwd.eof()){pwd>>name;pwd>>password;if(Name==(CString)name){if(Usrpwd==(CString)password){returntrue;}else{MessageBox(_T("密碼錯誤”),_T("警告”),MB_OK|MB_ICONERROR);returnfalse;}}}if(pwd.eof())//是否到文件尾{if(IDYES==MessageBox(_T("是否要添加用戶?,—T("提示"),MB_YESNO|MB_ICONQUESTION)){AddUsr();returntrue;}}pwd.close();returnfalse;}6、新增用戶函數(shù)voidChangeUsr::AddUsr(){ofstreamadd;add.open("pwd.ini",ios::app|ios::out);if(!add.is_open()){

exit(0);CStringpwdstr;m_Ch

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論