版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、12070131 樊文舟 操作系统实验报告专 业 计算机科学与技术 年 级 本科三年级 学 号 12070131 姓 名 樊文舟 目录:一、实验一 -31.实验目的-32.实验内容-33.实验要求-34.实验设计-35.实验程序-36.实验结果-47.实验感想-4二、实验二 -41.实验目的-52.实验内容-53.实验要求-54.实验设计-55.实验程序-66.实验结果-77.实验感想-7三、实验三 -81.实验目的-82.实验内容-83.实验要求-84.实验设计-95.实验程序-106.实验结果-117.实验感想-11四、实验四 -121.实验目的-122.实验内容-123.实验要求-124
2、.实验设计-125.实验结果-126.实验感想-12个人总结-12 实验一 UNIX/LINUX入门一、 实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下C语言程序的编写、编译、调试和运行方法。二、 实验内容1、熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。(常用Linux命令在附录中列出,请参阅。)2、熟悉UNIX/LINUX下C语言编译器cc/gcc的使用方法。编写一个简单的显示“Hello,World!”C语言程序,用gcc编译并观察编译后的结果,然后运行它。具体方法如下:(1)开机选择Linux操
3、作系统进入,根据要求输入用户名root,密码rootroot。(2)尝试使用实验指导书中提供的各种指令。步骤如下:如果你机器是英文系统,找ApplicationsàAccessories àTerminal,并运行。如果你机器是中文系统,找 应用à附件à终端,并运行。注意:Terminal是一个命令行系统,尝试运行相关的命令。(3)尝试写一个Hello world程序。步骤如下:a) 选择一个目录下创建一个文件example.cb) 双击代表example.c的图标进入编辑器并输入hello world代码c) 保存并退出d) 在终端(Terminal)
4、中对example.c进行编译。编译命令为:gcc example.c o examplee) 运行编译好的程序。指令为:./example三、 实验要求按照要求编写程序,放在相应的目录中,编译成功后执行。四、 实验设计Linux 系统常用命令格式:command option argument1 argument2 .五、 实验程序#include <stdio.h> #include <stdlib.h> int main(void) printf ("Hello World!n"); system ("pause"); re
5、turn 0;六、 实验结果七、 实验感想通过第一次室验,熟悉了LINUX系统的操作,终端的使用,GCC编译c程序 实验二 进程管理一、实验目的加深对进程概念的理解,明确进程与程序的区别;进一步认识并发执行的实质。二、实验内容(1)进程创建编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a“;子进程分别显示字符”b“和字符“c”。试观察记录屏幕上的显示结果,并分析原因。(提示:对每个进程的打印循环执行10次,则可以发现执行顺序的不同)(2)进程控制修改已编写的程序,将每一个进程输出一个字符
6、改为用一个循环输出1000个字符(父进程输出1000个“a”,子进程分别输出1000个“b”和“c”),再观察程序执行时屏幕上出现的现象,并分析原因。(3)进程的管道通信 编写程序实现进程的管道通信。使用系统调用pipe()建立一个无名管道,二个子进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1的消息,再接收P2的消息)。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四
7、、实验设计1、功能设计实验要求建立一个管道实现父进程和子进程间的通信,子进程有两个,子进程向管道里写数据,父进程从管道里读出数据。管道的作用是将两个缓冲区相关连起来,使得一个缓冲区写的东西可以从另一个缓冲区读出来,遵循先进先出的顺序。程序的顺序是这样的:先创建子进程1,向管道写入一句话,子进程1结束后创建子进程2,向管道写入一句话,最后父进程从管道中读出。2、数据结构子进程:使用pid_t fork()函数创建,返回值为子进程号。管道:使用int pipe(int filedis2)创建无名管道,filedis2为两个文件描述符。子进程1开始3、程序框图开始定义子进程号和文字描述符向管道中写入
8、数据子进程1结束创建子进程1 向管道中写入数据子进程2开始子进程2结束创建子进程2父进程接收管道中数据结束五、实验程序#include<stdio.h>#include<string.h>#include<unistd.h>int pipe(int filedis2);#define INPUT 0#define OUTPUT 1int main()int file_descriptors2;pid_t pid1,pid2;/定义子进程char buf256;int returned_count;pipe(file_descriptors);/创建无名管道i
9、f(pid1=fork()=-1) /创建子进程1printf("Error on forkn");exit(1);if(pid1=0)printf("in the spawned(child1)processn");close(file_descriptorsINPUT); /关闭通道的读端write(file_descriptorsOUTPUT,"child1 is sending message",strlen("child1 is sending message");/向管道中写一句话exit(0);els
10、eif(pid2=fork()=-1) /创建子进程2printf("Error on forkn");exit(1);if(pid2=0)printf("in the spawned(child2)processn");close(file_descriptorsINPUT); /关闭通道的读端write(file_descriptorsOUTPUT,"child2 is sending message",strlen("child1 is sending message");/向管道中写一句话exit(0);e
11、lse/父进程printf("in the parent processn"); close(file_descriptorsOUTPUT); /关闭管道的写端returned_count=read(file_descriptorsINPUT,buf,sizeof(buf);printf("%d bytes of data received from spawned process:%s n",returned_count,buf);/父进程从管道中读出数据return 0;六、实验结果由图可知,父进程先后接受了子进程向管道写入的两句话,并成功地打印出来
12、。两个子进程分别向管道写入了25个字符,并且是子进程1先写的,子进程2后写的,故输出的顺序也是如此。七、实验感想通过本次实验,我们对进程的概念加深了理解,熟悉了进程的创建方法与作用机制,明确了进程与程序的异同。同时,我们掌握了使用管道通信的机制,进一步认识了并发执行的实质。 实验三 线程的管理一、实验目的编写Linux环境下的多线程程序,了解多线程的程序设计方法,掌握最常用的三个函数pthread_create,pthread_join和pthread_exit的用法二、实验内容1、 主程序创建两个线程myThread1和myThread2,每个线程打印一句话。使用pthread_create
13、(&id,NULL,(void *) thread,NULL)完成。提示:先定义每个线程的执行体,然后在main中()创建几个线程,最后主线程等待子线程结束后再退出。2、创建两个线程,分别向线程传递如下两种类型的参数l 传递整型值l 传递字符 三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1、创建两个进程每个进程打印一句话(1)功能设计题目要求创建两个线程,每个线程打印一句话,可以认为两个线程的功能是相同的,故只需要写一个线程的运行函数thread(),在这个函数里有一个printf输出一句话即可。然后在main函数
14、里分别创建两个线程,然后等待两个线程结束。(2)数据结构线程:使用pthread_create()创建。每个线程有相应的线程标示符,也有各自的属性。线程可以和线程运行函数绑定,并可以在创建线程时确定该线程运行函数的参数。(3)程序框图定义线程标识符开始创建线程2并与thread()函数绑定等待线程结束创建线程1并与thread()函数绑定结束(4)程序#include <stdio.h>#include <pthread.h>void thread(void)/线程运行函数printf("This is a pthread.n");/输出一句话int
15、 main(void)pthread_t id1,id2;/定义两个线程标识符int i,ret;ret=pthread_create(&id1,NULL,(void *) thread,NULL);/创建线程标识为id1if(ret!=0)/线程创建失败printf ("Create pthread error!n");exit (1);ret=pthread_create(&id2,NULL,(void *) thread,NULL); /创建线程标识为id2if(ret!=0) /线程创建失败printf ("Create pthread e
16、rror!n");exit (1);printf("This is the main process.n");pthread_join(id1,NULL);/等待第一个线程结束pthread_join(id2,NULL);/等待第二个线程结束return (0);2、创建两个进程每个进程打印一句话分别向线程传递如下两种类型的参数 :整型值、字符(1)功能设计题目要求创建两个线程,两个线程分别传递int型和char型数据给线程运行函数。所以要编写两个不同的线程运行函数分别接收int型和char型的数据。相应的pthread_create()函数中要给第四个参数,作为
17、形参传进线程运行函数。(2)数据结构线程:同1,使用pthread_create()创建。每个线程有相应的线程标示符,也有各自的属性。线程可以和线程运行函数绑定,并可以在创建线程时确定该线程运行函数的参数。(3)程序框图等待线程结束结束定义线程标识符开始创建线程1并与threadchar(char* c)函数绑定创建线程2并与threadint(int *n)函数绑定(4)程序#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>void threa
18、dchar(char * c)/接收字符的线程运行函数 printf("receive a char:%cn",c);void threadint(int * i)/接收整数的线程运行函数 printf("receive a int:%dn",i);int main(void) pthread_t id1,id2; /定义两个线程标识符 int ret; char c='t' char *a=c;/定义char*指针变量传参数用 ret=pthread_create(&id1,NULL,(void *) threadchar,a)
19、;/创建线程1,第四个参数为char*型变量用来传递字符 if(ret!=0)/线程创建失败 printf ("Create pthread error!n"); exit (1); int i=99; int *b=i; /定义int*指针变量传参数用 ret=pthread_create(&id2,NULL,(void *) threadint,b);/创建线程2,第四个参数为int*型变量用来传递字符 if(ret!=0) /线程创建失败 printf ("Create pthread error!n"); exit (1); printf
20、("This is the main process.n"); pthread_join(id1,NULL); /等待线程1结束 pthread_join(id2,NULL); /等待线程2结束 return (0);五、实验结果由图可知两个线程主程序创建了两个进程这两个进程分别输出了一句话主程序分别创建了两个线程并向线程1传递了t向线程2传递了99,线程运行函数分别输出告知接收了这两个参数。六、实验感想通过本次实验,我学会了如何使用LINUX下的线程创建函数pthread_create()来创建线程,并且向线程传递参数。同时更加熟练的使用LINUX。实验四 利用信号量实现
21、进程控制一、实验目的学习UNIX类(System V)操作系统信号量机制,编写Linux环境下利用信号量实现进程控制的方法,掌握相关系统调用的使用方法。二、实验内容创建4个线程,其中两个线程负责从文件读取数据到公共的缓冲区,另两个线程从缓冲区读取数据作不同的处理(加和乘运算)。使用信号量控制这些线程的执行。提示:(1)参见“四、补充材料”中的相关系统调用的基本用法。(2)创建4个线程,其中2个线程用于从文件中读数据到缓冲区中(例如:一个进程读1.dat文件,另一个进程读2.dat文件),另2个线程从缓冲区中取数据作处理。事先编辑好数据文件如:1.dat和2.dat,假设它们的内容分别为1 2
22、3 4 5 6 7 8 9 10和 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ,然后运行你编写的程序,应得到如下类似的结果:Multiply:-1*-2=2Plus:-1+-2=-3Multiply:9*10=90Plus:-9+-10=-19Multiply:-7*-8=56Plus:-5+-6=-11Multiply:-3*-4=12Plus:9+10=19Plus:7+8=15Plus:5+6=11三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。四、实验设计1、功能设计题目要求创建4个线程,其中两个负责从文件读数
23、据到缓冲区,另两个负责从缓冲区读数据进行加和乘的运算。我对这4个线程进行如下安排,线程1读后线程2才可以读,线程2读了后线程3才可以进行加的运算,线程3加完了后线程4才能进行乘的运算,线程4乘完后线程1才能继续读。故需4个信号量sem1,sem2,sem3,sem4。线程1消费sem1生产sem2,线程2消费sem2生产sem3,线程3消费sem3生产sem4,线程4消费sem4生产sem1,形成一个循环,直到文件结束为止。2、数据结构信号量(semaphore):数据类型为结构 sem_t,本质上是一个长整型的数。一共4个公共缓冲区(stack):采用2维数组的方式实现(stackNUM2)
24、。数组中的两列分别存储两个文件中的数据。该2维数组还有一个索引:size,指向2维数组的顶部。读线程每次从文件读出两个数放到stackNUM0和stackNUM1线程A开始3、 程序框图结束开始N到文件尾?定义线程标识符,缓冲区和信号量 P(sem1) Y初始化信号量 从文件读出两个数据到缓冲区创建4个线程并分别与相应函数绑定 线程A结束P(sem2)结束结束等待线程结束线程B开始到文件尾? YNP(sem2)从文件读出两个数据到缓冲区P(sem3)线程B结束线程D开始线程C开始到文件尾?线程D结束N到文件尾?P(sem4) N线程C结束从缓冲区取两个数相乘P(sem3)从缓冲区取两个数相加P
25、(sem1)线程D结束P(sem4) 线程C结束线程C结束线程D结束线程D结束线程D结束线程D结束 五、实验程序#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#define MAXSTACK 20int stackMAXSTACK;int a=0;int b=0;sem_t sem,sem1;void ReadData1(void) )FILE *fp=fopen("1.dat","r"); /从文件中读
26、数据sem_wait(&sem1); int i;for(i=0;i<10;i+)fscanf(fp,"%d",&stacka+); sem_post(&sem1); sem_post(&sem); fclose(fp);void ReadData2(void)FILE *fp=fopen("2.dat","r");sem_wait(&sem1);int i;for(i=0;i<10;i+)fscanf(fp,"%d",&stacka+);sem_post
27、(&sem1);sem_post(&sem);fclose(fp);void HandleData1(void)int i;sem_wait(&sem); /等,读完了加到1才能处理for(i=0;i<5;i+) int m=stackb+;int n=stackb+;printf("Plus:%d+%d=%dn",m,n,m+n);void HandleData2(void)int i;sem_wait(&sem);for(i=0;i<5;i+)int m=stackb+;int n=stackb+;printf("M
28、ultiply:%d*%d=%dn",m,n,m*n);int main(void)pthread_t t1,t2,t3,t4;sem_init(&sem,0,0);/初始化一个信号量为0,同步sem_init(&sem1,0,1); /初始化为1,互斥pthread_create(&t1,NULL,(void *)HandleData1,NULL);pthread_create(&t2,NULL,(void *)HandleData2,NULL);pthread_create(&t3,NULL,(void *)ReadData1,NULL);
29、pthread_create(&t4,NULL,(void *)ReadData2,NULL);pthread_join(t1,NULL); pthread_join(t2,NULL); pthread_join(t3,NULL); pthread_join(t4,NULL);六、实验感想通过本次实验,我进一步掌握了如何使用LINUX下的线程创建函数pthread_create()创建线程,并且学会了如何使用信号量控制进程的运行,学会了使用消费函数sem_wait(),生产函数sem_post(),以及如何初始化信号量,同时也掌握了文件的读取方法,本次实验加深了我对信号量的认识。实验五
30、 基于消息队列和共享内存的进程间通信一、实验目的Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉:1. Linux支持的消息通信机制及其使用方法2. Linux系统的共享存储区的原理及使用方法。二、实验内容1 消息的创建、发送和接收使用消息调用msgget()、msgsnd()、msgrcv()、msgctl()编制长度为1K的消息的发送和接收程序。2 共享存储取得创建、附接和断接使用系统调用shmget()、shmat()、shmctl(),编制一个与上述功能相同的程序。三、实验要求按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求
31、分析执行结果,并写出实验报告。四、实验设计1、消息的创建、发送和接收(1)功能设计为了实现进程之间消息的创建、发送和接收,首先应定义两个子进程,Server进程负责发送,Client进程负责接收,父进程负责创建。其次需要用到msgget()、msgsnd()、msggrev()、msgctrl()等函数进行对消息的控制。题目要求消息长度为1K,那么msgsnd(id,msgp,size, flag)和msgrcv(id,msgp,size,type,flag)函数中参数size应设为1024,msgget(key,flag)中的key应为75。父进程获得创建消息后,子进程Server先后发送编
32、号为110的10条消息,子进程Client先后接收这11条消息,方能达到实验目的。(2)数据结构消息(mymsg):结构体实现,包含的成员变量有消息类型和消息内容,具体实现如下:struct mymsg/消息的结构体声明long int mymsgtype;/消息类型int text;/消息内容;(3)程序框图子进程Server开始开始结束定义子进程号向消息队列中发送10条消息获得一个消息的描述符子进程Server结束创建Server子进程向消息队列中发送10条消息子进程Client开始创建Client子进程子进程Client结束#include<stdio.h>#include&
33、lt;sys/types.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/shm.h>#define MAX 1024struct mymsg/消息结构体long int mymsgtype;/消息类型int text;/消息内容msg;main(void)pid_t pids;/发送进程pid_t pidc;/接收进程int msgid; /消息队列号int i=1;msgid=msgget(KEY,0666|IPC_CREAT);/获得一个消息
34、的描述符if(pids=fork()=0)/创建Server子进程while(i<11)msg.mymsgtype=11-i;msg.text=i;printf("the sended message is %d thn",i);i+;msgsnd(msgid,&msg,MAX,0); /向msgid指定的消息队列发送消息,长度为1Kexit(0);elsei=10;if(pidc=fork()=0) /创建Client子进程while(i!=1)msgrcv(msgid,&msg,MAX,0,0); /从msgid指定的消息队列接收消息printf(
35、"the message is %d thn",msg.text);i=msg.mymsgtype;exit(0);elsewait(0); /等待子进程结束wait(0);exit(0);2、共享存储区的创建、附接和断接(1)功能设计为了实现进程通过共享存储区进行通信,需要创建两个进程并且调用shmget()、shmat()、shmctl()函数实现共享存储区的创建、附接和断接。由于共享存储区的写入和读取由两个子进程完成,而共享存储区在本程序中为所有进程共用的,因此共享存储区的创建、附接和断接均需要在父进程中完成。具体的实现方式是现在父进程中创建一块共享存储区,然后用in
36、t类型指针list指向该存储区的地址;接着创建两个子进程,第一个子进程通过list指针实现向共享存储区写入int类型的数据,第二个子进程通过list指针实现从共享存储区读出int类型的数据。由于两个子进程同时使用了list指针,所以需要控制两个进程互斥,在读进程序中添加了sleep(1)语句。(2)数据结构通过shmid=shmget (key ,size ,flag)函数建立(获得)共享存储区,返回该共享存储区的描述符shmid。(3)程序框图子进程1开始结束断开共享存储区等待子进程结束创建子进程1子进程2建立共享存储区并连接定义子进程号开始向共享存储区中读出数据子进程2开始子进程1结束向共享存储区中写入数据子进程2结束(4)程序#include<stdio.h>#include<stdlib.h>#include<string.h>#include<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年开远市兴远开发投资集团有限公司招聘备考题库及答案详解1套
- 2026年墨玉县国有资产投资经营管理有限责任公司公开招聘备考题库及一套参考答案详解
- 2026年南昌市安义县总医院县人民医院院区编外合同制工作人员招聘备考题库及参考答案详解一套
- 2026年广东省食品进出口集团有限公司招聘备考题库及答案详解1套
- 2026年天津人力资源开发服务有限公司招聘国有大型银行派遣制客服代表备考题库参考答案详解
- 2026年东莞市松山湖第一小学面向全国招聘备考题库附答案详解
- 2026年佛山市顺德区伦教周君令初级中学招聘临聘教师备考题库及完整答案详解一套
- 2025年缙云县保安服务有限公司公开招聘国有企业项目用工备考题库完整答案详解
- 工程部门内控制度
- 农业巨灾保险内控制度
- b超临床试题及答案2025年新版
- 《黄土情》唢呐曲演奏技法与地域音乐风格关联性分析
- 江苏高中学业水平测试生物复习资料
- 高速消防安全知识培训课件
- 光缆成缆工作业指导书
- 社区矫正培训课件教学
- 测评题库及答案京东
- 行政事务处理员高级工工勤技师迎考测试题及答案-行政事务人员
- 2025年《国际贸易学》期末试题以及答案
- 报警信息管理办法
- 2025年上海考警面试题目及答案
评论
0/150
提交评论