操作系統(tǒng)實(shí)驗(yàn)劉佳敏_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)劉佳敏_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)劉佳敏_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)劉佳敏_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)劉佳敏_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、北京聯(lián)合大學(xué) 信息 學(xué)院實(shí) 驗(yàn) 報(bào) 告題目: 操作系統(tǒng)實(shí)驗(yàn) 系 別: 計(jì)算機(jī)科學(xué)與技術(shù) 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí): 計(jì)算機(jī)1303B 學(xué) 號(hào): 2013080332058 姓 名: 劉佳敏 指導(dǎo)教師: 孫悅 2015年11月 19日實(shí)驗(yàn)二 進(jìn)入VI編輯器格式:vi 文件名例 :vi sy.cVi編輯器三種工作方式:1 編輯方式:進(jìn)入VI 處于編輯方式2 文本輸入方式:在編輯方式下輸入a ,進(jìn)入追加方式,輸入i,進(jìn)入插入方式3 命令方式:在輸入方式下,按Esc 鍵,由文本輸入轉(zhuǎn)向編輯方式,輸入冒號(hào):進(jìn)入命令方式4 退出vi : wq寫(xiě)文件退出:w wenjianming 寫(xiě)文件: q!

2、 不寫(xiě)退出:wq! 寫(xiě)退出編譯c文件Gcc -o wenjianming.out wenjianming.c運(yùn)行文件:./wenjianming.out1 實(shí)驗(yàn)內(nèi)容和目的用vi編輯器編輯下列文件,使用gcc編譯器和gdb調(diào)試器,對(duì)下列程序編譯運(yùn)行,分析運(yùn)行結(jié)果。要求至少完成3個(gè)程序。2程序示例(1) /* 父子進(jìn)程之間的同步之例 */#include <stdio.h> main( ) int pid1; /*聲明*/if(pid1=fork() /*調(diào)用fork函數(shù)復(fù)制創(chuàng)建child1進(jìn)程*/ if (fork() /*調(diào)用fork函數(shù)復(fù)制child1進(jìn)程創(chuàng)建child2進(jìn)程,即

3、child1的子進(jìn)程*/ printf (“parents context.n”); printf(“parent is waiting the child1 terminate.n); wait(0); /*父進(jìn)程同步等待子進(jìn)程結(jié)束,結(jié)束之后進(jìn)行下一步,否則繼續(xù)等待*/ printf(“parent is waiting the child2 terminate.n”);wait(0); /*父進(jìn)程同步等待子進(jìn)程結(jié)束,結(jié)束之后進(jìn)行下一步,否則繼續(xù)等待*/ printf(“parent terminate.n”);exit(0); /*父進(jìn)程終止*/ Else /*如果創(chuàng)建child2進(jìn)程不成

4、功,進(jìn)行以下操作*/ /* child2*/ printf(“child2s context.n”); sleep(5); /*休眠5秒鐘*/ printf(“ child2 terminate.n”); exit(0); /*child2進(jìn)程終止*/ else if(pid1=0) /*在子進(jìn)程中*/ printf(“child1s context.n”); sleep(10); /*休眠10秒鐘*/ printf(“child1 terminate.n”); exit(0); /*child1進(jìn)程終止*/ 分析: 上述程序是父進(jìn)程首先創(chuàng)建一個(gè)子進(jìn)程,若成功,再創(chuàng)建另一個(gè)子進(jìn)程,之后三個(gè)進(jìn)程

5、并發(fā)執(zhí)行。究竟誰(shuí)先執(zhí)行,是隨機(jī)的,可根據(jù)執(zhí)行結(jié)果判斷。試分析該程序的所有運(yùn)行結(jié)果。注釋: fork( ) 調(diào)用正確完成時(shí),給父進(jìn)程返回地是被創(chuàng)建子進(jìn)程的標(biāo)識(shí),給子進(jìn)程返回的是0;創(chuàng)建失敗時(shí),返回給父進(jìn)程的時(shí)1;exit(0) 進(jìn)程終止自己wait(0) 父進(jìn)程同步等待子進(jìn)程結(jié)束,即無(wú)子進(jìn)程結(jié)束,父進(jìn)程等待。實(shí)驗(yàn)分析:首先f(wàn)ork()正確調(diào)用,執(zhí)行父進(jìn)程,輸出parents context parent is waiting the child1 terminate.這個(gè)時(shí)候wait(0); /父進(jìn)程同步等待子進(jìn)程結(jié)束,即無(wú)子進(jìn)程結(jié)束,父進(jìn)程等待。執(zhí)行子進(jìn)程2,輸出child2s context

