操作系統(tǒng)實驗二_第1頁
操作系統(tǒng)實驗二_第2頁
操作系統(tǒng)實驗二_第3頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

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

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

3、)將 dst 中”W”之后內(nèi)容的地址復制到 temp,將 temp 中前2 個字符用替換。之后將修改后的 dst 的內(nèi)容使用 memmove()復制回 src,關(guān)閉文件 f1,釋放 dst。5父進程使用 memset()將共享存儲區(qū) src 中前 2 個字符用“Q”替換。最后顯示經(jīng) 2 次修改后的 f1 的內(nèi)容。5、 實驗代碼#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ù)申請一個頁面大小的內(nèi)存空間,地址返

5、回到 dst; char *dst = (char *)malloc(page_size); /使用 memmove()函數(shù)將共享存儲區(qū)的內(nèi)容復制到 dst; memmove(dst, src, page_size); /顯示 dst 的內(nèi)容; printf("dst 的內(nèi)容=%sn", dst); pid = fork(); if (pid = 0) /* 子進程空間*/ /使用 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 個字符用替換,顯示替換后的 dst 內(nèi)容; memset(temp, '', 2); printf("temp 的內(nèi)容=%sn", temp); printf("dst 的內(nèi)容=%sn", dst); /使用 memmove()將修改后的 dst 的內(nèi)容復制回 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 指向的共享存儲區(qū)內(nèi)容*/ /關(guān)閉之前打開的文件 f1,釋放 dst; close(fd); free(dst); else if (pid > 0) /* 父進程空間*/ wait(NULL); /使用memset(

8、)將共享存儲區(qū)src 中前2 個字符用”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 指向的共享存儲區(qū)內(nèi)容*/ printf("PID is: %d, PPID is: %d, Th

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

溫馨提示

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

最新文檔

評論

0/150

提交評論