1. 程式人生 > >【作業系統】作業系統大作業&相關知識整理

【作業系統】作業系統大作業&相關知識整理

作業系統大作業&相關知識整理

我校的作業系統大作業為N選3,以下為三個較為簡單的例子的實現
參考程式碼 見連線

1. 銀行櫃員服務問題

程序間同步/互斥問題
通過該實驗熟悉訊號量的處理及其在多執行緒程式中的應用

實驗題目

題目描述:
 銀行有n個櫃員負責為顧客服務,顧客進入銀行先取一個號碼,>然後等著叫號。當某個櫃員空閒下來,就叫下一個號。
程式設計實現該問題,用P、V操作實現櫃員和顧客的同步。

實現要求:
  1. 某個號碼只能由一名顧客取得;
  2. 不能有多於一個櫃員叫同一個號;
  3. 有顧客的時候,櫃員才叫號;
  4. 無櫃員空閒的時候,顧客需要等待;
  5. 無顧客的時候,櫃員需要等待。

實驗環境:
 Windows10
 VS2015

設計思路&程式結構


題目要求顧客取號與櫃檯叫號通過互斥物件完成,故建立兩個訊號量分別作為取號與叫號的訊號量。
此外,題目要求顧客與櫃檯間進行同步操作,為每個顧客分配一個訊號量用於完成顧客與櫃檯間的同步。具體實現可參考專案程式碼,其中進行了詳細的註釋

題目整體完成過程如下:

  首先從輸入檔案讀取各個顧客的資訊
  而後建立時鐘函式用於記錄程式開始的時間(程式中時鐘週期記錄在T中)
  接下來依次建立櫃檯例項併為每個櫃檯開啟一個執行緒,該執行緒進行忙等待直至有顧客等待(waitlist佇列長度不為0),則叫號並開始服務。
  為每個櫃檯開啟叫號執行緒後顧客開始進入,判定顧客進入的方法同樣為忙等待,判定當前時間每個顧客是否應當進入,若到達其進入時間則為其開啟一個取號執行緒。
  當所有顧客服務結束後輸出最終結果。
  題目整體完成結構見main.cpp中的int main() 及 void start()


 

模擬時鐘計時操作如下:

  定義了一個全域性變數time用於記錄當前時刻,clock執行緒不斷迴圈睡眠Tms,每兩次睡眠之間time自增一次,即完成了用time記錄當前時刻的功能
  模擬時鐘過程見main.cpp中的void clock()

模擬顧客取號操作過程如下:

  定義了全域性變數M_GET_NUM為使用者取號訊號量,全域性變數NUM為當前號碼。此外定義了顧客等待佇列waitlist用於記錄當前在排隊的顧客及其順序。M_CUSTOM為顧客櫃檯同步訊號量,用於保護服務過程中可能用到的資源,在使用者例項初始化時進行P操作。當用戶取號時,先對該訊號量進行一次P操作,而後記錄當前號碼NUM為該顧客取得的號碼,當前號碼加一。將該顧客加入到排隊的佇列waitlist中。顧客取號操作完畢,對M_GET_NUM進行V操作
  顧客取號過程見main.cpp中的void Get_num(customer *this_customer)

模擬櫃檯叫號操作過程如下:

  定義了全域性變數M_CALL_NUM為櫃檯叫號訊號量,全域性變數NUM_DONE為當前已完成服務的顧客數。當櫃檯叫號時,先對M_CALL_NUM進行P操作,而後判斷當前等待佇列waitlist是否為空,若不為空則直接對M_CALL_NUM進行V操作,繼續進行忙等待,否則對當前等待佇列waitlist中的隊首取出,從佇列中移除,叫號過程結束,對M_CALL_NUM進行V操作,而後對剛剛取出的其進行服務。開始服務時被服務的顧客記錄當前時刻為開始服務時刻,當前櫃檯為服務櫃檯。服務過程通過Sleep函式模擬,服務結束後顧客記錄當前時間為結束服務時間,並對M_CUSTOM進行V操作,即服務完成顧客用於服務的相應資源可繼續用於其他用途。櫃檯在服務完成後繼續開始叫號。
  櫃檯叫號過程見main.cpp中的void Call_num(server *this_server)

相關推薦

作業系統作業系統作業&相關知識整理

作業系統大作業&相關知識整理 我校的作業系統大作業為N選3,以下為三個較為簡單的例子的實現 參考程式碼 見連線 1. 銀行櫃員服務問題 程序間同步/互斥問題 通過該實驗熟悉訊號量的處理及其在多執行緒程式中的應用 實驗題目

筆記Nginx熱更新相關知識

(以下學習筆記內容均摘自參考連結,僅供個人查閱)   1、inotify檔案系統監控特性     Inotify 是一個 Linux 核心特性,它監控檔案系統,並且及時向專門的應用程式發出相關的事件警告,比如刪除、讀、寫和解除安裝操作等。inotify是L

精品EOS生態相關網站大全——請收藏!

更新日期:2018年11月15日 較之前一篇,增加了國內的一些不錯的網站,和刪除了某些打不開的連線,所以無論怎樣請收藏夾關注吧! 本號會一如既往的關注EOS大生態,並及時更新!   數字貨幣錢包排行榜 http://tokenwallet.cc/ 這個網站對市面上所