6、。然后休眠5秒鐘,執(zhí)行子進(jìn)程1 輸出child1s context 休眠10秒鐘。進(jìn)程2首先結(jié)束休眠,輸出child2 terminate。父進(jìn)程輸出parent is waiting the child2 terminate。子進(jìn)程1結(jié)束休眠,輸出child1 terminate,進(jìn)程1中止自己。父進(jìn)程child1 terminate,中止自己。在運(yùn)行的時(shí)候會(huì)發(fā)現(xiàn),在child1s context 結(jié)果出來(lái)以后,有一點(diǎn)時(shí)間停頓,是因?yàn)樽舆M(jìn)程2還沒(méi)有結(jié)束休眠。同理子進(jìn)程1也是這樣的。(2)管道通信機(jī)制通過(guò)使用管道實(shí)現(xiàn)兩個(gè)和多個(gè)進(jìn)程之間的通信。所謂管道,就是將一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出與另一個(gè)進(jìn)程的標(biāo)準(zhǔn)

7、輸入聯(lián)系在一起,進(jìn)行通信的一種方法。同組進(jìn)程之間可用無(wú)名管道進(jìn)行通信,不同組進(jìn)程可通過(guò)有名管道通信。使用無(wú)名管道進(jìn)行父子進(jìn)程之間的通信#include <sys/types.h>#include<ctype.h>#include<unistd.h>int pipe( int filedes2); /*創(chuàng)建一個(gè)無(wú)名管道,filedes0為讀通道,filedes1為寫(xiě)通道*/char parent=”a message to pipe communication.n”; /*定義字符串存放于數(shù)組中*/main() int pid,chan12; char buf

