freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

天津科技大學操作系統(tǒng)實驗(編輯修改稿)

2024-07-23 21:29 本頁面
 

【文章內容簡介】 // 輸出緩沖區(qū)大小 DWORD nInBufferSize, // 輸入緩沖區(qū)大小 DWORD nDefaultTimeOut, // 指定默認的超時時間 LPSECURITY_ATTRIBUTES lpSecurityAttributes // 描述安全信息的一個結構 )。 管道由以下函數(shù)刪除:BOOL CloseHandle( HANDLE hObject // 管道句柄 )。其它的管道函數(shù)簡介如下: CallNamedPipe:連接到一個命名管道,讀取或寫入數(shù)據(jù)之后關閉它。 ConnectNamedPipe:服務進程準備好一個連接到客戶進程的管道,并等待一個客戶進程連接上為止。DisconnectNamedPipe:服務端用來斷開與客戶端的連接。 GetNamedPipeHandleState:獲取一個命名管道的狀態(tài)信息。 GetNamedPipeInfo:獲取一個命名管道的信息。 PeekNamedPipe:從一個匿名或命名管道中拷貝數(shù)據(jù)到一個緩沖區(qū)。 SetNamedPipeHandleState:設置管道的類型及其它狀態(tài)信息,比如說是比特流還是消息流管道。 TransactNamedPipe:從一個消息管道讀消息或向其寫入消息。 WaitNamedPipe:客戶進程用來連接到一個命名管道?!緦嶒灢襟E】(1)匿名管道:先編譯Child工程,然后運行Parent工程,再在Parent中創(chuàng)建管道和子進程,然后雙方即可通過管道通信。如下圖所示。(2)命名管道:Server和Client各自運行,再在Server中創(chuàng)建命名管道,然后在Client中連接管道,最后雙方即可通過管道通信。如上圖所示。(實驗三選做題目,如果實現(xiàn)了本題目需要交此代碼):在客戶端輸入數(shù)據(jù)a和b,然后發(fā)送到服務器并計算a+b,然后把計算結果發(fā)送到客戶端。可以多個客戶端與同一個服務器并行通信。界面設計如下: 難點所在:實現(xiàn)的過程比較簡單,但有一個難點。原本當服務端使用ConnectNamedPipe函數(shù)后,如果有客戶端連接,就可以直接進行交互。原來在實現(xiàn)過程中,當管道空閑時,管道的線程函數(shù)會無限(INFINITE)阻塞。若現(xiàn)在需要停止服務,就必須結束所有的線程,TernimateThread可以作為一個結束線程的方法,但基本不用這個函數(shù)。一旦使用這個函數(shù)之后,目標線程就會立即結束,但如果此時的目標線程正在操作互斥資源、內核調用、或者是操作共享DLL的全局變量,可能會出現(xiàn)互斥資源無法釋放、內核異常等現(xiàn)象。這里用重疊I/0來解決這個問題,在創(chuàng)建PIPE時使用FILE_FLAG_OVERLAPPED標志,這樣使用ConnectNamedPipe后會立即返回,但線程的阻塞由等待函數(shù)WaitForSingleObject來實現(xiàn),等待OVERLAPPED結構的事件對象被設置??蛻舳酥饕a://提交按鈕單擊事件void CMyDlg::OnSubmit() { // 打開管道 HANDLE hPipe = CreateFile(\\\\.\\Pipe\\NamedPipe, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) 。 if ( hPipe == INVALID_HANDLE_VALUE ) { thisMessageBox ( 打開管道失敗,服務器尚未啟動,或者客戶端數(shù)量過多 ) 。 return 。 } DWORD nReadByte, nWriteByte 。 char szBuf[1024] = {0} 。 sprintf ( szBuf, %d %d, thisnFirst, thisnSecond ) 。 // 把兩個整數(shù)(a,b)格式化為字符串 WriteFile ( hPipe, szBuf, strlen(szBuf), amp。nWriteByte, NULL ) 。 // 把數(shù)據(jù)寫入管道 memset ( szBuf, 0, sizeof(szBuf) ) 。 ReadFile ( hPipe, szBuf, 1024, amp。nReadByte, NULL ) 。 // 讀取服務器的反饋信息 sscanf ( szBuf, %d, amp。(thisnResValue) ) 。 // 把返回信息格式化為整數(shù) thisUpdateData ( false ) 。 CloseHandle ( hPipe ) 。}服務端主要代碼://啟動服務void CMyDlg::OnStart() { CString lpPipeName = \\\\.\\Pipe\\NamedPipe 。 for ( UINT i = 0。 i nMaxConn。 i++ ) { PipeInst[i].hPipe = CreateNamedPipe ( lpPipeName, PIPE_ACCESS_DUPLEX|FILE_ FLAG_OVERLAPPED, PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, nMaxConn, 0, 0, 1000, NULL ) 。 // 創(chuàng)建管道實例 if ( PipeInst[i].hPipe == INVALID_HANDLE_VALUE ) { DWORD dwErrorCode = GetLastError () 。 thisMessageBox ( 創(chuàng)建管道錯誤! ) 。 return 。 } // 為每個管道實例創(chuàng)建一個事件對象,用于實現(xiàn)重疊IO PipeInst[i].hEvent = CreateEvent ( NULL, false, false, false ) 。 // 為每個管道實例分配一個線程,用于響應客戶端的請求 PipeInst[i].hTread = AfxBeginThread ( ServerThread, amp。PipeInst[i], THREAD_PRIORITY _NORMAL ) 。 } thisSetWindowText ( 命名管道實例之服務器(運行) ) 。 thisMessageBox ( 服務啟動成功 ) 。}// 停止服務void CMyDlg::OnStop() { DWORD dwNewMode = PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_NOWAIT 。 for ( UINT i = 0。 i nMaxConn。 i++ ) { SetEvent ( PipeInst[i].hEvent ) 。 CloseHandle ( PipeInst[i].hTread ) 。 CloseHandle ( PipeInst[i].hPipe ) 。 } thisSetWindowText ( 命名管道實例之服務器 ) 。 thisMessageBox ( 停止啟動成功 ) 。}// 線程服務函數(shù)UINT ServerThread ( LPVOID lpParameter ){ DWORD nReadByte = 0, nWriteByte = 0, dwByte = 0 。 char szBuf[MAX_BUFFER_SIZE] = {0} 。 PIPE_INSTRUCT CurPipeInst = *(PIPE_INSTRUCT*)lpParameter 。 OVERLAPPED OverLapStruct = { 0, 0, 0, 0, } 。 while ( true ) { memset ( szBuf, 0, sizeof(szBuf) ) 。 // 命名管道的連接函數(shù),等待客戶端的連接(只針對NT) ConnectNamedPipe ( , amp。OverLapStruct ) 。 // 實現(xiàn)重疊I/0,等待OVERLAPPED結構的事件對象 WaitForSingleObject ( , INFINITE ) 。 // 檢測I/0是否已經(jīng)完成,如果未完成,意味著該事件對象是人工設置,即服務需要停止 if ( !GetOverlappedResult ( , amp。OverLapStruct, amp。dwByte, true ) ) break 。 // 從管道中讀取客戶端的請求信息 if ( !ReadFile ( , szBuf, MAX_BUFFER_SIZE, amp。nReadByte, NULL ) ) { MessageBox ( 0, 讀取管道錯誤!, 0, 0 ) 。 break 。 } int a, b 。 sscanf ( szBuf, %d %d, amp。a, amp。b ) 。 pMyDlgnFirst = a 。 pMyDlgnSecond = b 。 pMyDlgnResValue = a + b 。 memset ( szBuf, 0, sizeof(szBuf) ) 。 sprintf ( szBuf, %d, pMyDlgnResValue ) 。 // 把反饋信息寫入管道 WriteFile ( , szBuf, strlen(szBuf), amp。nWriteByte, NULL ) 。 pMyDlgSetDlgItemInt ( IDC_FIRST, a, true ) 。 pMyDlgSetDlgItemInt ( IDC_SECOND, b, true ) 。 pMyDlgSetDlgItemInt ( IDC_RESULT, pMyDlgnResValue, true ) 。 // 斷開客戶端的連接,以便等待下一客戶的到來 DisconnectNamedPipe ( ) 。 } return 0 。}實驗四 銀行家算法模擬【開發(fā)語言及實現(xiàn)平臺或實驗環(huán)境】C++/CMicrosoft Visual Studio 【實驗目的】(1)進一步理解利用銀行家算法避免死鎖的問題;(2)在了解和掌握銀行家算法。(3)理解和掌握安全序列、安全性算法【實驗內容】(1)編寫安全性算法;(2)編寫銀行家算法,并編制銀行家算法通用程序,將調試結果顯示在計算機屏幕上,再檢測和筆算的一致性?!緦嶒炘怼恳?、安全狀態(tài)指系統(tǒng)能按照某種順序如P1,P2,…,Pn(稱為P1,P2,…,Pn序列為安全序列),為每個進程分配所需的資源,直至最大需求,使得每個進程都能順利完成。 二、銀行家算法假設在進程并發(fā)執(zhí)行時進程i提出請求j類資源k個后,表示為Requesti[j]=k。系統(tǒng)按下述步驟進行安全檢查:(1)如果Requesti≤Needi則繼續(xù)以下檢查,否則顯示需求申請超出最大需求值的錯誤。(2)如果Requesti≤Available則繼續(xù)以下檢查,否則顯示系統(tǒng)無足夠資源,Pi阻塞等待。(3)系統(tǒng)試探著把資源分配給進程Pi,并修改下面數(shù)據(jù)結構中的數(shù)值: Available[j]∶=Available[j]Requesti[j]。 Allocation[i,j]∶=Allocation[i,j]+Requesti[j]。 Need[i,j]∶=Need[i,j]Requesti[j]。(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源
點擊復制文檔內容
教學教案相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1