版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
操作系統(tǒng)原理
課程設(shè)計(jì)
指導(dǎo)
(第二版)
李印請(qǐng)等編籌
計(jì)算機(jī)科學(xué)與應(yīng)用系
DepartmentofComputerScienceandApplication
二零零七年十二月
第二版前言
《操作系統(tǒng)課程設(shè)計(jì)》第一版編寫(xiě)于2003年,從2000級(jí)計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)投入
教學(xué)使用以來(lái),距今已5年。在這5年中,計(jì)算機(jī)網(wǎng)絡(luò)、現(xiàn)代通信技術(shù)的發(fā)展極其迅速,
人們已經(jīng)無(wú)法想像,如互聯(lián)網(wǎng)不通、手機(jī)丟失,將會(huì)對(duì)您的工作、學(xué)習(xí)和交際帶來(lái)的影
響有多么巨大。再者,這期間不僅操作系統(tǒng)開(kāi)發(fā)技術(shù)有了很大進(jìn)展,而且國(guó)內(nèi)高等院校
計(jì)算機(jī)及相關(guān)專(zhuān)業(yè)“操作系統(tǒng)原理”課程的實(shí)踐教學(xué)也有了顯著的變化,對(duì)操作系統(tǒng)中
的原理、算法和方法的學(xué)習(xí)提出了更高的要求,原來(lái)沒(méi)有開(kāi)設(shè)操作系統(tǒng)原理課程設(shè)計(jì)的
院校開(kāi)始開(kāi)設(shè)課程設(shè)計(jì),幾年前已開(kāi)設(shè)實(shí)驗(yàn)的院校,已不再停留在操作系統(tǒng)中各種資源
管理的模擬,而是更加強(qiáng)調(diào)實(shí)踐(實(shí)驗(yàn)或?qū)嵱?xùn)I)的重要性。例如,要求計(jì)算機(jī)及相關(guān)專(zhuān)
業(yè)的學(xué)生,在校期間要熟練掌握一種操作系統(tǒng),如MS-DOS或Windows,同時(shí)要求了解
另一種操作系統(tǒng)的原理、算法和方法。
這5年期間,本書(shū)作者在從事”操作系統(tǒng)原理”課程教學(xué)的同時(shí),完成了多項(xiàng)院級(jí)
操作系統(tǒng)教學(xué)改革教學(xué)研究項(xiàng)目,并發(fā)表了數(shù)篇學(xué)術(shù)論文,對(duì)“操作系統(tǒng)原理”課程的
教學(xué)改革作了深入的研究。本書(shū)第二版正是在此基礎(chǔ)上并對(duì)第一版的內(nèi)容作了較大的改
動(dòng)之后撰寫(xiě)而成的。
全書(shū)分為三大部分,共3章。每章中列出的實(shí)驗(yàn)保留了第一版中編寫(xiě)風(fēng)格,即每個(gè)
實(shí)驗(yàn)包括實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容和思考題,同時(shí)考慮到一些學(xué)生的實(shí)際需要,個(gè)別實(shí)驗(yàn)還
給出了實(shí)驗(yàn)涉及的基本思想、程序流程圖和供參考的程序代碼。
第1章操作系統(tǒng)基礎(chǔ)實(shí)驗(yàn)是對(duì)第一版六個(gè)實(shí)驗(yàn)作了較大改動(dòng)之后編寫(xiě)的。保留了其
中的進(jìn)程調(diào)度算法的模擬、動(dòng)態(tài)分區(qū)方法的模擬、存儲(chǔ)管理方式的模擬以及文件管理系
統(tǒng)的實(shí)現(xiàn)等實(shí)驗(yàn),并對(duì)其中的文字部分進(jìn)行了編輯,程序代碼改用C++程序設(shè)計(jì)語(yǔ)言來(lái)
實(shí)現(xiàn)。
保留這一章的目的是要求計(jì)算機(jī)及相關(guān)專(zhuān)業(yè)的學(xué)生在完成操作系統(tǒng)課程設(shè)計(jì)教學(xué)實(shí)
踐環(huán)節(jié)中至少應(yīng)完成其中的2個(gè)實(shí)驗(yàn),這是對(duì)學(xué)生的最低要求。通過(guò)這些實(shí)驗(yàn)學(xué)生應(yīng)掌
握操作系統(tǒng)中進(jìn)程的概念、進(jìn)程調(diào)度算法、操作系統(tǒng)中對(duì)存儲(chǔ)資源的管理以及文件系統(tǒng)
的實(shí)現(xiàn)方法。
第2章Linux及其實(shí)驗(yàn)是新增的。內(nèi)容包括Linux的安裝、Linux命令、shell程序設(shè)
計(jì)、Linux進(jìn)程管理等方面的實(shí)訓(xùn)。增設(shè)這一章的目的是為了使讀者了解Linux操作系統(tǒng)
的基本概念,熟悉該操作系統(tǒng)的使用方法以及掌握基于Linux的進(jìn)程管理等方面的知識(shí),
進(jìn)一步提高對(duì)操作系統(tǒng)中各種資源管理的理解,基本掌握另一種操作系統(tǒng),擴(kuò)大其知識(shí)
面。
第3章Minix教學(xué)操作系統(tǒng)實(shí)踐也是新增的。內(nèi)容包括Minix操作系統(tǒng)的基本知識(shí)
和概念,包括進(jìn)程、DO系統(tǒng)、內(nèi)存管理、文件系統(tǒng)等,這一章安排有Minix操作系統(tǒng)的
安裝、運(yùn)行及退出,Minix命令等方面的實(shí)訓(xùn)內(nèi)容。
本書(shū)由多人合作完成。其中,李印清、荊立夏制定了全書(shū)的編寫(xiě)大綱,趙中堂對(duì)第
一版中的實(shí)驗(yàn)進(jìn)行了修改,包括程序代碼的改寫(xiě),第2章由荊立夏編寫(xiě),第3章由史軍
勇編寫(xiě),李印清對(duì)全書(shū)進(jìn)行了統(tǒng)稿。
我們?cè)诰帉?xiě)過(guò)程中,盡可能引入新的觀點(diǎn)和方法,力求能反映當(dāng)代操作系統(tǒng)領(lǐng)域的
I
技術(shù)水平。但由于學(xué)識(shí)淺陋,必有很多不足之處,希同行指正。
編著者
2007年12月于鄭州熊耳河畔
第一版前言
軟件技術(shù)是計(jì)算機(jī)系統(tǒng)的靈魂與核心,而操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)中最核心和最底層
的軟件。對(duì)操作系統(tǒng)的深入學(xué)習(xí)關(guān)系到整個(gè)計(jì)算機(jī)系統(tǒng)運(yùn)行機(jī)制的全面理解。因此,對(duì)
于學(xué)習(xí)操作系統(tǒng)的學(xué)生來(lái)說(shuō),除了需要刻苦努力之外,還需要掌握軟件和操作系統(tǒng)的原
理與設(shè)計(jì)技巧。學(xué)習(xí)和掌握它們對(duì)于提升自身的創(chuàng)造力和想象力是很有幫助的。
如何學(xué)習(xí)和掌握操作系統(tǒng)技術(shù)的原理與實(shí)現(xiàn)技能呢?除了聽(tīng)課和讀書(shū)之外,加強(qiáng)實(shí)
踐環(huán)節(jié),在設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中加深對(duì)操作系統(tǒng)原理的理解同樣是重要的。作為計(jì)算機(jī)專(zhuān)
業(yè)的學(xué)生,多使用操作系統(tǒng),多閱讀和分析操作系統(tǒng)源代碼,甚至自己設(shè)計(jì)一個(gè)小型操
作系統(tǒng),對(duì)學(xué)習(xí)操作系統(tǒng)原理課程是十分有益的。
當(dāng)前非常流行的Linux操作系統(tǒng)的原始版事實(shí)上就是由芬蘭赫爾辛基大學(xué)計(jì)算機(jī)系
大學(xué)生LinusTorvalds在從1990年底到1991年的幾個(gè)月中為了他自己的操作系統(tǒng)原理課
程學(xué)習(xí)和后來(lái)的上網(wǎng)用途而陸續(xù)編寫(xiě)的。他在自己購(gòu)買(mǎi)的Intel386PC機(jī)上,利用
Tanenbaum教授自行設(shè)計(jì)的微型UNIX操作系統(tǒng)Minix作為開(kāi)發(fā)平臺(tái),編寫(xiě)了一個(gè)進(jìn)程
切換器,目的是想看一看Intel386存儲(chǔ)管理軟件是如何工作的。隨后是為他自己上網(wǎng)需
要自行編寫(xiě)的網(wǎng)絡(luò)仿真程序,再后來(lái)是為他從網(wǎng)上下載文件的需要而自行編寫(xiě)的硬盤(pán)驅(qū)
動(dòng)程序和文件系統(tǒng)。最終他發(fā)現(xiàn)已經(jīng)實(shí)現(xiàn)了一個(gè)幾乎完整的操作系統(tǒng)內(nèi)核。出于對(duì)這個(gè)
內(nèi)核的信心和美好的奉獻(xiàn)與發(fā)展希望,Linux希望這個(gè)內(nèi)核能夠免費(fèi)擴(kuò)散使用,并于1991
年底在赫爾辛基大學(xué)的一臺(tái)FTP服務(wù)器上發(fā)了一則消息,用戶(hù)可以下載Linux的公開(kāi)版
本(基于Intel386體系結(jié)構(gòu))和源代碼。
Internet為L(zhǎng)inux的興起創(chuàng)造了一個(gè)奇跡。由1992年1月全世界大約只有100個(gè)左右
的人在使用Linux,發(fā)展到越來(lái)越多的商業(yè)軟件公司的加盟,使Linux不斷地向高端發(fā)展,
開(kāi)始進(jìn)入越來(lái)越多的公司和企業(yè)計(jì)算領(lǐng)域,使Linux拓展為全球性的重要的操作系統(tǒng),
其影響力直逼UNIXo
Linus在赫爾辛基大學(xué)本科和碩士畢業(yè)后,沒(méi)有組建或去任何一家Linux公司,而是于1997年3月
加盟美國(guó)加利福尼亞州的SantaClara的Transmeta公司。
基于上述想法,我們編寫(xiě)了這本《操作系統(tǒng)原理課程設(shè)計(jì)》,它作為操作系統(tǒng)原理課
程的輔助教材,供計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生在操作系統(tǒng)課程設(shè)計(jì)時(shí)使用,以期達(dá)到理論與實(shí)踐
相結(jié)合的目的。
鑒于目前提供給學(xué)生課程設(shè)計(jì)的軟硬件環(huán)境,書(shū)中共列出了6個(gè)利用C語(yǔ)言或C++
語(yǔ)言模擬作業(yè)調(diào)度、進(jìn)程控制、進(jìn)程同步、存儲(chǔ)管理和文件管理的實(shí)驗(yàn)。為了幫助學(xué)生
順利完成實(shí)驗(yàn),我們給出了“作業(yè)調(diào)度”實(shí)驗(yàn)、“進(jìn)程調(diào)度”實(shí)驗(yàn)和“文件管理”實(shí)驗(yàn)的
部分C++參考編程解答。另外,基于開(kāi)拓學(xué)生自己的創(chuàng)造力和想象力,還提倡由學(xué)生自
己按照操作系統(tǒng)中的原理和技術(shù)擬定實(shí)驗(yàn)題目,在征得教師同意后,也可以作為課程設(shè)
計(jì)的題目。
由于Linux操作系統(tǒng)是一個(gè)向用戶(hù)開(kāi)放源碼的免費(fèi)的類(lèi)UNIX操作系統(tǒng),它為在校
學(xué)生學(xué)習(xí)操作系統(tǒng)課程提供了一個(gè)看得見(jiàn)摸得著的范例。因此,對(duì)有條件的學(xué)生,我們
建議你完全可以在Linux環(huán)境下完成操作系統(tǒng)的課程設(shè)計(jì),當(dāng)然,你應(yīng)當(dāng)熟悉Linux的操
III
作和開(kāi)發(fā)環(huán)境,如果要安裝Linux系統(tǒng),可以利用Linux安裝光盤(pán)運(yùn)行安裝,或在下列網(wǎng)
址獲取源碼進(jìn)行安裝:
ftp:〃
ftp:〃
ftp:〃
編著《操作系統(tǒng)原理課程設(shè)計(jì)》對(duì)作者來(lái)講還是初次嘗試,由于編著者的水平與知
識(shí)有限,書(shū)中完全可能存在錯(cuò)誤和不妥之處,有待于有識(shí)之士的指教。
編著者
2003年4月于熊耳河畔
IV
目錄
第二版前言I
第一版前言III
第一章操作系統(tǒng)基礎(chǔ)實(shí)驗(yàn)1
1.1進(jìn)程調(diào)度算法1
1.1.1實(shí)驗(yàn)?zāi)康?
1.1.2實(shí)驗(yàn)內(nèi)容1
1.1.3進(jìn)程調(diào)度的基本思想4
1.1.4程序流程圖4
1.1.5供參考的部分程序代碼6
1.1.6思考題15
1.2動(dòng)態(tài)分區(qū)存儲(chǔ)管理16
1.2.1實(shí)驗(yàn)?zāi)康?6
1.2.2實(shí)驗(yàn)內(nèi)容16
1.2.3思考題16
1.3請(qǐng)求調(diào)頁(yè)存儲(chǔ)管理17
1.3.1實(shí)驗(yàn)?zāi)康?7
1.3.2實(shí)驗(yàn)內(nèi)容17
1.3.3思考題18
1.4文件管理系統(tǒng)19
1.4.1目的19
1.4.2實(shí)驗(yàn)內(nèi)容19
1.4.3程序流程圖21
1.4.4供參考的部分程序代碼21
1.4.5程序運(yùn)行結(jié)果(僅供參考)41
第2章Linux及其實(shí)驗(yàn)44
2.1Linux概述44
2.1.1Linux歷史44
2.1.2Linux的特性44
2.1.3Linux的安裝45
2.2Linux用戶(hù)接口47
2.2.1Linux命令47
2.2.2shell程序設(shè)計(jì)52
2.3Linux進(jìn)程管理57
2.3.1進(jìn)程描述57
2.3.2進(jìn)程狀態(tài)57
2.3.3進(jìn)程控制58
V
2.3.4進(jìn)程通信60
2.3.5進(jìn)程管理實(shí)驗(yàn)61
第三章Minix教學(xué)操作系統(tǒng)實(shí)踐68
3.1Minix操作系統(tǒng)概述68
3.1.1Minix進(jìn)程68
3.1.2MinixI/O系統(tǒng)69
3.1.3Minix內(nèi)存管理70
3.1.4Minix文件系統(tǒng)70
3.2Bochs虛擬機(jī)71
3.2.1Bochs虛擬機(jī)的基本概念71
3.2.2實(shí)驗(yàn)171
3.3Minix操作系統(tǒng)的安裝、運(yùn)行及退出72
3.3.1Minix操作系統(tǒng)的安裝、運(yùn)行及退出的基本步驟72
3.3.2實(shí)驗(yàn)274
3.4Minix操作系統(tǒng)命令介紹76
3.4.1目錄操作76
3.4.2文件操作77
3.4.3vi編輯器79
3.4.4系統(tǒng)變量80
3.4.5實(shí)驗(yàn)381
附錄1課程設(shè)計(jì)報(bào)告格式82
附錄2Linux系統(tǒng)sched,h源碼文件88
附錄3Linux系統(tǒng)fork.c源碼文件120
VI
第1章操作系統(tǒng)基礎(chǔ)實(shí)驗(yàn)
1.1進(jìn)程調(diào)度算法
1.1.1實(shí)驗(yàn)?zāi)康?/p>
通過(guò)優(yōu)先權(quán)法和輪轉(zhuǎn)算法的模擬加深對(duì)進(jìn)程概念和進(jìn)程調(diào)度過(guò)程的理解,掌握進(jìn)程
狀態(tài)之間的切換,同時(shí)掌握進(jìn)程調(diào)度算法的實(shí)現(xiàn)方法和技巧。
1.1.2實(shí)驗(yàn)內(nèi)容
1.用C語(yǔ)言或C++語(yǔ)言來(lái)實(shí)現(xiàn)對(duì)n個(gè)進(jìn)程采用優(yōu)先權(quán)優(yōu)先算法以及輪轉(zhuǎn)算法的進(jìn)程
調(diào)度。
2.每個(gè)用來(lái)標(biāo)識(shí)進(jìn)程的進(jìn)程控制塊PCB用結(jié)構(gòu)來(lái)描述,包括以下字段:
(1)進(jìn)程標(biāo)識(shí)ID,其中0為閑逛進(jìn)程,用戶(hù)進(jìn)程的標(biāo)識(shí)數(shù)為1,2,3...O
(2)進(jìn)程優(yōu)先級(jí)Priority,閑逛進(jìn)程(idle)的優(yōu)先級(jí)為0,用戶(hù)進(jìn)程的優(yōu)先級(jí)大于0,
且隨機(jī)產(chǎn)生,標(biāo)識(shí)數(shù)越大,優(yōu)先級(jí)越高。
(3)進(jìn)程占用的CPU時(shí)間CPUtime,進(jìn)程每運(yùn)行一次,累計(jì)值等于4。
(4)進(jìn)程總共需要運(yùn)行時(shí)間Alltime,利用隨機(jī)函數(shù)產(chǎn)生。
(5)進(jìn)程狀態(tài),0—就緒態(tài);1一運(yùn)行態(tài);2—阻塞態(tài)。
(6)隊(duì)列指針next,用來(lái)將多個(gè)進(jìn)程控制塊PCB鏈接為隊(duì)列。
3.優(yōu)先數(shù)改變的原則
(1)進(jìn)程在就緒隊(duì)列中每呆一個(gè)時(shí)間片,優(yōu)先數(shù)增加1。
(2)進(jìn)程每運(yùn)行一個(gè)時(shí)間片,優(yōu)先數(shù)減3。
4.在調(diào)度前,系統(tǒng)中擁有的進(jìn)程數(shù)PCB_number由鍵盤(pán)輸入,經(jīng)初始化后,所有的
進(jìn)程控制塊PCB鏈接成就緒隊(duì)列。
5.為了清楚地觀察諸進(jìn)程的調(diào)度過(guò)程,程序應(yīng)將每個(gè)時(shí)間片內(nèi)的進(jìn)程的情況顯示出
來(lái),參照輸出格式如圖1-1、1-2、1-3所示:
1
圖1-1優(yōu)先權(quán)優(yōu)先調(diào)度算法1
圖1-2優(yōu)先權(quán)優(yōu)先調(diào)度算法2
圖1-3優(yōu)先權(quán)優(yōu)先調(diào)度算法3
2
輪轉(zhuǎn)調(diào)度算法的運(yùn)行結(jié)果如圖1-4、1-5所示。
圖1-4輪轉(zhuǎn)調(diào)度算法的運(yùn)行結(jié)果1
圖1-5輪轉(zhuǎn)調(diào)度算法的運(yùn)行結(jié)果2
3
1.1.3進(jìn)程調(diào)度的基本思想
(1)當(dāng)系統(tǒng)空閑(就緒隊(duì)列為空)時(shí),系統(tǒng)運(yùn)行閑逛進(jìn)程,否則運(yùn)行其他進(jìn)程,發(fā)
生變遷1(就緒一運(yùn)行)。
(2)在運(yùn)行進(jìn)程(包括閑逛進(jìn)程)的過(guò)程中,可能發(fā)生變遷2(運(yùn)行一阻塞),即將
運(yùn)行進(jìn)程插入到阻塞隊(duì)列(閑逛進(jìn)程不能被阻塞),可能有其他新的進(jìn)程創(chuàng)建PCB,還可
能喚醒阻塞隊(duì)列中的某些進(jìn)程PCB,發(fā)生變遷3(阻塞一就緒),即從阻塞隊(duì)列中移出并
插入就緒隊(duì)列中。
(3)時(shí)間片運(yùn)行結(jié)束后,若進(jìn)程累計(jì)占用CPU時(shí)間大于等于進(jìn)程需要運(yùn)行的時(shí)間,
則進(jìn)程執(zhí)行結(jié)束,釋放其PCB。若進(jìn)程累計(jì)占用CPU時(shí)間小于進(jìn)程需要運(yùn)行時(shí)間,發(fā)生
變遷4(運(yùn)行一就緒),即將當(dāng)前運(yùn)行的進(jìn)程插入就緒隊(duì)列中。
1.1.4程序流程圖
1.動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法模擬流程(請(qǐng)同學(xué)們補(bǔ)充)
4
2.輪轉(zhuǎn)法進(jìn)程調(diào)度算法模擬流程
5
1.1.5供參考的部分程序代碼
/*以下程序在C++環(huán)境調(diào)試通過(guò)*/
ftincludezzstdafx.h〃
ftdefineNULL0
#include<stdio.h>
ftinclude<stdlib.h>
#include<iostream>
usingnamespacestd;
/*以下僅列出動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法模擬*/
/*進(jìn)程PCB結(jié)構(gòu)*/
structPcb
{
intID;
intpriority;
intCPUtime;
intALLtime;
intState;
structPcb*next;
):
typedefstructPcbPCB;
voidinit();/*產(chǎn)生idle進(jìn)程,輸入用戶(hù)進(jìn)程數(shù)目,調(diào)用insert。*/
voidprint(PCB*pcb);/*輸出進(jìn)程屬性信息*/
voidprint_init(PCB*pcb)/*輸出所有PCB的初始值*/
voidinsert();/*生成進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列*/
voidrun(PCB*pcb);/*運(yùn)行進(jìn)程,隨機(jī)阻塞進(jìn)程、產(chǎn)生新進(jìn)程,插入就緒隊(duì)
列,喚醒阻塞進(jìn)程*/
voidblock(PCB*pcb);/*調(diào)用destroy。,將進(jìn)程插入阻塞隊(duì)列*/
voidwakeup();/*喚醒進(jìn)程,插入就緒隊(duì)列*/
voidproc_priority();/*優(yōu)先權(quán)調(diào)度算法模擬*/
voidproc_loop();/*輪轉(zhuǎn)法調(diào)度算法模擬*/
voidupdate(PCB*pcb);/*更新進(jìn)程信息*/
PCB*ready_queue,*block_queue,*idleprocess;/*就緒隊(duì)列,阻塞隊(duì)列及閑逛進(jìn)程指
針變量*/
voidmainl()
6
inti=0;
while(1)
(
cout<<(,z\nPleaseselectanumber(1,2,0)〃);
cout<<(z,\n1--priority〃);
cout<<(〃\n2--loop");
cout<<(z/\n0--exit\n〃);
cin?i;
if(i=l)
(
cout<<(zz\nThisisanexampleforpriorityprocessing:\n,z);
init();
::proc_priority();
}
elseif(i=2)
(
cout<<(,z\nThisisanexampleforroundrobinprocessing:\nz/);
init();
proc_loop();
}
elseif(i==0)
exit(1);
/*輸出所有PCB的初始值,此函數(shù)用于測(cè)試程序*/
voidprintinit(PCB*pcb)
(
PCB*temp=pcb->next;
cout?(,z\nIDpriorityCPUtimeALLtimeState\nz,);
while(temp!=NULL)
(
cout<<,z\nz/<<,z,z<<temp->ID<<z,z,?temp->priority?z/
/,<<temp->CPUtime<<zrz,?temp->ALLtime;
if(temp->State==0)
cout?(〃ready");
elseif(temp->State=l)
cout<<Crunning");
7
else
cout?(/zblocked");
temp=temp->next;
}
)
/*輸出進(jìn)程屬性信息*/
voidprint(PCB*pcb)
{
PCB*temp;
temp=pcb;
if(pcb->ID==0)
cout<<(zz\n\tTheidleprocessisrunning!,z);
else
{
cout〈<〃\n〃<<〃Z*<<temp->ID<<,//z<<temp->priority?,z
,z<<temp->CPUtime<<,z?temp->ALLtime;
if(temp->State==O)
cout<<(〃ready");
elseif(temp->State==l)
cout<<(〃running");
else
cout<<(,zblocked");
voidinsert_queue(PCB*queue,PCB*item)
{〃將item插入到隊(duì)列中,使得插入后,隊(duì)列中按照優(yōu)先級(jí)從高到低有序
PCB*p,*q;
q=queue;p=q->next;
while(p!=0&&p->priority>=item->priority)
(
q=p;
p=p->next;
}
if(p=0)
{〃在隊(duì)尾插入
item->next=O;
8
q->next=item;
)
else
{〃在q之后、P之前插入
item->next=p;
q->next=item;
)
)
voidpushback_queue(PCB*queue,PCB*item)
{〃將item插入到隊(duì)列的尾部
PCB*p,*q;
q=queue;p=q->next;
while(p!=0)
(
q=p;
p=p->next;
)
item->next=q->next;
q->next=item;
}
voidsort_queue(PCB*&queue)
{〃對(duì)queue中的結(jié)點(diǎn)進(jìn)行排序,按照優(yōu)先級(jí)從大到小
PCB*temp=newPCB;
temp->next=O;
while(queue->next)
{
PCB*p;
p=queue->next;queue->next=p->next;
::insert_queue(temp,p);
)
queue->next二temp->next;
deletetemp;
/*生成進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列,顯示進(jìn)程信息*/
voidinsert()
9
PCB*newp=O;
staticlongid=0;
newp=newPCB;
id++;
newp->ID=id;
newp->State=O;
newp->CPUtime=0;
newp->priority=rand()%3+l;
newp->ALLtime=rand()%3+l;
newp->next=NULL;
::pushback_queue(ready_queue,newp);〃將新生成進(jìn)程插入到就緒隊(duì)列尾部
print(newp);
cout<<("\t建立:Creating->ready\n〃);
}
/*生成n個(gè)進(jìn)程屬性信息,插入進(jìn)程就緒隊(duì)列,顯示進(jìn)程信息*/
voidinsert(intn)
{
for(inti=l;i<=n;i++)
(
insert();
}
)
/*產(chǎn)生idle進(jìn)程,輸入用戶(hù)進(jìn)程數(shù)目,調(diào)用insert。*/
voidinit0
(
〃為每個(gè)隊(duì)列設(shè)立頭結(jié)點(diǎn),便于插入刪除操作
block_queue=newPCB;
block_queue->next=0;
ready_queue=newPCB;
ready_queue->next=O;
inti,pcb_number=-l;
idleprocess=NULL;/*設(shè)置閑逛進(jìn)程PCB各字段值*/
idleprocess=(PCB*)malloc(sizeof(PCB));
idleprocess->ID=0;
idleprocess->State=0;
10
idleprocess->CPUtime=0;
idleprocess->priority=0;
idleprocess->ALLtime=l;
idleprocess->next二NULL;
〃閑逛進(jìn)程放入就緒隊(duì)列
idleprocess->next=ready_queue->next;
ready_queue->next=idleprocess;
//也可假定初始時(shí)系統(tǒng)中只有一個(gè)idle進(jìn)程
〃〃輸入初始時(shí)進(jìn)程的個(gè)數(shù)
//while(pcb_number<0)
//{
//cout<<(,zInputthenumberofthePCBtobestarted/7);
//cin>>pcb_number;
//)
//cout<<C\nIDpriorityCPUtimeALLtimeState");
//for(i=0;i<pcb_number;i++)
//insert();
cout<〈〃就緒隊(duì)列初始化成功〃<Xendl;
::print_init(ready_queue);
cout?endl;
}
/*調(diào)用destroy。,將進(jìn)程插入阻塞隊(duì)列*/
voidblock(PCB*pcb)
{〃將pcb插入到阻塞隊(duì)列
pcb->State=2;/*將PCB所指進(jìn)程的狀態(tài)設(shè)置為阻塞*/
pcb->CPUtime-=2;/*設(shè)進(jìn)程執(zhí)行半個(gè)時(shí)間片單位后被阻塞*/
/*pcb->next=NULL;*/
print(pcb);
cout?(,z變遷2:running->blocked\n,z);
〃將pcb插入到阻塞隊(duì)列
〃按照什么方式插入呢,需要參考喚醒條件
〃因?yàn)槭请S機(jī)喚醒一個(gè)進(jìn)程,所以我們就簡(jiǎn)單地把它放置在阻塞隊(duì)列的頭部
pcb->next=block_queue->next;
blockqueue->next=pcb;
11
voidupdate(PCB*pcb)
{〃就緒隊(duì)列中進(jìn)程的優(yōu)先級(jí)均增加1
PCB*temp=ready_queue->next;
while(temp&&temp->next)
{〃就緒隊(duì)列的最后一個(gè)是閑逛進(jìn)程
temp->priority++;
temp=temp->next;
)
)
/*運(yùn)行參數(shù)PCB所指的進(jìn)程*/
voidrun(PCB*pcb)
(
〃如果pcb是閑逛進(jìn)程,則不做處理,再次放入就緒隊(duì)列ready_queue
if(pcb->ID==0)
(
::insert_queue(ready_queue,pcb);
print(pcb);
cout<<〃變遷1:ready->running\n/z;
)
else
{〃如果不是閑逛進(jìn)程,則進(jìn)行如下處理
pcb->State=l;/*設(shè)置該進(jìn)程的狀態(tài)為〃運(yùn)行〃*/
pcb->CPUtime+=4;/*累計(jì)該進(jìn)程占用CPU的時(shí)間*/
pcb->priority=pcb->priority-3;/*每運(yùn)行一個(gè)時(shí)間片,其優(yōu)先數(shù)減3*/
if(pcb->priority<l)pcb->priority=l;
print(pcb);
printf(,z變遷1:ready->running\n/z);
if(rand()%3=l)/*PCB不是閑逛進(jìn)程,滿(mǎn)足條件則阻塞此進(jìn)程*/
{
if(pcb->CPUtime-2<pcb->ALLtime)
block(pcb);
else
{〃已經(jīng)執(zhí)行完畢,應(yīng)該銷(xiāo)毀進(jìn)程
cout?endl;
cout<<z,\ttheprocessno”<<pcb-iscompleted!銷(xiāo)毀:
running->Destroy^?endl;
12
deletepcb;
else
{〃否則看改進(jìn)程是否執(zhí)行完畢,如果執(zhí)行完,則釋放,否則再次放入就緒隊(duì)列
if(pcb->CPUtime>=pcb->ALLtime)
{〃釋放
cout?endl;
cout<</z\ttheprocessno,/<<pcb->ID?/ziscompleted!銷(xiāo)毀:
running->Destroy^?endl;
deletepcb;
}
else
{〃再次放入就緒隊(duì)列,按照優(yōu)先級(jí)有序
::insert_queue(ready_queue,pcb);
}
)
)
update(ready_queue);/*更新就緒隊(duì)列進(jìn)程優(yōu)先數(shù)*/
if(rand()%5=l)
{
insert(3);/*創(chuàng)建3個(gè)新進(jìn)程*/
::sort_queue(ready_queue);
)
if(rand()%7==1)
wakeup();/*喚醒一個(gè)進(jìn)程*/
/*返回當(dāng)前進(jìn)程是否被阻塞,1(已阻塞),0(未阻塞)*/
)
/*喚醒,即從阻塞隊(duì)列中選擇一個(gè)PCB,且插入就緒隊(duì)列中*/
voidwakeup()
{〃隨機(jī)喚醒一個(gè)阻塞進(jìn)程
〃這里采取的方法是遍歷阻塞隊(duì)列,每訪問(wèn)一個(gè),就產(chǎn)生一個(gè)隨機(jī)數(shù)
〃如果該隨機(jī)數(shù)對(duì)20求余恰好是1,則當(dāng)前結(jié)點(diǎn)被喚醒,就要納入就緒隊(duì)列
if(block_queue->next=0)〃此時(shí)沒(méi)有被阻塞的進(jìn)程,無(wú)所謂喚醒
return;
PCB*q,*p;〃下面遍歷阻塞隊(duì)列,q永遠(yuǎn)指向p的前驅(qū)
while(true)
13
q=block_queue;
p=q->next;
while(p&&rand()%20!=l)
(
q二P;
p=p->next;
}
if(p!=0)
{〃P就是要喚醒的進(jìn)程
q->next=p->next;
break;
}
)
p->State=0;
cout<<endl;
::print(p);
cout?/z變遷3:blocked->ready,z<<endl;
::insert_queue(ready_queue,p);
/*優(yōu)先權(quán)優(yōu)先調(diào)度算法*〃/zzt
voidproc_priority()
{
::sort_queue(ready_queue);
PCB*temp=0,*running=0;/"running的PCB指針*/
inttimes;
//block_queue=NULL;/*阻塞隊(duì)列為空*/
//for(times=O;times<300;times++)
for(times=0;times<10;times++)
(
〃找到優(yōu)先級(jí)最高的進(jìn)程,并且從隊(duì)列中刪除
cout<<〃本次調(diào)度前:〃<<endl;
::print_init(ready_queue);
running=ready_queue->next;/"running指向就緒隊(duì)列隊(duì)首PCB*/
ready_queue->next=running->next;
14
cout?endl;
cout<<〃本次調(diào)度開(kāi)始〃<<endl;
::run(running);
cout〈<"\n本次調(diào)度結(jié)束。“<<endl;
}
〃/*輪轉(zhuǎn)法進(jìn)程調(diào)用算法的模擬由學(xué)生設(shè)計(jì)并予以實(shí)現(xiàn)。*/
voidproc_loop()
1.1.6思考題
1.請(qǐng)仔細(xì)閱讀動(dòng)態(tài)優(yōu)先權(quán)的進(jìn)程調(diào)度算法的模擬實(shí)現(xiàn)代碼,說(shuō)明該算法與教材中介
紹的算法做了那些簡(jiǎn)單化處理。
2.在實(shí)際的進(jìn)程調(diào)度中,除了按調(diào)度算法選擇下一個(gè)執(zhí)行的進(jìn)程外,還應(yīng)處理哪些
工作?
3.為什么對(duì)進(jìn)程的優(yōu)先數(shù)可按上述原則進(jìn)行修改?
4.請(qǐng)給出設(shè)計(jì)實(shí)現(xiàn)的輪轉(zhuǎn)法進(jìn)程調(diào)度算法的設(shè)計(jì)思想。
5.說(shuō)明這兩種調(diào)度算法的應(yīng)用場(chǎng)合,分析采用不同算法對(duì)系統(tǒng)性能的影響。
15
1.2動(dòng)態(tài)分區(qū)存儲(chǔ)管理
1.2.1實(shí)驗(yàn)?zāi)康?/p>
了解動(dòng)態(tài)分區(qū)分配中使用的數(shù)據(jù)結(jié)構(gòu)和分配算法,并進(jìn)一步加深對(duì)動(dòng)態(tài)分區(qū)存儲(chǔ)管
理方式及其實(shí)現(xiàn)過(guò)程的理解。
1.2.2實(shí)驗(yàn)內(nèi)容
1.用c語(yǔ)言或C++語(yǔ)言分別實(shí)現(xiàn)采用首次適應(yīng)算法和最佳適應(yīng)算法的動(dòng)態(tài)分區(qū)分配
過(guò)程alloc()和回收過(guò)程free()。其中,空閑分區(qū)通過(guò)空閑分區(qū)鏈表來(lái)管理,在進(jìn)行內(nèi)存分
配時(shí),系統(tǒng)優(yōu)先使用空閑區(qū)低端的空間。
假設(shè)初始狀態(tài)如下,可用的內(nèi)存空間為640KB,并有下列的請(qǐng)求序列;
作業(yè)1申請(qǐng)130KB
作業(yè)2申請(qǐng)60KB
作業(yè)3申請(qǐng)100KB
作業(yè)2釋放60KB
作業(yè)4申請(qǐng)200KB
作業(yè)3釋放100KB
作業(yè)1釋放130KB
作業(yè)5申請(qǐng)140KB
作業(yè)6申請(qǐng)60KB
作業(yè)7申請(qǐng)50KB
作業(yè)6釋放60KB
請(qǐng)分別采用首次適應(yīng)算法和最佳適應(yīng)算法進(jìn)行內(nèi)存塊的分配和回收,同時(shí)顯示內(nèi)存
塊分配和回收后空閑內(nèi)存分區(qū)鏈的情況。
1.2.3思考題
1.采用首次適應(yīng)算法和最優(yōu)置換算法,對(duì)內(nèi)存的分配和回收速度會(huì)造成什么不同的
影響?
2.如何解決因碎片而造成內(nèi)存分配速度降低的問(wèn)題?
16
1.3請(qǐng)求調(diào)頁(yè)存儲(chǔ)管理
1.3.1實(shí)驗(yàn)?zāi)康?/p>
通過(guò)對(duì)頁(yè)面、頁(yè)表、地址轉(zhuǎn)換和頁(yè)面置換過(guò)程的模擬,加深對(duì)請(qǐng)求調(diào)頁(yè)系統(tǒng)的原理
和實(shí)現(xiàn)過(guò)程的理解。
1.3.2實(shí)驗(yàn)內(nèi)容
1.假設(shè)每個(gè)頁(yè)面中可存放10條指令,分配給作業(yè)的內(nèi)存塊數(shù)為4。
2.用C語(yǔ)言或C++語(yǔ)言模擬一個(gè)作業(yè)的執(zhí)行過(guò)程,該作業(yè)共有320條指令,即它的
地址空間為32頁(yè),目前它的所有頁(yè)都還未調(diào)入內(nèi)存。在模擬過(guò)程中,如果所訪問(wèn)的指令
已在內(nèi)存,則顯示其物理地址,并轉(zhuǎn)下一條指令。如果所訪問(wèn)的指令還未裝入內(nèi)存,則
發(fā)生缺頁(yè),此時(shí)需記錄缺頁(yè)的次數(shù),并將相應(yīng)頁(yè)調(diào)入內(nèi)存。如果4個(gè)內(nèi)存塊均已裝入該
作業(yè),則需進(jìn)行頁(yè)面置換,最后顯示其物理地址,并轉(zhuǎn)下一條指令。
在所有320指令執(zhí)行完畢后,請(qǐng)計(jì)算并顯示作業(yè)運(yùn)行過(guò)程中發(fā)生的缺頁(yè)率。
3.置換算法:請(qǐng)分別考慮最佳置換算法(OPT)、先進(jìn)先出(FIFO)算法和最近最
久未使用(LRU)算法。
4.作業(yè)中指令的訪問(wèn)次序按下述原則生成;
50%的指令是順序執(zhí)行的;
25%的指令是均勻分布在前地址部分;
25%的指令均勻分布在后地址部分。
具體的實(shí)現(xiàn)辦法是:
(1)在[0,319]之間隨機(jī)選取一條起始執(zhí)行指令,其序號(hào)為m;
(2)順序執(zhí)行下一條指令,其序號(hào)為m+1條指令;
(3)通過(guò)隨機(jī)數(shù),跳轉(zhuǎn)到前地址部分[0,m-1]中的某條指令處,其序號(hào)為ml;
(4)順序執(zhí)行下一條指令,即序號(hào)為ml+1的指令;
(5)通過(guò)隨機(jī)數(shù),跳轉(zhuǎn)到后地址部分[ml+2,319]中的某條指令處,其序號(hào)為m2;
(6)順序執(zhí)行下一條指令,則序號(hào)為m2+l的指令;
(7)重復(fù)跳轉(zhuǎn)到前地址部分,順序執(zhí)行,跳轉(zhuǎn)到后地址部分;順序執(zhí)行的過(guò)程,直
至執(zhí)行320條指令。
17
1.3.3思考題
1.如果增加分配給作業(yè)的內(nèi)存塊數(shù),將會(huì)對(duì)作業(yè)運(yùn)行過(guò)程中的缺頁(yè)率產(chǎn)生什么影
響?
2.為什么在一般情況下,LRU具有比FIFO更好的性能?
18
1.4文件管理系統(tǒng)
1.4.1實(shí)驗(yàn)?zāi)康?/p>
通過(guò)設(shè)計(jì)一個(gè)多用戶(hù)文件系統(tǒng),了解操作系統(tǒng)中文件的組織與管理,熟悉文件管理
所用的數(shù)據(jù)結(jié)構(gòu),加深對(duì)文件系統(tǒng)內(nèi)部功能實(shí)現(xiàn)過(guò)程的理解。
1.4.2實(shí)驗(yàn)內(nèi)容
1.用C語(yǔ)言或C++語(yǔ)言設(shè)計(jì)一個(gè)最多包括N個(gè)用戶(hù)的多用戶(hù)文件系統(tǒng),約定每個(gè)
用戶(hù)最多保存M個(gè)文件。同時(shí)限制一個(gè)用戶(hù)在進(jìn)入系統(tǒng)后,最多打開(kāi)L個(gè)文件。
2.系統(tǒng)應(yīng)具備一定的健壯性。即能夠檢查用戶(hù)所輸入命令的正確性,出錯(cuò)時(shí)顯示出
必要的信息。另外,對(duì)文件需設(shè)置必要的保護(hù)措施。
3.文件目錄結(jié)構(gòu)采用兩級(jí)目錄結(jié)構(gòu):主文件目錄和用戶(hù)文件目錄
(1)主文件目錄的數(shù)據(jù)結(jié)構(gòu)
typedefstructMFD
{charusername[100];/*用戶(hù)名*/
charpassword[100];/*用戶(hù)口令*/
FILEfp;/*文件目錄指針*/
}MFD;
MFDmainfd[N];/*主文件目錄數(shù)組*/
(2)用戶(hù)文件目錄的數(shù)據(jù)結(jié)構(gòu)
typedefstructUFD
{charfilename[256];/*文件名*/
charprotect;/*保護(hù)碼*/
intlength;/*文件長(zhǎng)度*/
}UFD;
UFDuserfd[M];/*用戶(hù)目錄數(shù)組*/
(3)打開(kāi)文件目錄
typedefstructOFD
{charfilename[256];/*打開(kāi)文件名*/
charopencode;/*打開(kāi)保護(hù)碼*/
intfp;/*讀寫(xiě)指針*/
)OFD;
OFDopenfd[L];/*打開(kāi)文件目錄數(shù)組*/
19
(4)用戶(hù)命令數(shù)據(jù)結(jié)構(gòu)
typedefstructCOMM
{charstring[256];/*用戶(hù)命令串*/
structCOMM*next;/*指向命令各參數(shù)所在的結(jié)點(diǎn)*/
JCOMM;
5.本實(shí)驗(yàn)要求提供以下有關(guān)操作:
dir用于查看系統(tǒng)的當(dāng)前用戶(hù)。
help提供幫助系統(tǒng),讓用戶(hù)了解各種命令的格式及功能。
login用于用戶(hù)登錄,用戶(hù)第1次登錄時(shí)必須設(shè)置自己的口令,以后必須根據(jù)口令
進(jìn)入系統(tǒng)。
logout用戶(hù)退出系統(tǒng)。
setpass用于用戶(hù)修改自己的口令。
create用于創(chuàng)建新文件。
open用于打開(kāi)文件。
close用于關(guān)閉文件。
copy用于復(fù)制文件。
delete用于刪除文件。
rename用于文件名改名。
read用于讀文件內(nèi)容。
write用于寫(xiě)文件內(nèi)容。
注:
(1)對(duì)文件只有在打開(kāi)(/r/w/d)的情況下,才能讀、寫(xiě)、更名、復(fù)制、刪除。
(2)操作結(jié)束后,用戶(hù)退出系統(tǒng),應(yīng)關(guān)閉所有已打開(kāi)的文件。
(3)為了簡(jiǎn)化系統(tǒng)設(shè)計(jì),實(shí)現(xiàn)文件的修改時(shí),可以只修改指針,并不要求進(jìn)行實(shí)際
的文件操作。
(4)關(guān)于C語(yǔ)言或C++語(yǔ)言的文件操作,請(qǐng)參閱“C語(yǔ)言程序設(shè)計(jì)教程”,“C++教
在O
20
1.4.3程序流程圖
1.4.4供參考的部分程序代碼
#include<io.h>
#include<conio.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<ctype.h>
#defineN30/*用戶(hù)數(shù)*/
#defineM20/*一個(gè)用戶(hù)可保存M個(gè)文件*/
#defineL5/*用戶(hù)只能一次打開(kāi)L個(gè)文件*/
typedefstructMFD/*主文件目錄*/
21
charusername[100];
charpassword[100];
FILEfp;/*文件指針*/
}MFD;
typedefstructUFD/*用戶(hù)文件目錄*/
charfilename[256];
charprotect;/*保護(hù)碼*/
intlength;/*文件長(zhǎng)度*/
}UFD;
typedefstructOFD/*打開(kāi)文件目錄*/
charfilename[256];
charopencode;/*打開(kāi)保護(hù)碼*/
intfp;/*讀寫(xiě)指針*/
}OFD;
typedefstructCOMM/*命令串*/
i
charstring[256];/*命令*/
structCOMM*next;/*后繼指針*/
}COMM;
MFDmainfd[N];/*主文件目錄數(shù)組*/
UFDuserfdfM];/*用戶(hù)文件目錄數(shù)組*/
OFDopenfd[L];/*打開(kāi)文件目錄數(shù)組*/
COMM"command;/*命令串指針*/
charusername[10];
intusernum,savenum,opennum;
intworkfile;
voidinit();
voidinit_ufd();/*初始化用戶(hù)文件目錄*/
voidmesg();
char*getpass();/*設(shè)置口令函數(shù)聲明*/
22
char*getuser();/*設(shè)置用戶(hù)函數(shù)聲明*/
COMM*readcommand();/*讀命令串函數(shù)聲明*/
voidlogin();/*用戶(hù)登錄*/
voidlogout();/*用戶(hù)注銷(xiāo)*/
voidsetpass();/*設(shè)置口令*/
voidcreate();
voidmydelete();/*刪除*/
voidmyread();/*讀*/
voidmyopen();/*打開(kāi)*/
voidmyclose();/*關(guān)閉*/
voidmywrite();/*寫(xiě)*/
voidhelp();/*幫助*/
voiddir();/*列文件目錄*/
voidmycopy();/*復(fù)制*/
voidmyrename();/*文件改名*/
voidmain()
(
init();
for(;;)
readcommand();
if(strcmp(command->string,"create,,)==0)
create();
elseif(strcmp(command->string,ndelete")==0)
mydelete();
elseif(strcmp(command->string,nopenn)==0)
myopen();
elseif(strcmp(command->string,nclose")==0)
myclose();
elseif(strcmp(command->string,Hread")==0)
myread();
elseif(strcmp(command->string,,,write,,)==0)
mywrite();
elseif(strcmp(command->string,"copy")==0)
mycopy();
elseif(strcmp(command->string,nrename")==0)
myrename();
23
elseif(strcmp(command->string,nloginn)==0)
login();
elseif(strcmp(command->string,"setpassH)==0)
setpass();
elseif(strcmp(command->string,"logout")==0)
logout();
elseif(strcmp(command->string,"helpn)==0)
help();
elseif(strcmp(command->string,,,dir',)==0)
dir();
elseif(strcmp(command->string,"exit")==0)
break;
else
mesg(nBadcommand!");
}
)
voidinit()
(
FILE*fp;/*文件指針*/
chartempname[20],temppass[20];
inti;
usernum=0;/*全局變量初始化*/
savenum=0;
opennum=0;
strcpy(username,";
/*用戶(hù)使用時(shí),建立一個(gè)mainfile.txt文件,包括每個(gè)用戶(hù)的用戶(hù)名和口令*/
/*然后,才能運(yùn)行此程序*/
if((fp=fopen(nmainfile.txt","r"))!=NULL)
(
/*i=o;*/
while(!feof(fp))
(
strcpy(tempname,";
fgets(tempname,20,fp);/*讀用戶(hù)名*/
if(strcmp(tempname,n")!=O)
(
fgets(temppass,20,fp);
tempname[strlen(tempname)-1]='\0*;/*設(shè)置串結(jié)束符*/
24
temppass[strlen(temppass)-l]=,\O';
strcpy(mainfd[usernum].username,tempname);/*生成mainfd數(shù)組*/
strcpy(mainfd[usemum].password,temppass);/*生成userfd數(shù)組*/
usemum++;/*生成usemum的值*/
)
)
fclose(fp);
}
)
voidinit_ufd(char*usemame)/*初始化用戶(hù)文件目錄*/
(
FILE*fp;
chartempfile[100],tempprot;
inttemplength;
savenum=0;
opennum=0;
workfile=-1;
if((fp=fopen(usemame,"r+n))!=NULL)/*按用戶(hù)名打開(kāi)文件*/
while(!feof(fp))
strcpy(tempfile,"");
fgets(tempfile,50,fp);/*從fp文件中設(shè)置一個(gè)長(zhǎng)50的串*/
if(strcmp(tempfile,n,,)!=O)
fscanf(fp,n%c",&tempprot);
fscanf(fp,"%d",&templength);
tempfile[strlen(tempfile)-l]=,\O,;
strcpy(userfd[savenum].filename,tempfile);/*文件名*/
userfd[savenum].protect=tempprot;/*保護(hù)碼*/
userfd[savenum].length=templength;/*文件長(zhǎng)度*/
savenum++;
fgets(tempfile,50,fp);
}
25
char*getuser()
(
charusemame[20];
chartemp;
inti;
username[0]='\0*;
for(i=0;i<10;)
{
while(!kbhit());/*按用戶(hù)名規(guī)則輸入用戶(hù)名*/
temp=getch();
if(isalnum(temp)11temp==,_,lltemp==13)
(
username[i]=temp;
if(username[i]==13)
(
usemame[i]=,\O,;
break;
)
putchar(temp);
i++;
usemame[i]=\O*;
}
)
return(username);
}
char*getpass()
(
charpassword[20];
chartemp;
inti;
password[0]='\0,;
for(i=0;i<10;)
while(!kbhit
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年生物醫(yī)學(xué)工程面試題集生物材料與醫(yī)療設(shè)備研發(fā)
- 2026年AI物流管理優(yōu)化方案設(shè)計(jì)練習(xí)題
- 物聯(lián)網(wǎng)技術(shù)與應(yīng)用實(shí)踐考核試題2026年
- 2026年機(jī)械工程設(shè)計(jì)與制造工藝流程分析題庫(kù)
- 2026年經(jīng)濟(jì)學(xué)基礎(chǔ)理論自測(cè)題集
- 2026年高級(jí)經(jīng)濟(jì)師專(zhuān)業(yè)知識(shí)與實(shí)務(wù)練習(xí)題
- 植物油脫色除臭處理方案
- 2026年網(wǎng)絡(luò)安全與隱私保護(hù)知識(shí)競(jìng)賽試題初級(jí)
- 2026年森林抗旱應(yīng)急滅火演練方案
- 衛(wèi)生院“三基三嚴(yán)”培訓(xùn)計(jì)劃實(shí)施方案
- 2026年洪湖市事業(yè)單位人才引進(jìn)100人參考考試題庫(kù)及答案解析
- 北京市海淀區(qū)2025一2026學(xué)年度第一學(xué)期期末統(tǒng)一檢測(cè)歷史(含答案)
- 小拇指培訓(xùn)課件
- 緊急護(hù)理人力資源應(yīng)急資源儲(chǔ)備
- GB/T 22182-2025油菜籽葉綠素含量的測(cè)定分光光度計(jì)法
- 2026吉林長(zhǎng)春汽車(chē)經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)招聘編制外輔助崗位人員69人考試備考試題及答案解析
- 2024年基層社會(huì)治理專(zhuān)題黨課
- 消防培訓(xùn)案例課件
- 電梯安全使用登記與定期檢驗(yàn)管理制度
- 廣告?zhèn)髅巾?xiàng)目投標(biāo)文件范本
- 房屋過(guò)戶(hù)給子女的協(xié)議書(shū)的范文
評(píng)論
0/150
提交評(píng)論