8、100; pipe(chan1); pid=fork(); /*創(chuàng)建子進(jìn)程*/if(pid<0) /*如果創(chuàng)建失敗*/ printf(“to create child errorn”); exit(1); /*異常終止*/if(pid>0) /*返回值大于0代表父進(jìn)程*/ close(chan10); /*父進(jìn)程關(guān)閉讀通道*/ printf(“parent process sends a message to child.n”); write(chan11,parent,sizeof(parent); close(chan11); /*父進(jìn)程關(guān)閉寫(xiě)通道*/ printf(“pare

9、nt process waits the child to terminate.n”); wait(0);printf(“parent process terminates.n”);else close(chan11); /*子進(jìn)程關(guān)閉寫(xiě)通道*/ read(chan10,buf,100); /*子進(jìn)程讀緩存中的內(nèi)容*/ printf(“the message read by child process form parent is %s.n”,buf); /*輸出讀的內(nèi)容*/ close (chan10); /*子進(jìn)程關(guān)閉讀通道*/ printf(“child process terminat

10、esn”);注釋:pipe( int filedes2):創(chuàng)建一個(gè)無(wú)名管道,filedes0為讀通道,filedes1為寫(xiě)通道。結(jié)果分析:首先程序創(chuàng)建了一個(gè)無(wú)名管道,如果子進(jìn)程創(chuàng)建成功,則父進(jìn)程關(guān)閉讀通道,輸出parent process sends a message to child.然后寫(xiě)信息,關(guān)閉寫(xiě)通道,輸出parent process waits the child to terminate.等待子進(jìn)程結(jié)束。子進(jìn)程關(guān)閉寫(xiě)通道,然后進(jìn)行讀通道。輸出the message read by child process form parent is a message to pipe com

11、munication.關(guān)閉子進(jìn)程,輸出child process terminates。父進(jìn)程終止輸出parent process terminates.(3)Linux中的多線程編程threads.c#include <pthread.h>#include <stdio.h>#include <sys/time.h>#include <string.h>#define MAX 10pthread_t thread2;pthread_mutex_t mut;int number=0, i;void *thread1() /*線程1*/ print

12、f ("thread1 : I'm thread 1n"); for (i = 0; i < MAX; i+) printf("thread1 : number = %dn",number); pthread_mutex_lock(&mut); /*聲明開(kāi)始用互斥鎖上鎖*/ number+; /*同一時(shí)間只能被一個(gè)進(jìn)程調(diào)用*/ pthread_mutex_unlock(&mut); /*解鎖*/ sleep(2); /*休眠2秒*/ printf("thread1 :主函數(shù)在等我完成任務(wù)嗎?n"); pt

13、hread_exit(NULL); /*線程退出*/void *thread2() /*線程2*/ printf("thread2 : I'm thread 2n"); for (i = 0; i < MAX; i+) printf("thread2 : number = %dn",number); pthread_mutex_lock(&mut); number+; pthread_mutex_unlock(&mut); sleep(3); /*休眠3秒*/ printf("thread2 :主函數(shù)在等我完成任務(wù)

14、嗎?n"); pthread_exit(NULL);void thread_create(void) /*創(chuàng)建線程*/ int temp; memset(&thread, 0, sizeof(thread); /comment1 if(temp = pthread_create(&thread0, NULL, thread1, NULL) != 0) /comment2 printf("線程1創(chuàng)建失敗!n"); else printf("線程1被創(chuàng)建n"); if(temp = pthread_create(&threa

15、d1, NULL, thread2, NULL) != 0) /comment3 printf("線程2創(chuàng)建失敗"); else printf("線程2被創(chuàng)建n");void thread_wait(void) /*等待線程結(jié)束*/ if(thread0 !=0) /comment4 pthread_join(thread0,NULL); printf("線程1已經(jīng)結(jié)束n"); if(thread1 !=0) /comment5 pthread_join(thread1,NULL); printf("線程2已經(jīng)結(jié)束n&quo

16、t;); int main() pthread_mutex_init(&mut,NULL); /*用默認(rèn)屬性初始化互斥鎖*/ printf("我是主函數(shù)哦,我正在創(chuàng)建線程,呵呵n"); thread_create(); printf("我是主函數(shù)哦,我正在等待線程完成任務(wù)阿,呵呵n"); thread_wait(); return 0;結(jié)果分析首先有一個(gè)線程的標(biāo)識(shí)符,然后用函數(shù)pthread mutex init生成一個(gè)互斥鎖。然后通過(guò)void thread_create(void)函數(shù)創(chuàng)建線程。在主函數(shù)中首先輸出:我是主函數(shù)哦,我正在創(chuàng)建線程,

17、呵呵,然后執(zhí)行thread_create();輸出:線程1被創(chuàng)建,線程2被創(chuàng)建。然后輸出我是主函數(shù)哦,我正在等待線程完成任務(wù)阿,呵呵 。然后線程一線程二交替運(yùn)行,直至最終結(jié)束。本實(shí)驗(yàn)中我們使用pthread_mutex_init()函數(shù)生成互斥鎖來(lái)解決變量問(wèn)題,保證一段時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行一段代碼。3 注意:Gcc lpthread o thread.out thread.c線程相關(guān)操作1) pthread_tpthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義: typedef unsigned long int pthread_t; 它是一個(gè)

18、線程的標(biāo)識(shí)符。2)pthread_create函數(shù)pthread_create用來(lái)創(chuàng)建一個(gè)線程,它的原型為: extern int pthread_create _P (pthread_t *_thread, _const pthread_attr_t *_attr, void *(*_start_routine) (void *), void *_arg); 第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來(lái)設(shè)置線程屬性,第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。這里,我們的函數(shù)thread不需要參數(shù),所以最后一個(gè)參數(shù)設(shè)為空指針。第二個(gè)參數(shù)我們也設(shè)為空指針,這樣將生成默

