第一篇:操作系統(tǒng)第一次實(shí)驗(yàn)報(bào)告(大全)
操作 系統(tǒng) 實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)名稱:
線程 控制實(shí)驗(yàn)
計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院
目錄
一、實(shí)驗(yàn)?zāi)康暮鸵?2 二、實(shí)驗(yàn)內(nèi)容 2 三、實(shí)驗(yàn)步驟 2 四、實(shí)驗(yàn)結(jié)果與分析 3 1.單線程 3 2.單線程(睡眠 4s)3 3.多線程 4 4.多線程(每個(gè)子線程睡眠 1s)4 5.單線程與多線程對(duì)比 5 五、程序源代碼 5 1.單線程實(shí)驗(yàn)代碼 5 2.單線程實(shí)驗(yàn)代碼 6 六、實(shí)驗(yàn)體會(huì) 7
一、實(shí)驗(yàn)?zāi)康暮鸵?/p>
通過本實(shí)驗(yàn)掌握在 Linux 操作系統(tǒng)中遵循 Posix線程標(biāo)準(zhǔn)接口進(jìn)行多線程程序編程,熟練掌握線程的創(chuàng)建 pthread_create(),線程的終止 pthread_exit(),等待線程合并 pthread_join()等線程控制操作,利用信號(hào)量或者互斥鎖實(shí)現(xiàn)線程建的同步。
二、實(shí)驗(yàn)內(nèi)容
問題:求 1000000 個(gè)浮點(diǎn)數(shù)(精確到小數(shù)點(diǎn)后 4 位)的平均值(和,最大值,最小值),具體的問題描述流程圖如下圖圖 1 所示:
三、實(shí)驗(yàn) 步驟
1、隨機(jī)生成 1000000個(gè)浮點(diǎn)數(shù); 2、創(chuàng)建 4個(gè)子線程,分別求 250000個(gè)浮點(diǎn)數(shù)之和; 3、完成 1000000 個(gè)浮點(diǎn)數(shù)之和并打印結(jié)果; 4、統(tǒng)計(jì)多線程并發(fā)執(zhí)行完成計(jì)算的時(shí)間; 5、寫一個(gè)單線程程序,同樣完成 1000000 個(gè)隨機(jī)數(shù)求和的計(jì)算,統(tǒng)計(jì)計(jì)算時(shí)間,并和前面結(jié)果進(jìn)行對(duì)比; 6、讓單線程程序睡眠四秒鐘、多線程程序各子程序睡一秒的條件下(兩個(gè)程序總的睡眠時(shí)間相同),對(duì)比執(zhí)行結(jié)果; 7、分析兩次對(duì)比結(jié)果的差異,寫出自己的見解。
四、實(shí)驗(yàn)結(jié)果與分析 1、單線程完成 1000000 個(gè)浮點(diǎn)數(shù)的求和運(yùn)算所用的時(shí)間情況如下圖圖 2 所示:
圖 圖 2 單線程計(jì)算 時(shí)間
分析:實(shí)驗(yàn)中每次隨機(jī)產(chǎn)生一個(gè) 0 到 1 之間的浮點(diǎn)數(shù),1000000 個(gè)這樣的數(shù)相加的話的平總和大概就在 500000 左右(按照隨機(jī)數(shù)的平均值原理),實(shí)驗(yàn)中 sum=,顯然結(jié)果正確,整個(gè)計(jì)算運(yùn)行時(shí)間為。
2、單線程完成 1000000 個(gè)浮點(diǎn)數(shù)的求和運(yùn)算,單線程中睡眠 4 秒鐘,所用的時(shí)間情況如下圖圖3 所示:
圖 圖 3 單線程計(jì)算 時(shí)間(睡眠 4 秒)分析:根據(jù)上一次單線程的執(zhí)行情況來看,這一次讓單線程睡眠 4 秒鐘,最后執(zhí)行時(shí)間剛好就是4 秒加上計(jì)算時(shí)間。也就是說計(jì)算 1000000 個(gè)浮點(diǎn)數(shù)的總和平均時(shí)間約為。
3、四個(gè)子線程共同完成 1000000 個(gè)浮點(diǎn)數(shù)的求和計(jì)算所用時(shí)間情況如下圖圖 4所示:
圖 圖 4 多線程計(jì)算時(shí)間
分析:因?yàn)檫@次是 4 個(gè)子線程并發(fā)運(yùn)行,每個(gè)子線程只需計(jì)算 250000個(gè)浮點(diǎn)數(shù)的總和,理想情況下這時(shí)候的運(yùn)行時(shí)間應(yīng)該是這單線程中計(jì)算時(shí)間的四分之一。從圖中可以看到執(zhí)行時(shí)間是,很顯然這個(gè)時(shí)間約為單線程求 1000000 個(gè)浮點(diǎn)數(shù)之和的時(shí)間()的四分之一,符合預(yù)期的結(jié)果。
4、四個(gè)子線程共同完成 1000000 個(gè)浮點(diǎn)數(shù)的求和計(jì)算,其中每個(gè)子線程睡眠 1 秒鐘,最終所用時(shí)間情況如下圖圖 5所示:
圖 圖 5 多線程計(jì)算時(shí)間(每個(gè) 子線程眠 睡眠 1 秒)
分析:這里四個(gè)子線程每個(gè)子線程睡眠一秒,但由于四個(gè)子線程并發(fā)同步的在執(zhí)行,當(dāng)一個(gè)子線程在睡眠時(shí),另外一個(gè)子線程卻仍然在繼續(xù)求和計(jì)算,因此他們一起合作同步完成1000000個(gè)浮點(diǎn)數(shù)的計(jì)算所需的時(shí)間就是 1 秒加上上圖中不睡眠的時(shí)候的計(jì)算時(shí)間。從圖中可以
看到≈1s+,所以最終的結(jié)果符合預(yù)期值。
5、單線程計(jì)算時(shí)間(睡眠 4s)與多線程計(jì)算時(shí)間(每個(gè)子線程睡眠 1s)對(duì)比效果如下圖圖 6 所示:
圖 圖 6 單線程(睡眠 4s)與 與 多線程(每個(gè)眠 子線程睡眠 1s)計(jì)算時(shí)間 對(duì)比圖 五、程序源代碼 /************************* *FileName:
*Author:
*Date:2013/11/22 ***************************/ #include <> #include <> #include <> #include <> #include
int i;
srand(time(NULL));
for(i=0;i { SUM +=(float)(rand()/(float)RAND_MAX); } sleep(4);} int main(){ pthread_t p; int result; float time; struct timeval start; struct timeval end; gettimeofday(&start,NULL); result=pthread_create(&p,NULL,ADD,NULL); if(result!=0) { printf(“Create Thread of ADD Failuren”); exit(-1); } pthread_join(p,NULL); gettimeofday(&end,NULL); time =((float)-*1000000+(float) -)/1000000; printf(“Signal_Thread_Sum:%.4fn”,SUM); printf(“Signal_Thread_Execution_Time:%.4fs(sleep 4 sec)n”,time); return 0;} /************************* *FileName: *Author:wangtao *Date:2013/11/22 ***************************/ #include <> #include <> #include <> #include <> #include int i; srand(time(NULL)); for(i=0;i { pthread_mutex_lock(&mutex); SUM +=(float)((float)rand()/RAND_MAX); pthread_mutex_unlock(&mutex); } printf(“pthread%d:%.4fn”,*k,SUM); sleep(1);} int main(void){ pthread_t p1,p2,p3,p4; int result1,result2,result3,result4; int k1=1,k2=2,k3=3,k4=4; struct timeval start; struct timeval end; float time; gettimeofday(&start,NULL); pthread_mutex_init(&mutex,NULL); result1=pthread_create(&p1,NULL,(void*)ADD,&k1); result2=pthread_create(&p2,NULL,(void*)ADD,&k2); result3=pthread_create(&p3,NULL,(void*)ADD,&k3); result4=pthread_create(&p4,NULL,(void*)ADD,&k4); if(result1!=0||result2!=0||result3!=0||result4!=0) { printf(“Create Child Thread Failure!n”); exit(1); } pthread_join(p1,NULL); pthread_join(p2,NULL); pthread_join(p3,NULL); pthread_join(p4,NULL); gettimeofday(&end,NULL); time =((float)-*1000000 +(float)-)/1000000; printf(“SUM = %.4fn”,SUM); printf(“Multi_thread_time = %.4fs(Each child thread sleep 1 sec)n”,time); return 0;} 六、實(shí)驗(yàn)體會(huì) 這是第一次使用多線程編程編寫代碼,第一次直觀感受到這種多線程編程對(duì)程序的執(zhí)行速率的影響。雖然說操作系統(tǒng)課程已經(jīng)上了好幾個(gè)星期了,課堂上一直在學(xué)習(xí)多線程編程的算法思想,但是那只是書面上的講授,真正直觀的感受和體會(huì)還是得依靠實(shí)驗(yàn)來了解。 因?yàn)橹熬徒佑|過 linux 系統(tǒng),所以對(duì)于程序的編譯執(zhí)行方面還是問題不大,最主要的就是代碼的編寫問題。一開始到實(shí)驗(yàn)室完全不知道要做什么,因?yàn)楦具B實(shí)驗(yàn)內(nèi)容都不知道,直到助教在大屏幕上顯示這個(gè)實(shí)驗(yàn)題目,我才開始了解實(shí)驗(yàn)的題目和要求。這里我就是想建議一下老師您可以應(yīng)該給我們實(shí)驗(yàn)題目,讓我們在實(shí)驗(yàn)前就了解一下實(shí)驗(yàn)內(nèi)容,不然到了實(shí)驗(yàn)室都不知道到底要干嘛。讀懂了解題意之后,我就開始參考所給的一些線程創(chuàng)建函數(shù)說明來編寫多線程同步完成1000000個(gè)浮點(diǎn)數(shù)的求和運(yùn)算。因?yàn)閷?duì)這些線程函數(shù)不是很了解,在使用 pthread_create()函數(shù)創(chuàng)建線程時(shí),老是傳入函數(shù)參數(shù)不對(duì),后來百度之后了解到傳入的子線程函數(shù)的類型應(yīng)該為 void *(*start_thread)(void)形式。最后運(yùn)行試驗(yàn)與單線程的進(jìn)行比較,強(qiáng)烈感受到多線程的并發(fā)同步運(yùn)行的特點(diǎn)。 總之,這次試驗(yàn)使我對(duì)課堂知識(shí)有了更深的體會(huì)和鞏固,為以后的課程學(xué)習(xí)打下了基礎(chǔ)。 許昌學(xué)院 《操作系統(tǒng)》實(shí)驗(yàn)報(bào)告書 學(xué)號(hào):姓名:閆金科班級(jí):成績: 5006140057 14物聯(lián)網(wǎng)工程 2016年02月實(shí)驗(yàn)一 Linux的安裝與配置 一、實(shí)驗(yàn)?zāi)康?/p> 1.熟悉Linux系統(tǒng)的基本概念,比如Linux發(fā)行版、宏內(nèi)核、微內(nèi)核等。2.掌握Linux系統(tǒng)的安裝和配置過程,初步掌握Linux系統(tǒng)的啟動(dòng)和退出方法。3.熟悉Linux系統(tǒng)的文件系統(tǒng)結(jié)構(gòu),了解Linux常用文件夾的作用。 二、實(shí)驗(yàn)內(nèi)容 1.從網(wǎng)絡(luò)上下載VMware軟件和兩個(gè)不同Linux發(fā)行版鏡像文件。2.安裝VMware虛擬機(jī)軟件。 3.在VMware中利用第一個(gè)鏡像文件完成第一個(gè)Linux的安裝,期間完成網(wǎng)絡(luò)信息、用戶信息、文件系統(tǒng)和硬盤分區(qū)等配置。 4.在VMware中利用第二個(gè)鏡像文件完成第二個(gè)Linux的安裝,并通過LILO或者GRUB解決兩個(gè)操作系統(tǒng)選擇啟動(dòng)的問題。 5.啟動(dòng)Linux系統(tǒng),打開文件瀏覽器查看Linux系統(tǒng)的文件結(jié)構(gòu),并列舉出Linux常用目錄的作用。 三、實(shí)驗(yàn)過程及結(jié)果 1、啟動(dòng)VMware,點(diǎn)擊新建Linux虛擬機(jī),如圖所示: 2、點(diǎn)擊下一步,選擇經(jīng)典型,點(diǎn)擊下一步在選擇客戶機(jī)頁面選擇Linux,版本選擇Red Hat Enterprise Linux 5,如圖所示: 3、點(diǎn)擊下一步創(chuàng)建虛擬機(jī)名稱以及所要安裝的位置,如圖所示: 4、點(diǎn)擊下一步,磁盤容量填一個(gè)合適大小,此處選擇默認(rèn)值大小10GB,如圖所示: 5、點(diǎn)擊完成,點(diǎn)擊編輯虛擬機(jī)設(shè)置,選擇硬件選項(xiàng)中的CD-ROM(IDE...)選項(xiàng),在右側(cè)連接中選擇“使用ISO鏡像(I)”選項(xiàng),點(diǎn)擊“瀏覽”,找到Linux的鏡像文件,如圖所示: 6點(diǎn)擊確定按鈕后,點(diǎn)擊啟動(dòng)虛擬機(jī)按鈕,來到Linux的安裝界面,如圖所示: 7、到此頁面之后,等待自動(dòng)檢測安裝,如圖所示: 8、等到出現(xiàn)如圖所示頁面后點(diǎn)擊“skip”按鈕,跳過檢測,直接進(jìn)入安裝設(shè)置界面,如圖所示: 9、安裝設(shè)計(jì)界面如圖所示: 10、點(diǎn)擊Next按鈕進(jìn)入設(shè)置語言界面,設(shè)置語言為“簡體中文”,如圖所示: 11、點(diǎn)擊Nest按鈕進(jìn)入系統(tǒng)鍵盤設(shè)置按鈕,設(shè)置系統(tǒng)鍵盤為“美國英語式”,如圖所示: 12、點(diǎn)擊下一步按鈕,彈出“安裝號(hào)碼”對(duì)話框,選擇跳過輸入安裝號(hào)碼,如圖所示: 13、按照提示,一直點(diǎn)擊下一步按鈕,如圖所示: 14、到設(shè)置最后一步,點(diǎn)擊下一步按鈕進(jìn)入開始安裝Red Hat Enterprise Linux Sever界面,如圖所示: 15、安裝完成后,進(jìn)入歡迎界面,按照提示點(diǎn)擊前進(jìn)按鈕知道進(jìn)入Linux桌面,如圖所示: 16、安裝成功的Linux系統(tǒng)桌面如圖所示,桌面包含五個(gè)圖標(biāo),分別為:計(jì)算機(jī)、jk’s Home、回收站、RHEL/5.3 i386DVD。 四、實(shí)驗(yàn)總結(jié) 通過安裝虛擬機(jī)等操作讓我認(rèn)識(shí)到Linux這系統(tǒng)一些基本特點(diǎn),本次試驗(yàn)學(xué)會(huì)了安裝虛擬機(jī)并且使用虛擬機(jī)安裝操作系統(tǒng),掌握了紅帽Linux系統(tǒng)的安裝和配置過程,以及對(duì)鏡像ISO文件的使用,有別于我們機(jī)器上使用的系統(tǒng),通過虛擬機(jī)這個(gè)軟件還可以在已有系統(tǒng)的基礎(chǔ)上使用其他操作系統(tǒng)。安裝過程中一定要注意選擇版本的時(shí)候要選擇Red Hat Enterprise Linux 5版本,否則安裝不能成功。自己動(dòng)手成功的安裝了Linux系統(tǒng),自己對(duì)Linux的學(xué)習(xí)產(chǎn)生更大的興趣。 實(shí)驗(yàn)二 Linux操作系統(tǒng)的運(yùn)行模式 一、實(shí)驗(yàn)?zāi)康?/p> 1.熟悉Linux系統(tǒng)終端工作環(huán)境的使用,了解Linux命令的格式,使用學(xué)會(huì)利用常用的Linux命令來完成系統(tǒng)的管理和維護(hù)。 2.了解X-Windows的特點(diǎn),熟悉Linux圖形用戶接口的使用,掌握GNOME桌面環(huán)境的基本操作。 3.了解和掌握在Linux環(huán)境下安裝軟件包的方法,如QQ for Linux等用軟件的安裝方法。 二、實(shí)驗(yàn)內(nèi)容 1.啟動(dòng)Linux系統(tǒng)打開虛擬終端界面,使用Linux的在線幫助指令man或help獲得ls、uname、date、cal、mkdir、cp等Linux命令的幫助手冊,了解這些命令的具體使用方法。同時(shí),也可以通過執(zhí)行“命令名 –help”來顯示該命令的幫助信息,如“l(fā)s –help”,試用這些命令。 2.通過uname命令的執(zhí)行,查看并給出相關(guān)系統(tǒng)信息:操作系統(tǒng)的名稱、系統(tǒng)域名、系統(tǒng)CPU名稱等。 3.在主目錄下創(chuàng)建一個(gè)名為myetc的子目錄,將/etc目錄下與網(wǎng)絡(luò)相關(guān)的文件和子目錄拷貝到該目錄,并將這些文件的執(zhí)行權(quán)限設(shè)置為可執(zhí)行。 4.在主目錄/home下創(chuàng)建目錄program、music 和temp,然后在program下建立目錄java和C,列出完成該過程的所有命令。 5.在圖形界面環(huán)境中,查看GNOME桌面的面板和桌面,設(shè)置GNOME,包括屏幕保護(hù)程序、更改背景和指定關(guān)聯(lián)程序等。6.實(shí)現(xiàn)對(duì)光盤的加載和訪問,然后卸載。 三、實(shí)驗(yàn)過程及結(jié)果 1、打開終端,輸入 【ls –help】來查看【ls】指令的使用方法,同理查看uname、date、cal、mkdir、cp的使用方法。 2、在終端中輸入【uname –a】顯示操作系統(tǒng)名系統(tǒng)cpu名和系統(tǒng)域名 3、重啟系統(tǒng),用【root】用戶名進(jìn)入系統(tǒng),以獲得權(quán)限。在終端中輸入【mkdir myetc】,在主目錄下創(chuàng)建【myrtc】的目錄,【ls】查看是否創(chuàng)建。輸入【cd..】返回至【/】文件,輸入【cp –r etc root/myetc】講etc中內(nèi)容復(fù)制到myetc中,進(jìn)入myetc文件【ls】查看。輸入 【chmod u+x etc】賦予文件可執(zhí)行的權(quán)限,輸入【ll】查看。 4、在home下,輸入【mkdir {program,music,temp}】,可在home下創(chuàng)立這三個(gè)目錄,輸入【ls】查看。在program下輸入【mkdir{java,C}】,可創(chuàng)立java和C兩個(gè)目錄,【ls】查看。 5、在桌面上方選擇【系統(tǒng)】-【首選項(xiàng)】,即可設(shè)置屏幕保護(hù)程序和更改背景和指定關(guān)聯(lián)程序 5、在桌面上可見看到有CD光盤,雙擊瀏覽,右鍵【彈出】即卸載。 四、實(shí)驗(yàn)總結(jié)和體會(huì) Linux的指令系統(tǒng)是學(xué)習(xí)Linux操作系統(tǒng)很重要的一部分,指令系統(tǒng)相當(dāng)于在Windows操作系統(tǒng)下的doc,可以省去圖形化界面。通過這次的實(shí)驗(yàn)讓我了解了Linux的強(qiáng)大功能,了解到Linux有許多方便快捷的設(shè)置基本配置的方法,這使我更喜歡上Linux的使用。在使用指令的過程中,有時(shí)候?qū)ξ募牟僮餍枰欢ǖ臋?quán)限,這時(shí)需要在登陸時(shí)用戶名使用【root】,而不是我們在安裝時(shí)使用的用戶名,這樣就獲得了管理員權(quán)限,可以對(duì)一些系統(tǒng)文件進(jìn)行操作。 實(shí)驗(yàn)三 Linux應(yīng)用軟件與系統(tǒng)管理 一、實(shí)驗(yàn)?zāi)康?/p> 1.了解OpenOffice.Org集成辦公軟件,掌握利用OpenOffice.Org的套件來完成文檔和圖片的處理。 2.了解Linux網(wǎng)絡(luò)管理的知識(shí),熟悉Linux網(wǎng)絡(luò)配置的方法,掌握在Linux環(huán)境下配置Web服務(wù)器和ftp服務(wù)的方法。 二、實(shí)驗(yàn)內(nèi)容 1.配置Linux系統(tǒng)的網(wǎng)絡(luò)環(huán)境,安裝FTP和Web服務(wù)器,并配置相關(guān)的屬性,利用FTP實(shí)現(xiàn)WINDOWS和Linux之間的數(shù)據(jù)交換。 2.利用FTP程序上傳自己的照片到FTP服務(wù)器,利用OpenOffice的文字處理工具OpenOffice Writer制作一份表格形式的個(gè)人簡歷。個(gè)人簡歷中至少包含學(xué)號(hào)、姓名、性別、專業(yè)、照片和學(xué)習(xí)經(jīng)歷等內(nèi)容,并保存為網(wǎng)頁格式(html格式)。3.將個(gè)人簡歷網(wǎng)頁設(shè)置為WEB服務(wù)器的首頁,然后在客戶端利用瀏覽器訪問WEB服務(wù)器,查看效果。 4.通過讀取proc文件系統(tǒng),獲取系統(tǒng)各種信息(如主機(jī)名、系統(tǒng)啟動(dòng)時(shí)間、運(yùn)行時(shí)間、版本號(hào)、所有進(jìn)程信息、CPU使用率等),并以比較容易的方式顯示。 三、實(shí)驗(yàn)過程及結(jié)果 1.配置網(wǎng)絡(luò)環(huán)境:在(服務(wù).cmd).里面進(jìn)行以下操作:在服務(wù)里選擇3按回車 完成后,可在本地連接看到VMware已連接上網(wǎng)絡(luò) 在虛擬機(jī)設(shè)置中設(shè)置以太網(wǎng)網(wǎng)絡(luò)連接方式為 網(wǎng)關(guān)地址填虛擬機(jī)的網(wǎng)管,IP地址設(shè)為虛擬機(jī)的一個(gè)子網(wǎng): 四、總結(jié): 在linux系統(tǒng)下,make是我們經(jīng)常用到的編譯命令,所以關(guān)于make代碼和他的操作指令一定要記清楚。所以,熟練掌握了make和makefile工具之后,源碼安裝軟件就變的像windows下安裝軟件一樣簡單。 實(shí)驗(yàn)四 進(jìn)程控制與管理 一、實(shí)驗(yàn)?zāi)康?/p> 1.掌握GCC編譯器的用法,學(xué)會(huì)利用GCC編輯器來編輯C語言程序,學(xué)會(huì)利用GDB調(diào)試器來調(diào)試C語言程序。 2.理解進(jìn)程和程序的區(qū)別和聯(lián)系,3.掌握在Linux環(huán)境下觀察進(jìn)程運(yùn)行情況和CPU工作情況的命令。4.了解fork()系統(tǒng)調(diào)用,掌握利用fork()創(chuàng)建進(jìn)程的方法。 5.了解Linux系統(tǒng)其他與進(jìn)程相關(guān)的系統(tǒng)調(diào)用,如exec、wait和exit等。6.了解Linux常用的進(jìn)程通信機(jī)制。 二、實(shí)驗(yàn)內(nèi)容 1.利用Linux的進(jìn)程管理命令ps、top來監(jiān)視和跟蹤進(jìn)程,體會(huì)進(jìn)程和程序的關(guān)系。2.利用Linux的文字編輯器編寫文件復(fù)制的C語言程序,并用gcc編譯該程序,然后運(yùn)行該程序。 3.編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。 4.修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter ?'及'son ??',父進(jìn)程顯示 'parent ??',觀察結(jié)果,分析原因。5.用fork()創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec()用新的程序替換該子進(jìn)程的內(nèi)容。 三、實(shí)驗(yàn)過程及結(jié)果 1、利用Linux的進(jìn)程管理命令ps、top來監(jiān)視和跟蹤進(jìn)程,體會(huì)進(jìn)程和程序的關(guān)系。<1>從用戶身份切換到ROOT身份 <2>輸入命令 ps 查看進(jìn)程 <2>輸入命令 top 跟蹤進(jìn)程 2、利用Linux的文字編輯器編寫一個(gè)計(jì)算機(jī)100個(gè)自然數(shù)和的C語言程序,并用gcc編譯該程序,然后運(yùn)行該程序。 <1>創(chuàng)建一個(gè).C文件 并進(jìn)入進(jìn)行編輯 <2>用GCC 進(jìn)行編譯,再查看文件,發(fā)現(xiàn)產(chǎn)生執(zhí)行文件 a.out <3>執(zhí)行這個(gè)可執(zhí)行文件得到結(jié)果5050 1、編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。 <1>穿件一個(gè).C文件 并進(jìn)行編寫程序代碼 <2>反復(fù)執(zhí)行2次該程序 <3>可以看出兩次執(zhí)行的結(jié)果 a b c 出現(xiàn)的順序不同,原因是,3個(gè)進(jìn)程的輸出次序是隨機(jī)的,并不會(huì)按規(guī)定的順序出現(xiàn),所以會(huì)出現(xiàn)上述結(jié)果。 4、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter ?'及'son ??',父進(jìn)程顯示 'parent ??',觀察結(jié)果,分析原因。<1>重新修改代碼 <3>執(zhí)行這段程序 <4>原分析: 因和之前一樣,可以看出執(zhí)行的結(jié)果 3個(gè)單詞出現(xiàn)的順序不同,原因是,3個(gè)進(jìn)程的輸出次序是隨機(jī)的,并不會(huì)按規(guī)定的順序出現(xiàn),所以會(huì)出現(xiàn)上述結(jié)果。 5、用fork()創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec()用新的程序替換該子進(jìn)程的內(nèi)容。<1> 編寫代碼 <2> 執(zhí)行的結(jié)果 結(jié)果表明 execl 替代了son的內(nèi)容 四、實(shí)驗(yàn)總結(jié)和體會(huì) 這個(gè)實(shí)驗(yàn)考察的是進(jìn)程之間存在很多可能性以及對(duì)編輯器的使用。本次實(shí)驗(yàn)學(xué)習(xí)了在linux環(huán)境下用gcc編譯器運(yùn)行c語言程序,在linux環(huán)境下編寫程序用到了vi編輯器,知道了該編輯器也需要各種命令來操作。編寫C語言程序時(shí)用到了fork()函數(shù),再調(diào)用execl()用新的程序替換該子進(jìn)程的內(nèi)容。 實(shí)驗(yàn)五 進(jìn)程調(diào)度模擬程序的設(shè)計(jì)與實(shí)現(xiàn) 一、實(shí)驗(yàn)?zāi)康?/p> 1.了解進(jìn)程調(diào)度的概念,掌握常用進(jìn)程調(diào)度算法的原理。2.掌握Linux程序設(shè)計(jì)編輯、編譯和調(diào)試的技巧。 二、實(shí)驗(yàn)內(nèi)容 1.編寫程序?qū)崿F(xiàn)進(jìn)程調(diào)度調(diào)度算法先來先服務(wù)、優(yōu)先級(jí)高優(yōu)先和時(shí)間片輪轉(zhuǎn)調(diào)度算法。(編程語言不限) 2.輸入數(shù)據(jù),輸出運(yùn)行結(jié)果。 三、實(shí)驗(yàn)過程及結(jié)果 1先來先服務(wù) #i nclude struct { int id; float ArriveTime;float RequestTime;float StartTime;float EndTime;float RunTime;float DQRunTime;int Status;}arrayTask[4];GetTask(){ int i;float a; for(i=0;i<4;i++){arrayTask[i].id=i+1;printf(“input the number”); printf(“input the the ArriveTime of arrayTask[%d]:”,i);scanf(“%f”,&a); arrayTask[i].ArriveTime=a; printf(“input the RequestTime of arrayTask[%d]:”,i);scanf(“%f”,&a); arrayTask[i].RequestTime=a;arrayTask[i].StartTime=0;arrayTask[i].EndTime=0;arrayTask[i].RunTime=0;arrayTask[i].Status=0; } } int fcfs() { int i,j,w=0; for(i=0;i<4;i++) { if(arrayTask[i].Status==0) { t=arrayTask[i].ArriveTime; w=1; } if(w==1) break; } for(i=0;i<4;i++) { if(arrayTask[i].ArriveTime t=arrayTask[i].ArriveTime; } for(i=0;i<4;i++) { if(arrayTask[i].ArriveTime==t) return i; } } int sjf(){ int i,x=0,a=0,b=0;float g; for(i=0;i<4;i++){ if(arrayTask[i].Status==1){g=arrayTask[i].EndTime;x=1;} } if(x==0){ t=arrayTask[0].ArriveTime; for(i=0;i<4;i++){ if(arrayTask[i].ArriveTime t=arrayTask[i].ArriveTime;a=i;} } return a;} else { for(i=0;i<4;i++){ if(arrayTask[i].EndTime>g)g=arrayTask[i].EndTime;} for(i=0;i<4;i++){ if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g){ t=arrayTask[i].RequestTime;a=i;b=1;} /*判斷有沒有進(jìn)程在前個(gè)進(jìn)程完成前到達(dá)*/ } if(b!=0)/*有進(jìn)程到達(dá)則按SJF*/ { for(i=0;i<4;i++){ if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i].RequestTime return a;} else{ /*否則按FCFS*/ for(i=0;i<4;i++) {if(arrayTask[i].Status==0)t=arrayTask[i].ArriveTime;} for(i=0;i<4;i++){ if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime return a;} } } new(int s)/*定義執(zhí)行進(jìn)程后相關(guān)數(shù)據(jù)的修改*/ { int i,g=0;for(i=0;i<4;i++){ if(arrayTask[i].Status==0)continue;else { g=1;break;} } if(g==0)/*當(dāng)處理的是第一個(gè)未執(zhí)行的進(jìn)程時(shí)執(zhí)行*/ { arrayTask[s].StartTime=arrayTask[s].ArriveTime; arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;arrayTask[s].RunTime=arrayTask[s].RequestTime;arrayTask[s].Status=1;g=2;} if(g==1)/*當(dāng)處理的不是第一個(gè)未執(zhí)行的進(jìn)程時(shí)執(zhí)行*/ { arrayTask[s].Status=1;for(i=0;i<4;i++){ if(arrayTask[i].Status==1)d=arrayTask[i].EndTime;} for(i=0;i<4;i++)/*查找最后執(zhí)行的進(jìn)程的完成時(shí)間*/ { if(arrayTask[i].EndTime>d&&arrayTask[i].Status==1)d=arrayTask[i].EndTime;} if(arrayTask[s].ArriveTime arrayTask[s].StartTime=arrayTask[s].ArriveTime; arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;} arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;} Printresult(int j)/*定義打印函數(shù)*/ { printf(“%dt”,arrayTask[j].id); printf(“%5.2ft”,arrayTask[j].ArriveTime);printf(“%5.2ft”,arrayTask[j].RequestTime);printf(“%5.2ft”,arrayTask[j].StartTime);printf(“%5.2ft”,arrayTask[j].EndTime);printf(“%5.2ft”,arrayTask[j].RunTime);printf(“%5.2fn”,arrayTask[j].DQRunTime);} main(){ int i,b,k,a,c=0;int d[4];clrscr(); printf(“t F.FCFS n”);printf(“t S.SFJ n”);printf(“t Q.EXIT n”);for(i=0;;i++){ if(c)break; printf(“please input the number a:n”);scanf(“%d”,&a);switch(a){ case Q: c=1;break; case F:printf(“please input the different-ArriveTime of arrayTasksn”);GetTask(); printf(“*****************************the result of fcfsn”);printf(“NumbertArrivetServertStarttFinishtTurnovetTake power turnover timen”); for(b=0;b<4;b++)/*調(diào)用兩個(gè)函數(shù)改變結(jié)構(gòu)體數(shù)的值*/ { k=fcfs();d[b]=k;new(k);} for(b=0;b<4;b++) Printresult(d[b]);/*調(diào)用打印函數(shù)打出結(jié)果*/ continue; case S: printf(“please input the different-RequestTime of array Tasksn”);GetTask(); printf(“******************************the result of sjfn”);printf(“NumbertArrivetRequesttStarttEndtRuntDQRun timen”);for(b=0;b<4;b++){ k=sjf();d[b]=k;new(k);} for(b=0;b<4;b++)Printresult(d[b]);continue; default:printf(“the number Error.please input another number!n”);} } } 四、實(shí)驗(yàn)總結(jié)和體會(huì) 通過做本實(shí)驗(yàn),讓我對(duì)進(jìn)程或作業(yè)先來先服務(wù)、高優(yōu)先權(quán)、按時(shí)間片輪轉(zhuǎn)調(diào)度算法以及進(jìn)程調(diào)度的概念和算法,有了更深入的認(rèn)識(shí)!理解進(jìn)程的狀態(tài)及變化,動(dòng)態(tài)顯示每個(gè)進(jìn)程的當(dāng)前狀態(tài)及進(jìn)程的調(diào)度情況。進(jìn)程調(diào)度是處理機(jī)管理的核心內(nèi)容。優(yōu)先級(jí)高優(yōu)先是根據(jù)作業(yè)的優(yōu)先級(jí),總是選擇優(yōu)先級(jí)最高者進(jìn)入隊(duì)列。輪轉(zhuǎn)調(diào)度算法是調(diào)度程序每次把CPU分配給就緒隊(duì)列首進(jìn)程/線程使用規(guī)定的時(shí)間間隔,就緒隊(duì)列中都路保留巡行一個(gè)時(shí)間片。 實(shí)驗(yàn)二 進(jìn)程調(diào)度 1.目的和要求 通過這次實(shí)驗(yàn),理解進(jìn)程調(diào)度的過程,進(jìn)一步掌握進(jìn)程狀態(tài)的轉(zhuǎn)變、進(jìn)程調(diào)度的策略,進(jìn)一步體會(huì)多道程序并發(fā)執(zhí)行的特點(diǎn),并分析具體的調(diào)度算法的特點(diǎn),掌握對(duì)系統(tǒng)性能的評(píng)價(jià)方法。 2.實(shí)驗(yàn)內(nèi)容 閱讀教材《計(jì)算機(jī)操作系統(tǒng)》第二章和第三章,掌握進(jìn)程管理及調(diào)度相關(guān)概念和原理。 編寫程序模擬實(shí)現(xiàn)進(jìn)程的輪轉(zhuǎn)法調(diào)度過程,模擬程序只對(duì)PCB進(jìn)行相應(yīng)的調(diào)度模擬操作,不需要實(shí)際程序。假設(shè)初始狀態(tài)為:有n個(gè)進(jìn)程處于就緒狀態(tài),有m個(gè)進(jìn)程處于阻塞狀態(tài)。采用輪轉(zhuǎn)法進(jìn)程調(diào)度算法進(jìn)行調(diào)度(調(diào)度過程中,假設(shè)處于執(zhí)行狀態(tài)的進(jìn)程不會(huì)阻塞),且每過t個(gè)時(shí)間片系統(tǒng)釋放資源,喚醒處于阻塞隊(duì)列隊(duì)首的進(jìn)程。 程序要求如下: 1)輸出系統(tǒng)中進(jìn)程的調(diào)度次序; 2)計(jì)算CPU利用率。 3.實(shí)驗(yàn)環(huán)境 Windows操作系統(tǒng)、VC++6.0 C語言 4設(shè)計(jì)思想: (1) 程序中進(jìn)程可用PCB表示,其類型描述如下: struct PCB_type { int pid; //進(jìn)程名 int state; //進(jìn)程狀態(tài) 2——表示“執(zhí)行”狀態(tài) 1——表示“就緒”狀態(tài) 0——表示“阻塞”狀態(tài) int cpu_time;//運(yùn)行需要的CPU時(shí)間(需運(yùn)行的時(shí)間片個(gè)數(shù)) } 用PCB來模擬進(jìn)程; (2)設(shè)置兩個(gè)隊(duì)列,將處于“就緒”狀態(tài)的進(jìn)程PCB掛在隊(duì)列ready中;將處于“阻塞”狀態(tài)的進(jìn)程PCB掛在隊(duì)列blocked中。隊(duì)列類型描述如下: struct QueueNode{ struct PCB_type PCB; Struct QueueNode *next;} 并設(shè)全程量: struct QueueNode *ready_head=NULL,//ready隊(duì)列隊(duì)首指針 *ready_tail=NULL , //ready隊(duì)列隊(duì)尾指針 *blocked_head=NULL,//blocked隊(duì)列隊(duì)首指針 *blocked_tail=NULL;//blocked隊(duì)列隊(duì)尾指針(3)設(shè)計(jì)子程序: start_state(); 讀入假設(shè)的數(shù)據(jù),設(shè)置系統(tǒng)初始狀態(tài),即初始化就緒隊(duì)列和阻塞隊(duì)列。 dispath(); 模擬調(diào)度,當(dāng)就緒隊(duì)列的隊(duì)首進(jìn)程運(yùn)行一個(gè)時(shí)間片后,放到就緒隊(duì)列末尾,每次都是隊(duì)首進(jìn)程進(jìn)行調(diào)度,一個(gè)進(jìn)程運(yùn)行結(jié)束就從就緒隊(duì)列中刪除,當(dāng)?shù)絫個(gè)時(shí)間片后,喚醒阻塞隊(duì)列隊(duì)首進(jìn)程。 calculate(); 就緒進(jìn)程運(yùn)行一次,usecpu加1,當(dāng)就緒隊(duì)列為空時(shí)unusecpu加1,CPU利用率為use_cpu/(use_cpu+unuse_cpu)。 5源代碼: #include struct PCB_type { int pid; //進(jìn)程名 int state; //進(jìn)程狀態(tài) //2--表示“執(zhí)行”狀態(tài) //1--表示“就緒”狀態(tài) //0--表示“阻塞”狀態(tài) int cpu_time;//運(yùn)行需要的CPU時(shí)間(需運(yùn)行的時(shí)間片個(gè)數(shù))};struct QueueNode{ struct PCB_type PCB; struct QueueNode *next;};struct QueueNode *ready_head=NULL,//ready隊(duì)列隊(duì)首指針 *ready_tail=NULL,//ready隊(duì)列隊(duì)尾指針 *block_head=NULL,//blocked隊(duì)列隊(duì)首指針 *block_tail=NULL; //blocked隊(duì)列隊(duì)尾指針 int use_cpu,unuse_cpu; void start_state()//讀入假設(shè)的數(shù)據(jù),設(shè)置系統(tǒng)初始狀態(tài) { int n,m; int i; struct QueueNode *p,*q; printf(“輸入就緒節(jié)點(diǎn)個(gè)數(shù)n:”); scanf(“%d”,&n); printf(“輸入阻塞節(jié)點(diǎn)個(gè)數(shù)m:”); scanf(“%d”,&m); p=(struct QueueNode *)malloc(sizeof(struct QueueNode)); p->next =NULL; ready_head=ready_tail=p; for(i=0;i { p=(struct QueueNode *)malloc(sizeof(struct QueueNode)); p->next =NULL; p->PCB.state=1; printf(“輸入就緒進(jìn)程%d的pid和cpu_time:”,i+1); scanf(“%d%d”,&p->PCB.pid,&p->PCB.cpu_time); ready_tail->next=p; ready_tail=p; } q=(struct QueueNode *)malloc(sizeof(struct QueueNode)); q->next =NULL; block_head=block_tail=q; for(i=0;i { q=(struct QueueNode *)malloc(sizeof(struct QueueNode)); q->next=NULL; q->PCB.state=0; printf(“輸入阻塞進(jìn)程%d的pid和cpu_time:”,i+1); scanf(“%d%d”,&q->PCB.pid,&q->PCB.cpu_time); block_tail->next=q; block_tail=q; } printf(“n處于就緒狀態(tài)的進(jìn)程有:n”); p=ready_head->next; i=1; while(p) {printf(“進(jìn)程%d的pid和cpu_time:%5d%5d%5dn“,i,p->PCB.pid,p->PCB.state,p->PCB.cpu_time); p=p->next; i++; } } void dispath() //模擬調(diào)度 { int x=0,t; use_cpu=0; unuse_cpu=0; printf(”輸入t:“); scanf(”%d“,&t); printf(”開始調(diào)度n“); while(ready_head!=ready_tail||block_head!=block_tail) { struct QueueNode *p,*q; if(ready_head!=ready_tail) { p=ready_head->next; ready_head->next=p->next; p->next=NULL; if(ready_head->next==NULL) { ready_tail=ready_head; } p->PCB.state=2; printf(”進(jìn)程%d調(diào)度t“,p->PCB.pid); state和 use_cpu++; x++; p->PCB.cpu_time--; if(p->PCB.cpu_time) { ready_tail->next=p; ready_tail=p; } else { printf(”進(jìn)程%d完成t“,p->PCB.pid); free(p); } } else { unuse_cpu++; x++; printf(”空閑一個(gè)時(shí)間片t“); } if(x==t&&block_head!=block_tail) { q=block_head->next; block_head->next=q->next; q->next=NULL; if(block_head->next==NULL) { block_tail=block_head; } ready_tail->next=q; ready_tail=q; x=0; } } } void calculate() //計(jì)算CPU利用率 { printf(”ncpu的利用率%.2fn“,(float)use_cpu/(use_cpu+unuse_cpu)); } void main(){start_state(); dispath(); calculate();} 6運(yùn)行結(jié)果: 7實(shí)驗(yàn)總結(jié): 實(shí)驗(yàn)幫我復(fù)習(xí)了數(shù)據(jù)結(jié)構(gòu)和C語言,且鞏固課本知識(shí),知道了如何定義結(jié)構(gòu)體,如何在鏈接隊(duì)列中增刪節(jié)點(diǎn)。模擬進(jìn)程調(diào)度幫我們鞏固了進(jìn)程三狀態(tài)之間的變遷。懂得調(diào)式的重要性??傊覀兠靼琢死碚撀?lián)系實(shí)際。多看書,多上機(jī)。 實(shí)驗(yàn)三 可變分區(qū)存儲(chǔ)管理 1.目的和要求 通過這次實(shí)驗(yàn),加深對(duì)內(nèi)存管理的認(rèn)識(shí),進(jìn)一步掌握內(nèi)存的分配、回收算法的思想。 2.實(shí)驗(yàn)內(nèi)容 閱讀教材《計(jì)算機(jī)操作系統(tǒng)》第四章,掌握存儲(chǔ)器管理相關(guān)概念和原理。編寫程序模擬實(shí)現(xiàn)內(nèi)存的動(dòng)態(tài)分區(qū)法存儲(chǔ)管理。內(nèi)存空閑區(qū)使用自由鏈管理,采用最壞適應(yīng)算法從自由鏈中尋找空閑區(qū)進(jìn)行分配,內(nèi)存回收時(shí)假定不做與相鄰空閑區(qū)的合并。 假定系統(tǒng)的內(nèi)存共640K,初始狀態(tài)為操作系統(tǒng)本身占用64K。在t1時(shí)間之后,有作業(yè)A、B、C、D分別請(qǐng)求8K、16K、64K、124K的內(nèi)存空間;在t2時(shí)間之后,作業(yè)C完成;在t3時(shí)間之后,作業(yè)E請(qǐng)求50K的內(nèi)存空間;在t4時(shí)間之后,作業(yè)D完成。要求編程序分別輸出t1、t2、t3、t4時(shí)刻內(nèi)存的空閑區(qū)的狀態(tài)。 3.實(shí)驗(yàn)環(huán)境 Windows操作系統(tǒng)、VC++6.0 C語言 4.設(shè)計(jì)思想 模擬內(nèi)存分配和回收,要設(shè)置兩個(gè)鏈隊(duì)列,一個(gè)空閑區(qū)鏈和一個(gè)占用區(qū)鏈,空閑區(qū)鏈節(jié)點(diǎn)有起始地址,大小和指向下一節(jié)點(diǎn)的指針等數(shù)據(jù)域,占用區(qū)鏈節(jié)點(diǎn)有起始地址,大小,作業(yè)名和指向下一節(jié)點(diǎn)的指針等數(shù)據(jù)域,本實(shí)驗(yàn)用最壞適應(yīng)算法,每次作業(yè)申請(qǐng)內(nèi)存都是從空閑鏈隊(duì)頭節(jié)點(diǎn)分配,如果相等,就刪除空閑頭結(jié)點(diǎn),如果小于申請(qǐng)的,就不分配,否則就劃分內(nèi)存給作業(yè),剩下的內(nèi)存大小,重新插入空閑鏈隊(duì),按從大到小,接著把作業(yè)占用的內(nèi)存放到占用區(qū)鏈節(jié)點(diǎn)的末尾。每次作業(yè)運(yùn)行完,就要回收其占用的內(nèi)存大小,把作業(yè)節(jié)點(diǎn)按從大到小插入到空閑鏈隊(duì)中。5.源代碼: #include struct freelinkNode *next;};struct busylinkNode{ char name; int len;int address;struct busylinkNode *next;};struct freelinkNode *free_head=NULL; //自由鏈隊(duì)列(帶頭結(jié)點(diǎn))隊(duì)首指針 struct busylinkNode *busy_head=NULL; //占用區(qū)隊(duì)列隊(duì)(帶頭結(jié)點(diǎn))首指針 struct busylinkNode *busy_tail=NULL; //占用區(qū)隊(duì)列隊(duì)尾指針 void start(void)/* 設(shè)置系統(tǒng)初始狀態(tài)*/ { struct freelinkNode *p; struct busylinkNode *q; free_head=(struct freelinkNode*)malloc(sizeof(struct freelinkNode)); free_head->next=NULL;// 創(chuàng)建自由鏈頭結(jié)點(diǎn) busy_head=busy_tail=(struct busylinkNode*)malloc(sizeof(struct busylinkNode)); busy_head->next=NULL;// 創(chuàng)建占用鏈頭結(jié)點(diǎn) p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode)); p->address=64; p->len=640-64;//OS占用了64K p->next=NULL; free_head->next=p; q=(struct busylinkNode *)malloc(sizeof(struct busylinkNode)); q->name='S';/* S表示操作系統(tǒng)占用 */ q->len=64;q->address=0;q->next=NULL; busy_head->next=q;busy_tail=q;} void requireMemo(char name, int require)/*模擬內(nèi)存分配*/ { freelinkNode *w,*u,*v;busylinkNode *p;if(free_head->next->len>=require){ p=(struct busylinkNode*)malloc(sizeof(struct busylinkNode)); p->name=name; p->address=free_head->next->address; p->len=require; p->next=NULL; busy_tail->next=p; busy_tail=p;} else printf(”Can't allocate“); w=free_head->next; free_head->next=w->next; if(w->len==require) { free(w);} else { w->address=w->address+require; w->len=w->len-require;} u=free_head; v=free_head->next; while((v!=NULL)&&(v->len>w->len)){ u=v; v=v->next;} u->next=w; w->next=v;} void freeMemo(char name)/* 模擬內(nèi)存回收*/ { int len; int address;busylinkNode *q,*p;freelinkNode *w,*u,*v;q=busy_head; p=busy_head->next; while((p!=NULL)&&(p->name!=name)) { q=p; p=p->next;} if(p==NULL){ printf(”%c is not exist“,name);} else { if(p==busy_tail) { busy_tail=q; } else { q->next=p->next; len=p->len; address=p->address; free(p); w=(struct freelinkNode*)malloc(sizeof(struct freelinkNode)); w->len=len; w->address=address; u=free_head; v=free_head->next; while((v!=NULL)&&(v->len>len)) { u=v;v=v->next; } u->next=w; w->next=v; } } } void past(int time)/* 模擬系統(tǒng)過了time 時(shí)間*/ { printf(”過了時(shí)間%d后:n“,time);} void printlink()/* 輸出內(nèi)存空閑情況(自由鏈的結(jié)點(diǎn))*/ { freelinkNode *p; printf(”內(nèi)存的空閑情況為:n“); p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode)); p=free_head->next; while(p!=NULL) { printf(”內(nèi)存的起始地址和內(nèi)存的大小%5dt%5d:n",p->address,p->len); p=p->next; } } void main(){ int t1=1,t2=2,t3=3,t4=4; start(); past(t1); requireMemo('A',8); requireMemo('B',16); requireMemo('C',64); requireMemo('D',124); printlink(); past(t2); freeMemo('C'); printlink(); past(t3); requireMemo('E',50); printlink(); past(t4); freeMemo('D'); printlink();} 6.運(yùn)行結(jié)果: 7.實(shí)驗(yàn)總結(jié): 鞏固編程能力,和調(diào)式能力,復(fù)習(xí)課本知識(shí),明白理論聯(lián)系實(shí)際的重要性,動(dòng)手能力非常重要,多看書,多獨(dú)立思考,品味痛苦的過程,享受成功的喜悅。 操作系統(tǒng)實(shí)驗(yàn)報(bào)告 院系:數(shù)計(jì)學(xué)院 班級(jí):大類6班 學(xué)號(hào):100511624 姓名:明章輝 指導(dǎo)教師:徐軍利 實(shí)驗(yàn)報(bào)告一 一、實(shí)驗(yàn)?zāi)康?/p> 通過本實(shí)驗(yàn),掌握Linux的基本操作以及Linux的文本編輯,對(duì)Linux有一個(gè)基本的了解。 二、實(shí)驗(yàn)任務(wù) 1、Linux的基本操作 1)在圖形交互方式下實(shí)現(xiàn)對(duì)用戶、用戶組和文件的管理。要求使用圖形交互界面添加一個(gè)用戶“mary”(密碼1234)和一個(gè)用戶組“dancer”,并將用戶Mary添加到dancer組中,最后在Mary目錄下建立一個(gè)名為test1的文件。 2)在命令方式下實(shí)現(xiàn)對(duì)用戶、用戶組和文件的管理。要求在命令交互方式下完成添加一個(gè)用戶(以自己的名字命名),并以此用戶名登錄。3)用Vi編輯器建立一個(gè)名為test2的文件,并輸入指定內(nèi)容。 2、掌握Vi文本編輯器的使用 使用Vi編輯器建立、編輯、顯示以及加工處理文本文件。1)進(jìn)入和退出vi。 2)利用文本插入方式建立一個(gè)文件test2。輸入以下內(nèi)容: To the only woman that I love, For many years you have been my wife We've been through much together I love you dearly with my life and could not have picked much better.3)在新建的文本文件上移動(dòng)光標(biāo)。 4)對(duì)文本文件執(zhí)行刪除、復(fù)原、修改等操作。 三、實(shí)驗(yàn)設(shè)備 VMware虛擬機(jī)下的Linux操作系統(tǒng) 四、實(shí)驗(yàn)步驟 1、Linux的基本操作 第一步:添加用戶: 點(diǎn)擊“草帽”圖標(biāo)->“系統(tǒng)設(shè)置”->“用戶和組群”,出現(xiàn)“用戶管理器”界面,單擊“添加用戶”按鈕,在彈出的“創(chuàng)建新用戶”界面中創(chuàng)建用戶,用戶名為“mary”密碼為“123456” 第二步:添加用戶組: 單擊“添加組群”按鈕,在彈出的“創(chuàng)建新組群”對(duì)話框中新建組,組名為“dancer” 第三步:將用戶添加到組: 選中“mary”,點(diǎn)擊“屬性”按鈕或者是雙擊,選擇“組群”,然后將該用戶加入“dancer”中,單擊“確定”按鈕即可。 第四步:在圖形界面下創(chuàng)建和編輯文件 單擊草帽圖標(biāo),選擇附件中的文本編輯器。命名為“test1”,保存在“mary”所在的文件夾里 2、在命令方式下實(shí)現(xiàn)對(duì)用戶、用戶組和文件的管理。第一步:進(jìn)入命令行界面 桌面上單擊鼠標(biāo)右鍵,選擇“新建終端”,出現(xiàn)終端窗口和命令行提示符# 第二步:添加用戶,使用Useradd命令,格式為:useraddwangshumin 第三步:修改密碼,使用passwd命令,格式為:passwdwangshumin 第四步:注銷賬號(hào),以新建的用戶名登陸 實(shí)驗(yàn)截圖如下: 3、Vi編輯器的使用 第一步、在命令行界面系統(tǒng)提示符下輸入命令:vi test2,然后按〈Enter〉,建立新文件test2,并進(jìn)入文件test2的文本編輯狀態(tài) 第二步、命令方式下用i命令,輸入所要求輸入的文本內(nèi)容 第三步、在vi編輯器下練習(xí)刪除、瀏覽、復(fù)原等操作 第四步使用more命令查看文件內(nèi)容,格式為:more test2 實(shí)驗(yàn)截圖如下: 五、實(shí)驗(yàn)問題及解決方法 1、在添加用戶時(shí),密碼輸入四位提示錯(cuò)誤,輸入六位以上即可 2、新建用戶名時(shí)組名錯(cuò)誤,想刪除卻刪除不了,重命名之后提示用戶已存在,暫時(shí)還沒解決 3、由于不是很熟悉操作,發(fā)生了很多不必要的小錯(cuò)誤,經(jīng)摸索了解了許多。 六、實(shí)驗(yàn)心得體會(huì) 通過此次試驗(yàn),由剛開始對(duì)實(shí)驗(yàn)的不了解到基本了解了實(shí)驗(yàn)內(nèi)容,剛開始不熟悉操作,中途鬧出很多笑話,通過組員間的相互幫助,問題很快便迎刃而解,進(jìn)一步理解了合作的重要性。同時(shí)也對(duì)linux系統(tǒng)產(chǎn)生了興趣,掌握到雙系統(tǒng)的相關(guān)知識(shí)。另外,針對(duì)這個(gè)專業(yè),多動(dòng)手多實(shí)踐才是最重要,這一次實(shí)驗(yàn)下來收獲頗多,也認(rèn)識(shí)到自身所存在的不足,今后會(huì)多一份努力,多一份實(shí)踐。 Linux實(shí)驗(yàn)報(bào)告一 一、實(shí)驗(yàn)步驟及內(nèi)容 1.虛擬機(jī)軟件的安裝 (1)先準(zhǔn)備虛擬機(jī)安裝包。 (2)更改安裝路徑: “D: VMwareVMware Workstationvmware.exe” (3)輸入序列號(hào):ctrl+v,在安裝過程中不能進(jìn)行復(fù)制剪切操作。 (4)不能重新啟動(dòng),才能繼續(xù)安裝漢化版D: vmwarevmware workstation 2.新建一個(gè)虛擬機(jī)并進(jìn)行配置 (1)單擊新建虛擬機(jī)虛擬機(jī)的類型選擇:典型安裝 選擇客戶端操作系統(tǒng) :linux虛擬機(jī)的名字及位置根據(jù)需要網(wǎng)絡(luò)類型選擇:,橋接。指定的磁盤容量刪除軟驅(qū):雙擊 floppy—remove虛擬內(nèi)存設(shè)置:雙擊memory—1024MB設(shè)置linux的安裝文件:選擇安裝鏡像文件—指定第一個(gè)安裝文件—就可以啦!之后會(huì)提示安裝第二個(gè)安裝文件 就進(jìn)行選擇第二個(gè) 中間鼠標(biāo)切換用CTRL+ALT。 3.安裝LINUX操作系統(tǒng) (1)要確定鼠標(biāo)是否在虛擬機(jī)的激活狀態(tài)下:敲回車不需要檢測安裝文件選擇 skip進(jìn)入linux的安裝前的配置選項(xiàng):選擇安裝的語言—中文簡體鍵盤:--默認(rèn)鼠標(biāo):--默認(rèn)安裝類型:--workstation磁盤分區(qū):--自動(dòng)分區(qū)引導(dǎo)程序:默認(rèn)網(wǎng)絡(luò)配置:默認(rèn)防火墻:無防火墻支持的語言:中文時(shí)區(qū):亞洲-上海密碼:root123456安裝的軟件包:全部。 二 .在已有虛擬機(jī)軟件的基礎(chǔ)上安裝LINUX的技巧。 (1)新建虛擬機(jī)—典型安裝—linux ,red hat linux---給虛擬機(jī)命名,并且指定安裝位置d:red hat linux---橋接---10G。 (2)在剛才建立的虛擬機(jī)上安裝linux系統(tǒng).(3)配置要安裝的linux系統(tǒng)的安裝文件iso鏡像文件 (4)選擇配置好linux鏡像文件剛才建立的虛擬機(jī),啟動(dòng)虛擬機(jī),開始安裝。 三 .實(shí)驗(yàn)總結(jié) 充分了解linux系統(tǒng)的安裝,學(xué)會(huì)新建虛擬機(jī),在虛擬機(jī)上安裝linux系統(tǒng).和一些簡單的技巧并對(duì)此門課程有了一定的興趣。第二篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告
第三篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告
第四篇:操作系統(tǒng)實(shí)驗(yàn)報(bào)告一
第五篇:linux操作系統(tǒng)實(shí)驗(yàn)報(bào)告