總結作業系統引論

如圖1所示,作業系統的目標: 方便性  有效性 可擴充性 開放性          2,作業系統有哪幾大特徵?最基本特徵是什麼?   併發兩個或多個事件在同一時間間隔內發生; &

作業系統作業系統糾錯本

【作業系統】作業系統糾錯本 標籤(空格分隔):【考研糾錯本】 考研作業系統糾錯本 文章目錄 考研作業系統糾錯本 第一輪 1. 作業系統的基本概念 2. 作業系統的發展與分類 3. 作業系統的執

總結作業系統原理

(本文只是自己的學習總結,不一定正確,僅供參考) 文章目錄 作業系統原理 基本內容 基本特徵 併發 分時(時間片輪轉) 共享

分類 - 作業系統

專欄達人 授予成功建立個人部落格專欄

分類 - 作業系統精髓與設計原理(原書第6版)

個人簡介 如果對測試比較感興趣的可以加QQ群:320542475! 如果你願意,我們可以聊聊測試的那點事,相互學習、互相成長,我相信只要不斷吸取自己所需營養,即使出生不那麼光彩,在未來依然會光芒萬丈,只是在前進的路上荊棘多了一點而已、、、

詳解WebSocket相關知識整理

前言   記得大概半年前就產生了疑惑,即後臺如何主動向前端推送資料。問了下專業老師,知道了原來有一個叫WebSocket的技術可以用於推送資料。於是,當時我就找了個教程,用的是Spring WebSocket。照著敲了一遍,也就搭起來了,依葫蘆畫瓢而已。當時有其他東西要學,也沒有相關的需求,就沒再接觸過。前

程序和程式關係類比/ java中執行緒是哪種實現清華大學作業系統

本文分三個小節 1 執行緒模型 2 執行緒的實現  3 java中執行緒是使用者執行緒,核心執行緒,輕量級程序??? 3.1 臨界區 互斥 3.2 訊號量 管程 前兩小節是來自作業系統。 第三小節:看到作業系統中執行緒實現的三種方式,忽然想起我以

專欄 - 作業系統原理(linux)

作業系統原理(linux) BIOS(BIOS中斷服務程式),Intel風格x86彙編的核心引導主程式,從真實模式下怎麼進入保護模式,怎麼實現中斷呼叫,怎麼實現特權級檢查,怎麼實現任務的建立,怎麼實現多工的管理;怎麼載入全部核心程

作業系統作業系統學習總結

1,概念 1)作業系統特徵 併發性 共享性 虛擬性(把一個物理實體變成若干個邏輯上的對應物) 非同步性 2)OS體系結構 單體結構 層次結構 虛擬機器結構 C/S結構 微核心架構 3)進位制轉換 4)全域性變數和區域

bzoj3261異或和

異或 ... urn fin pri bit names -- else 就是一個可持久化Trie....... #include<bits/stdc++.h> #define N 600005 using namespace std; inline int

正則化相關鏈接

blog class bsp src rop 折疊 img detail link 正則化,歸一化的概念 基於Matlab介紹正則化方法 正則化方法:L1和L2 regularization、數據集擴增、dropout 基於Matlab介紹機器學習中的正則化,理解

MLE似然估計Maximum Likelihood Estimation

like 分布 什麽 9.png 顏色 ... 部分 多少 ati 模型已定,參數未知 最大似然估計提供了一種給定觀察數據來評估模型參數的方法,假設我們要統計全國人口的身高,首先假設這個身高服從服從正態分布,但是該分布的均值與方差未知。我們沒有人力與物力去統計

分享Java後臺開發精選知識圖譜

僅支持 jqgrid lai content 結果集 完全 異常處理 分布式服務 list 地址 引言: 學習一個新的技術時,其實不在於跟著某個教程敲出了幾行、幾百行代碼,這樣你最多只能知其然而不知其所以然,進步緩慢且深度有限,最重要的是一開始就對整個學習路線有宏觀、簡潔的

bzoj3281異或和 可持久化Trie樹

log pac 序列 str char s pan pri scan bool 題目描述 給定一個非負整數序列 {a},初始長度為 N。 有M個操作,有以下兩種操作類型:1、A x:添加操作,表示在序列末尾添加一個數 x,序列的長度 N+1。2、Q l r x

bzoj5089連續子段和 分塊+單調棧

我們 如果 一條直線 時間復雜度 支持 led 包括 每一個 a + b 題目描述 給出一個長度為 n 的序列,要求支持如下兩種操作: A l r x :將 [l,r] 區間內的所有數加上 x ; Q l r : 詢問 [l,r] 區間的最大連續子段和。

原創關於Visual Studio相關插件的介紹與下載

ron 原來 bsp 推薦 blog 需要 地址 操作 說明 免責說明:本頁面插件僅供學習使用,切勿用於商業用途,插件來源均來自互聯網。 原文地址:http://www.cnblogs.com/cokefenta/p/7987766.html 在使用VS進行Unity的開發

Selenium請教神,知乎的註冊頁面如何切換到登錄頁面?

button 網站 == sel 知乎 bin south 點擊 ng- xpath可以 之前的xpath寫錯了 ---------------------------------------------------------------分割線------------