19、認(rèn)屬性的線程。對(duì)線程屬性的設(shè)定和修改我們將在下一節(jié)闡述。當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回0,若不為0則說(shuō)明創(chuàng)建線程失敗,常見(jiàn)的錯(cuò)誤返回代碼為EAGAIN和EINVAL。前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過(guò)多了;后者表示第二個(gè)參數(shù)代表的線程屬性值非法。創(chuàng)建線程成功后,新創(chuàng)建的線程則運(yùn)行參數(shù)三和參數(shù)四確定的函數(shù),原來(lái)的線程則繼續(xù)運(yùn)行下一行代碼。3)pthread_join pthread_exit函數(shù)pthread_join用來(lái)等待一個(gè)線程的結(jié)束。函數(shù)原型為:extern int pthread_join _P (pthread_t _th, void *_thread_return);第一個(gè)參

20、數(shù)為被等待的線程標(biāo)識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可以用來(lái)存儲(chǔ)被等待線程的返回值。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。一個(gè)線程的結(jié)束有兩種途徑,一種是象我們上面的例子一樣,函數(shù)結(jié)束了,調(diào)用它的線程也就結(jié)束了;另一種方式是通過(guò)函數(shù)pthread_exit來(lái)實(shí)現(xiàn)。它的函數(shù)原型為:extern void pthread_exit _P (void *_retval) _attribute_ (_noreturn_);唯一的參數(shù)是函數(shù)的返回代碼,只要pthread_join中的第二個(gè)參數(shù)thread_return不是

21、NULL,這個(gè)值將被傳遞給 thread_return。最后要說(shuō)明的是,一個(gè)線程不能被多個(gè)線程等待,否則第一個(gè)接收到信號(hào)的線程成功返回,其余調(diào)用pthread_join的線程則返回錯(cuò)誤代碼ESRCH。在這一節(jié)里,我們編寫(xiě)了一個(gè)最簡(jiǎn)單的線程,并掌握了最常用的三個(gè)函數(shù)pthread_create,pthread_join和pthread_exit。下面,我們來(lái)了解線程的一些常用屬性以及如何設(shè)置這些屬性。互斥鎖相關(guān)互斥鎖用來(lái)保證一段時(shí)間內(nèi)只有一個(gè)線程在執(zhí)行一段代碼。1) pthread_mutex_init 函數(shù)pthread_mutex_init用來(lái)生成一個(gè)互斥鎖。NULL參數(shù)表明使用默認(rèn)屬性。如

22、果需要聲明特定屬性的互斥鎖,須調(diào)用函數(shù) pthread_mutexattr_init。函數(shù)pthread_mutexattr_setpshared和函數(shù) pthread_mutexattr_settype用來(lái)設(shè)置互斥鎖屬性。前一個(gè)函數(shù)設(shè)置屬性pshared,它有兩個(gè)取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用來(lái)不同進(jìn)程中的線程同步,后者用于同步本進(jìn)程的不同線程。在上面的例子中,我們使用的是默認(rèn)屬性PTHREAD_PROCESS_ PRIVATE。后者用來(lái)設(shè)置互斥鎖類(lèi)型,可選的類(lèi)型有PTHREAD_MUTEX_NORMAL、PTHR

23、EAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它們分別定義了不同的上鎖、解鎖機(jī)制,一般情況下,選用最后一個(gè)默認(rèn)屬性。2) pthread_mutex_lock pthread_mutex_unlock pthread_delay_np pthread_mutex_lock聲明開(kāi)始用互斥鎖上鎖,此后的代碼直至調(diào)用pthread_mutex_unlock為止,均被上鎖,即同一時(shí)間只能被一個(gè)線程調(diào)用執(zhí)行。當(dāng)一個(gè)線程執(zhí)行到pthread_mutex_lock處時(shí),如果該鎖此時(shí)被另一個(gè)線程使用,那此線程被阻塞,即

