操作系統(tǒng)實(shí)驗(yàn)二_第1頁
操作系統(tǒng)實(shí)驗(yàn)二_第2頁
操作系統(tǒng)實(shí)驗(yàn)二_第3頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、操作系統(tǒng)實(shí)驗(yàn)二實(shí) 驗(yàn) 報(bào) 告課程名稱 操作系統(tǒng) 實(shí)驗(yàn)項(xiàng)目 內(nèi)存管理 實(shí)驗(yàn)儀器 臺式電腦 系 別 計(jì)算機(jī)科學(xué)與技術(shù)系 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班級/學(xué)號 * 學(xué)生姓名 * 實(shí)驗(yàn)日期 2018年12月26日 成 績 指導(dǎo)教師 * 實(shí)驗(yàn)二 內(nèi)存管理實(shí)驗(yàn)時(shí)數(shù):4 學(xué)時(shí) 實(shí)驗(yàn)類別:設(shè)計(jì)型實(shí)驗(yàn)批次:1 批,1 人/組 實(shí)驗(yàn)地點(diǎn):健翔校區(qū)計(jì)算中心一、實(shí)驗(yàn)?zāi)康膬?nèi)存管理是操作系統(tǒng)的主要功能之一,本實(shí)驗(yàn)需要完成兩個(gè)并發(fā)進(jìn)程通過共享存儲(chǔ)器機(jī)制對文件的修改。通過本次實(shí)驗(yàn),能夠使學(xué)生進(jìn)一步熟練使用 Linux 內(nèi)存管理相關(guān)函數(shù)和系統(tǒng)調(diào)用進(jìn)行編程,進(jìn)而掌握內(nèi)存管理的基本功能和通過共享存儲(chǔ)器方式實(shí)現(xiàn)進(jìn)程間通信的基本原理。

2、二、實(shí)驗(yàn)環(huán)境操作系統(tǒng):任何 Unix/Linux 編譯器:gcc三、實(shí)驗(yàn)要求1學(xué)生應(yīng)完成如下章節(jié)的學(xué)習(xí):進(jìn)程和線程、調(diào)度、進(jìn)程通信、存儲(chǔ)管理。2在 Linux 操作系統(tǒng)下,使用 C 語言編程,使用相關(guān)函數(shù)和系統(tǒng)調(diào)用進(jìn)行設(shè)計(jì)實(shí)現(xiàn)四、實(shí)驗(yàn)內(nèi)容1打開當(dāng)前目錄下的文件 f1,使用系統(tǒng)調(diào)用 mmap()創(chuàng)建共享存儲(chǔ)區(qū),大小為一個(gè)頁面,將文件 f1 映射進(jìn)內(nèi)存,地址返回到 src。2使用 malloc()函數(shù)申請一個(gè)內(nèi)存塊,地址返回到 dst。申請成功后,使用 memmove()函數(shù)將共享存儲(chǔ)區(qū)的內(nèi)容復(fù)制到 dst。3使用 fork()調(diào)用創(chuàng)建一個(gè)新進(jìn)程,之后父進(jìn)程阻塞自己。4子進(jìn)程使用 memccpy(

3、)將 dst 中”W”之后內(nèi)容的地址復(fù)制到 temp,將 temp 中前2 個(gè)字符用替換。之后將修改后的 dst 的內(nèi)容使用 memmove()復(fù)制回 src,關(guān)閉文件 f1,釋放 dst。5父進(jìn)程使用 memset()將共享存儲(chǔ)區(qū) src 中前 2 個(gè)字符用“Q”替換。最后顯示經(jīng) 2 次修改后的 f1 的內(nèi)容。5、 實(shí)驗(yàn)代碼#include <>#include <>#include <>#include <>#include <>#include <>#include <sys/>#include <

4、>#include <sys/>int main() int fd, page_size; pid_t pid; f1", O_RDWR); char *src = (char *)mmap(NULL, page_size, PROT_WRITE, MAP_SHARED, fd, 0); if (src = MAP_FAILED) printf("errorn"); exit(1); /顯示 src 的內(nèi)容; printf("src 的內(nèi)容=%sn", src); /使用 malloc()函數(shù)申請一個(gè)頁面大小的內(nèi)存空間,地址返