24、程序?qū)⒌却搅硪粋€(gè)線程釋放此互斥鎖。注意:1)需要說(shuō)明的是,上面的兩處sleep不光是為了演示的需要,也是為了讓線程睡眠一段時(shí)間,讓線程釋放互斥鎖,等待另一個(gè)線程使用此鎖。2)請(qǐng)千萬(wàn)要注意里頭的注釋comment1-5,如果沒(méi)有comment1和comment4,comment5,將導(dǎo)致在pthread_join的時(shí)候出現(xiàn)段錯(cuò)誤,另外,上面的comment2和comment3是根源所在,所以千萬(wàn)要記得寫(xiě)全代碼。因?yàn)樯厦娴木€程可能沒(méi)有創(chuàng)建成功,導(dǎo)致下面不可能等到那個(gè)線程結(jié)束,而在用pthread_join的時(shí)候出現(xiàn)段錯(cuò)誤(訪問(wèn)了未知的內(nèi)存區(qū))。另外,在使用memset的時(shí)候,需要包含string

25、.h頭文件。實(shí)驗(yàn)三1實(shí)驗(yàn)內(nèi)容與目的 熟悉有關(guān)文件的系統(tǒng)調(diào)用,學(xué)習(xí)文件系統(tǒng)的系統(tǒng)調(diào)用命令,提高對(duì)文件系統(tǒng)實(shí)現(xiàn)功能的理解和掌握。使用creat open read write 等系統(tǒng)調(diào)用用C語(yǔ)言編程實(shí)現(xiàn)復(fù)制文件。2注釋(1) Int creat(const char *pathname, mode_t mode);返回值:如果正確創(chuàng)建,返回文件的描述符;否則返回1;Pathname是要?jiǎng)?chuàng)建文件的路徑名。創(chuàng)建文件時(shí),文件只能以只寫(xiě)方式打開(kāi)Mode 用來(lái)規(guī)定該文件的擁有者,小組用戶和其他用戶的訪問(wèn)權(quán)限,要求用按位邏輯加對(duì)下列符號(hào)常量進(jìn)行所需的組合(同open函數(shù))。(2) int open(const

26、 char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int close(int fd);open函數(shù)有兩個(gè)形式.其中pathname是我們要打開(kāi)的文件名(包含路徑名稱,缺省是認(rèn)為在當(dāng)前路徑下面).flags可以去下面的一個(gè)值或者是幾個(gè)值的組合.O_RDONLY:以只讀的方式打開(kāi)文件.O_WRONLY:以只寫(xiě)的方式打開(kāi)文件.O_RDWR:以讀寫(xiě)的方式打開(kāi)文件.O_APPEND:以追加的方式打開(kāi)文件.O_CREAT:創(chuàng)建一個(gè)文件.O_EXEC:如果使用了O_CREAT而且文件已經(jīng)存在,

27、就會(huì)發(fā)生一個(gè)錯(cuò)誤.O_NOBLOCK:以非阻塞的方式打開(kāi)一個(gè)文件.O_TRUNC:如果文件已經(jīng)存在,則刪除文件的內(nèi)容.前面三個(gè)標(biāo)志只能使用任意的一個(gè).如果使用了O_CREATE標(biāo)志,那么我們要使用open的第二種形式.還要指定mode標(biāo)志,用來(lái)表示文件的訪問(wèn)權(quán)限.mode可以是以下情況的組合.-S_IRUSR 用戶可以讀 S_IWUSR 用戶可以寫(xiě)S_IXUSR 用戶可以執(zhí)行 S_IRWXU 用戶可以讀寫(xiě)執(zhí)行-S_IRGRP 組可以讀 S_IWGRP 組可以寫(xiě)S_IXGRP 組可以執(zhí)行 S_IRWXG 組可以讀寫(xiě)執(zhí)行-S_IROTH 其他人可以讀 S_IWOTH 其他人可以寫(xiě)S_IXOTH 其

28、他人可以執(zhí)行 S_IRWXO 其他人可以讀寫(xiě)執(zhí)行-S_ISUID 設(shè)置用戶執(zhí)行ID S_ISGID 設(shè)置組的執(zhí)行ID- 我們也可以用數(shù)字來(lái)代表各個(gè)位的標(biāo)志.Linux總共用5個(gè)數(shù)字來(lái)表示文件的各種權(quán)限.00000.第一位表示設(shè)置用戶ID.第二位表示設(shè)置組ID,第三位表示用戶自己的權(quán)限位,第四位表示組的權(quán)限,最后一位表示其他人的權(quán)限. 每個(gè)數(shù)字可以取1(執(zhí)行權(quán)限),2(寫(xiě)權(quán)限),4(讀權(quán)限),0(什么也沒(méi)有)或者是這幾個(gè)值的和.比如我們要?jiǎng)?chuàng)建一個(gè)用戶讀寫(xiě)執(zhí)行,組沒(méi)有權(quán)限,其他人讀執(zhí)行的文件.設(shè)置用戶ID位那么我們可以使用的模式是-1(設(shè)置用戶ID)0(組沒(méi)有設(shè)置)7(1+2+4)0(沒(méi)有權(quán)限,使

29、用缺省)5(1+4)即10705:open("temp",O_CREAT,10705); 如果我們打開(kāi)文件成功,open會(huì)返回一個(gè)文件描述符.我們以后對(duì)文件的所有操作就可以對(duì)這個(gè)文件描述符進(jìn)行操作了.當(dāng)我們操作完成以后,我們要關(guān)閉文件了,只要調(diào)用close就可以了,其中fd是我們要關(guān)閉的文件描述符.(3)ssize_t read(int fd, void *buffer, size_t count);ssize_t write(int fd, const void *buffer, size_t count); fd是我們要進(jìn)行讀寫(xiě)操作的文件描述符,buffer是我們要寫(xiě)入

30、文件內(nèi)容或讀出文件內(nèi)容的內(nèi)存地址.count是我們要讀寫(xiě)的字節(jié)數(shù). 對(duì)于普通的文件read從指定的文件(fd)中讀取count字節(jié)到buffer緩沖區(qū)中(記住我們必須提供一個(gè)足夠大的緩沖區(qū)),同時(shí)返回count. 如果read讀到了文件的結(jié)尾或者被一個(gè)信號(hào)所中斷,返回值會(huì)小于count.如果是由信號(hào)中斷引起返回,而且沒(méi)有返回?cái)?shù)據(jù),read會(huì)返回-1,且設(shè)置errno為EINTR.當(dāng)程序讀到了文件結(jié)尾的時(shí)候,read會(huì)返回0. write從buffer中寫(xiě)count字節(jié)到文件fd中,成功時(shí)返回實(shí)際所寫(xiě)的字節(jié)數(shù).可能用到的頭文件#include <stdio.h>#include &l

31、t;sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>程序:#include <stdio.h> #include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>int main() const char *pathname=”s2.txt”; /* Pathname是要?jiǎng)?chuàng)建文件的路徑名*/ int buf10

32、24;int in,out,flag,n; /*定義函數(shù)*/ in=open(“s1.txt”,O_RDONLY,S_IRUSR); /*以只讀方式打開(kāi)s1.txt,用戶可讀*/ out=creat(pathname,S_IWUER); /*創(chuàng)建文件s2.txt,用戶可寫(xiě)*/if(in= =-1)printf(“open is errorn”); /*無(wú)s1.txt ,打開(kāi)失敗*/if(out= =-1)printf(“creat is errorn”); /*無(wú)s2.txt,創(chuàng)建失敗*/while(flag=read(in,buf,1024)>0)n=write(out,buf,fla

33、g); /*寫(xiě)入文件內(nèi)容 */close(in);close(out);return 0;流程圖:實(shí)驗(yàn)四 模擬內(nèi)存管理程序(4學(xué)時(shí))1、實(shí)驗(yàn)?zāi)康牧私夂?jiǎn)單的固定大小內(nèi)存分配方法,掌握分區(qū)存儲(chǔ)管理技術(shù),了解在分區(qū)管理機(jī)制下所需的數(shù)據(jù)結(jié)構(gòu)。2、實(shí)驗(yàn)內(nèi)容1)、將1024K內(nèi)存按如下塊大小分成十個(gè)內(nèi)存塊。內(nèi)存塊號(hào) 內(nèi)存塊大小 起始地址內(nèi)存塊狀態(tài)1 512 10 NO2 256 522NO3 256 778NO4 128 1034NO5 128 1162NO6 128 1290NO7 32 1418NO8 32 1450NO9 16 1482NO10 16 1498NO其中,在內(nèi)存狀態(tài)中用NO代表該內(nèi)存塊