5、回到 dst; char *dst = (char *)malloc(page_size); /使用 memmove()函數(shù)將共享存儲(chǔ)區(qū)的內(nèi)容復(fù)制到 dst; memmove(dst, src, page_size); /顯示 dst 的內(nèi)容; printf("dst 的內(nèi)容=%sn", dst); pid = fork(); if (pid = 0) /* 子進(jìn)程空間*/ /使用 memccpy()將 dst 中”W”之后內(nèi)容的地址返回到 temp; char *temp = (char *)memccpy(dst, src, 'W', page_size

6、); /顯示 temp 的內(nèi)容及其內(nèi)存起始地址; printf("temp 的內(nèi)容=%sn", temp); printf("temp 的地址=%pn", temp); /將 temp 中前 2 個(gè)字符用替換,顯示替換后的 dst 內(nèi)容; memset(temp, '', 2); printf("temp 的內(nèi)容=%sn", temp); printf("dst 的內(nèi)容=%sn", dst); /使用 memmove()將修改后的 dst 的內(nèi)容復(fù)制回 src; memmove(src, dst,

7、strlen(dst); /顯示 src 的內(nèi)容(包含 PID 及 PPID); printf("src 的內(nèi)容=%sn", src); printf("PID is: %d, PPID is: %d, The src value of end is: %snn", getpid(), getppid(), src); /*顯示src 指向的共享存儲(chǔ)區(qū)內(nèi)容*/ /關(guān)閉之前打開的文件 f1,釋放 dst; close(fd); free(dst); else if (pid > 0) /* 父進(jìn)程空間*/ wait(NULL); /使用memset(

8、)將共享存儲(chǔ)區(qū)src 中前2 個(gè)字符用”Q”替換,并顯示替換后的內(nèi)容(包含PID 及PPID); memset(src, 'Q', 2); printf("src 的內(nèi)容=%sn", src); /printf("PID is: %d, PPID is: %d, The src value of end is: %snn", /getpid(),getppid(),memset(src,'Q',2); /*顯示src 指向的共享存儲(chǔ)區(qū)內(nèi)容*/ printf("PID is: %d, PPID is: %d, Th

9、e src value of end is: %snn", getpid(), getppid(), src); /*顯示src 指向的共享存儲(chǔ)區(qū)內(nèi)容*/ /顯示經(jīng)2 次修改后的文件f1 的最終內(nèi)容; printf("The f1 result of end is:nn"); system("od -c f1"); if (munmap(src, page_size) = 0) /*釋放共享存儲(chǔ)區(qū)*/ printf("PID is: %d, PPID is: %d, munmap successnn", getpid(),

10、getppid(); else printf("PID is: %d, PPID is: %d, munmap failednn", getpid(), getppid(); return 0;6、 實(shí)驗(yàn)截圖7、 實(shí)驗(yàn)總結(jié)通過本次實(shí)驗(yàn),使我進(jìn)一步熟練使用 Linux 內(nèi)存管理相關(guān)函數(shù)和系統(tǒng)調(diào)用進(jìn)行編程,進(jìn)而掌握了內(nèi)存管理的基本功能和通過共享存儲(chǔ)器方式實(shí)現(xiàn)進(jìn)程間通信的基本原理。在老師和同學(xué)的幫助下,我成功解決了我的一些問題和困惑,使我對操作系統(tǒng)更加感興趣,也為今后的學(xué)習(xí)生活奠定了基礎(chǔ)。8、 思考題1:了解函數(shù) memchr()的用法,試用其替代子進(jìn)程中的 memccpy()以簡化代碼。答:memchr()頭文件 <>函數(shù)原型void * memchr(const void *src, char ch, size_t n)功能:從頭開始搜尋 src 所指的內(nèi)存內(nèi)容前 n 個(gè)字節(jié),直到發(fā)現(xiàn)第一個(gè)值為 ch 的字節(jié)。返回值:如果找到指定的字

溫馨提示

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

評論

0/150

提交評論