34、未被分配;用進(jìn)程名代表該內(nèi)存塊已被分配。2)、編制模擬內(nèi)存管理程序,根據(jù)調(diào)入內(nèi)存的進(jìn)程大小分別采用最先適應(yīng)法和最佳適應(yīng)法分配內(nèi)存塊。最佳適應(yīng)法,如有一個(gè)12K的程序被運(yùn)行時(shí),它應(yīng)該被分配到內(nèi)存塊號(hào)9,若有200K的程序運(yùn)行時(shí),應(yīng)將其調(diào)入內(nèi)存塊號(hào)2。最先適應(yīng)法,則是按內(nèi)存塊號(hào)的順序,依次放入各進(jìn)程名。有關(guān)編程請(qǐng)仔細(xì)閱讀后面的參考流程。3、實(shí)驗(yàn)要求1)、要求通過(guò)鍵盤(pán)輸入若干進(jìn)程名稱和程序所占內(nèi)存空間的大小,把這些進(jìn)程分配到內(nèi)存表中,顯示內(nèi)存分配情況。2)、編制程序可以循環(huán)輸入,輸入某進(jìn)程結(jié)束或某進(jìn)程添加進(jìn)來(lái)、進(jìn)程占用存儲(chǔ)空間的大小,并顯示內(nèi)存分配情況。3)、當(dāng)沒(méi)有區(qū)間存放程序時(shí),應(yīng)有提示。4)、所

35、編寫(xiě)的程序,應(yīng)有退出功能。5)、每添加、結(jié)束一個(gè)進(jìn)程,應(yīng)有輸出顯示,輸出顯示的格式如下:內(nèi)存塊號(hào) 內(nèi)存塊大小 起始地址進(jìn)程名(內(nèi)存狀態(tài))1 512 10 A12 256 522NO3 256 778A24 128 1034A35 128 1162NO6 128 1290NO7 32 1418NO8 32 1450NO9 16 1482NO10 16 1498NO源程序:/*C*/程序所采用的數(shù)據(jù)結(jié)構(gòu)、符號(hào)說(shuō)明,及采用哪一種內(nèi)存分配方法Struct memoryInt id; /內(nèi)存塊號(hào)Int size; /內(nèi)存塊大小Int start;/起始地址Char name4;/進(jìn)程名(進(jìn)程狀態(tài)),無(wú)進(jìn)

36、程為NOStruct memorysInt count;/當(dāng)前已分配內(nèi)存塊的個(gè)數(shù)Struct memory m_memorys10;/內(nèi)存塊數(shù)組寫(xiě)出源程序清單,要求附加流程圖與注釋程序代碼:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>struct memoryInt id; /內(nèi)存塊號(hào)Int size; /內(nèi)存塊大小Int start;/起始地址Char name4;/進(jìn)程名(進(jìn)程狀態(tài)),無(wú)進(jìn)程為NO;struct memorysInt count;

37、/當(dāng)前已分配內(nèi)存塊的個(gè)數(shù) Struct memory m_memorys10;/內(nèi)存塊數(shù)組;struct memorys * initMemory()struct memorys * m = (struct memorys *)malloc(sizeof(struct memorys);int i;m->count = 0;m->m_memory0.id = 1; /初始化m->m_memory0.size = 512;m->m_memory0.start = 10;strcpy(m->m_,"NO");for(i=1;

38、i<10;i+)m->m_memoryi.id = i+1; if(i=1|i=2)m->m_memoryi.size = 256;else if(i=3|i=4|i=5)m->m_memoryi.size = 128;else if(i=6|i=7)m->m_memoryi.size = 32;elsem->m_memoryi.size = 16;m->m_memoryi.start = m->m_memoryi-1.start+m->m_memoryi-1.size;strcpy(m->m_,"N

39、O");return m;void showMenu(struct memorys* m) /輸出內(nèi)存信息int i;printf("id size start staten");for(i=0;i<10;i+)printf("%2d %3d %4d %sn",m->m_memoryi.id,m->m_memoryi.size,m->m_memoryi.start,m->m_);printf("1.add processn"); /輸出選項(xiàng)printf("2.d

40、elete processn");printf("3.exitn");/*最佳適應(yīng)法分配內(nèi)存塊*/void bestAdapter(struct memorys * m,int size,char *s)if(m->count=10)printf("no room!n");return;int i;for(i=9;i>0;i-)if(strcmp(m->m_,"NO")=0&&m->m_memoryi.size>size)strcpy(m->m_me

41、,s); m->count+;return;void m_add(struct memorys * m) /增加選項(xiàng)printf("to add process!n");int size;char s4;printf("input size :");scanf("%d",&size);printf("input name :");scanf("%s",s);bestAdapter(m,size,s);void m_delete(struct memorys *

42、m) /刪除選項(xiàng)printf("to delete process!n");printf("input id :");int id;scanf("%d",&id);if(id>10|id<1)printf("input error!n");return;if(strcmp(m->m_,"NO")!=0)strcpy(m->m_,"NO");elseprintf("no dat

43、a to delete!n");return;int main()int i;struct memorys *memory = initMemory();while(true)showMenu(memory); /輸出菜單scanf("%d",&i); /輸入switch(i) /選項(xiàng)case 1:m_add(memory);break;case 2:m_delete(memory);break;case 3:exit(-1);break;default:printf("input error!n");break;return 0;/*

44、java*/ 最先適應(yīng)法package test1;import java.util.*;public class Shiyan4_1 /用二維數(shù)組存儲(chǔ)數(shù)據(jù)static String mem = "1", "512", "10", "NO" , "2", "256", "522", "NO" , "3", "256", "778", "NO" , "

45、;4", "128", "1034", "NO" , "5", "128", "1162", "NO" , "6", "128", "1290", "NO" , "7", "32", "1418", "NO" , "8", "32", "1

46、450", "NO" , "9", "16", "1482", "NO" , "10", "16", "1498", "NO" ;private static Scanner sc;public static void print() /輸出原內(nèi)存分配信息System.out.println("NoSizeAddrPID");for (int a = 0; a < 10; a+)

47、for (int b = 0; b < 4; b+) System.out.print(memab + "t");System.out.println(); /換行public static void main(String args) throws InterruptedException /拋出異常String pid;String psize;sc = new Scanner(System.in); print(); /調(diào)用輸出方法do System.out.println(); /換行System.out.print("Enter process I

48、D:"); pid = sc.next(); /輸入IDSystem.out.print("Enter process size:");psize = sc.next(); /輸入程序大小System.out.println(); /換行for (int a = 0; a <= 10; a+) if (a = 10) /最先適配算法System.out.println("No enough space for <" + pid + ">.");break; else if (mema3.equals(pid

49、) mema3 = "NO"System.out.println("Process <" + pid + "> has been killed.");break; else if (Integer.parseInt(mema1) > Integer.parseInt(psize) && mema3 = "NO")mema3 = pid;System.out.println("Memory block " + (a+1) + " has allocate

50、d for <" + pid + ">.");break;System.out.println();Thread.sleep(1000); /線程休眠print(); while (true);/ 最佳適應(yīng)法package test1;import java.util.*;public class Shiyan4_2 /用二維數(shù)組存儲(chǔ)原信息static String mem = "1", "512", "10", "NO" , "2", "256", "522", "NO" , "3", "256", "778", "NO" , "4", "128", &

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論