南昌工程学院 《操作系统》实验指导书
09信息管理与信息系统(本)01
杨朝晖编 2011 年 9 月
目 录
实验一 Linux基本命令的使用 ............................................................................ 2 实验二 进程实验 ..................................................................................................... 3 实验三 信号量实践程序实验 ............................................................................. 5 实验四 生产者-消费者程序实验 ........................................................................... 8 实验五 存储管理实验 ......................................................................................... 11 实验六 进程通信实验 ........................................................................................... 12 实验七 时间片轮转进程调度算法实验 ............................................................... 14 实验八 文件系统实验 ........................................................................................... 16
1
实验一 Linux基本命令的使用
一、实验目的
1. 熟悉linux操作系统环境。
2. 掌握linux环境下一些常用命令的使用。 二、实验设备和仪器
1.计算机 2.linux操作系统 三、实验内容及要求
1.cd—切换目录
2.mkdir—建立一个新目录 3.cp—文件拷贝
4.ls—显示目录及文件的内容 5.mv—更改文件名称 6.cat—浏览文件内容
7.chmod—更改文件或目录的访问权限 8.rm—删除文件 9.sort—文件排序命令 四、实验原理及步骤
1.实验原理
linux许多命令看起来简单而普通,但是当它们组织在一起时就表现出强有力的功能和用途。所以还需掌握linux环境下复合命令的使用。
2. 步骤
1) 将/bin子目录下文件和子目录存入file1; 2) 将/use/bin子目录下文件和子目录追加到file1; 3) 从file1中选取可执行文件的行,存入file2; 4) 从文件file2中选取文件名垂直列存入file31.
五、实验报告要求:
在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。
2
实验二 进程实验
一、实验目的
1.学会在linux下创建进程; 2.观察进程并发执行的情况; 3.加深对进程的理解。 二、实验设备和仪器
1.计算机 2.linux操作系统
三、实验内容及要求
要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。 程序如下: #include if((pid=vfork())<0) { printf(\"fork error\"); exit(0); } else if(pid==0) { data--; printf(\"child's data is %d\\n\ execve(\"newproc\ data--; printf(\"child's data is %d\\n\ exit(0); } else { 3 printf(\"parent's data is %d\\n\ exit(0); } exit(0); } //注意,此处的程序单独编译 #include printf(\"this is in newproc!\\n\"); for(i=0;i<400000;i++){ // putchar(i); } } 四、实验原理及步骤 1.实验原理 进程用来述程序的并发执行,进程有3种基本状态:运行态、就绪态和阻塞态。进程各状态间可进行相互转换。各进程按时间片的方式进行轮转调度。 2. 步骤 gedit proc.c (编辑程序) gcc –o proc proc.c(编译、链接程序) gedit newproc.c (编辑程序) gcc –o proc newproc.c(编译、链接程序) ./proc(执行程序) 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。 4 实验三 信号量实践程序实验 一、实验目的 1.学会使用信号量解决资源共享问题; 2.观察各进程并发执行竟争资源的情况; 3.加深对信号量的理解。 二、实验设备和仪器 1.计算机 2.linux操作系统 三、实验内容及要求 要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。 程序如下: /*file: semaphore.c*/ // 信号量实践程序,在程序中建立了5个进程,每个进程都尝试运行update_file() #include #include #define FILE_NAME \"/tmp/sem_aaa\" #define DELAY 4000000 void update_file(int sem_set_id, char *file_path, int number){ struct sembuf sem_op; FILE *file; //等待信号量的数值变为非负数,此处设为负值,相当于对信号量进行P操作 sem_op.sem_num=0; sem_op.sem_op=-1; sem_op.sem_flg=0; semop(sem_set_id,&sem_op,1); //写文件,写入的数值是当前进程的进程号 file=fopen(file_path,\"w\"); if(file){//临界区 fprintf(file,\"%d\\n\ 5 printf(\"%d\\n\ fclose(file); } //发送信号,把信号量的数值加1,此处相当于对信号量进行V操作 sem_op.sem_num=0; sem_op.sem_op=1; sem_op.sem_flg=0; semop(sem_set_id,&sem_op,1); } //子进程写文件 void do_child_loop(int sem_set_id,char *file_name){ pid_t pid=getpid(); int i,j; for(i=0;i<3;i++){ update_file(sem_set_id,file_name,pid); for(j=0;j<4000000;j++); } } int main(int argc,char **argv) { int sem_set_id; //信号量集的ID union semun sem_val; //信号量的数值,用于semctl() int child_pid; int i; int rc; // 建立信号量集,ID是250,其中只有一个信号量 sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600); if(sem_set_id==-1){ perror(\"main: semget\"); exit(1); } //把第一个信号量的数值设置为1 sem_val.val=1; rc=semctl(sem_set_id,0,SETVAL,sem_val); if(rc==-1) { perror(\"main:semctl\"); exit(1); } //建立一些子进程,使它们可以同时以竞争的方式访问信号量 for(i=0;i } switch(child_pid){ case -1: perror(\"fork\"); case 0: //子进程 do_child_loop(sem_set_id,FILE_NAME); exit(0); default: //父进程接着运行 break; } } //等待子进程结束 for(i=0;i 四、实验原理及步骤 1.实验原理 为使多个进程能互斥地访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设其初值为1,然后将各进程的临界区CS置于P(mutex)和V(mutex)操作之间即可。 2. 步骤 gedit semaphore.c (编辑程序) gcc –o semaphore semaphore.c (编译、链接程序) ./semaphore(执行程序) 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。 7 实验四 生产者-消费者程序实验 一、 实验目的 1.学会使用信号量解决资源共享问题; 2.观察生产者和消费者进程并发执行竞争资源的情况; 3.进一步以实例加深对信号量的理解。 二、实验设备和仪器 1.计算机 2.linux操作系统 三、实验内容及要求 要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。 程序如下: //生产者-消费者程序 //file producer-consumer.c //在程序中,父进程建立许多子进程,父进程增加信号量的数值,子进程减少信号量的数值 #include #include #define NUM_LOOPS 20 int main(int argc,char *argv[]) { int sem_set_id; //信号量集的ID union semun sem_val; //信号量的数值 int child_pid; //子进程的PID struct sembuf sem_op; //信号量操作结构 int i; int rc; //返回值 struct timespec delay; //延迟时间 //建立信号量集,集中只含有一个信号量 sem_set_id=semget(IPC_PRIVATE,1,0600); 8 } if(sem_set_id==-1){ perror(\"main:semget\"); exit(1); } printf(\"semaphore set created ,semaphore set id %d\\n\//信号量数值设置为零 sem_val.val=0; rc=semctl(sem_set_id,0,SETVAL,sem_val); //建立子进程 child_pid=fork(); switch(child_pid){ case -1: //失败 perror(\"fork\"); case 0: for(i=0;i semop(sem_set_id,&sem_op,1); printf(\"consumer:%d\\n\ fflush(stdout); } break; default: //父进程 for(i=0;i //把信号量的数值增加1 sem_op.sem_num=0; sem_op.sem_op=1; sem_op.sem_flg=0; semop(sem_set_id,&sem_op,1); //等待一段时间 if(rand()>3*(RAND_MAX/4)){ delay.tv_sec=0; delay.tv_nsec=10; nanosleep(&delay,NULL); } } break; } return 0; 9 四、实验原理及步骤 1.实验原理 进程用来述程序的并发执行,进程有3种基本状态:运行态、就绪态和阻塞态。进程各状态间可进行相互转换。各进程按时间片的方式进行轮转调度。 2. 步骤 gedit producer-consumer.c (编辑程序) gcc –o producer-consumer producer-consumer.c(编译、链接程序) ./ producer-consumer(执行程序) 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。 10 实验五 存储管理实验 一、实验目的 1.在Win2000下观察虚拟内存管理程序的性能; 2.学会设置交换文件的大小并观察交换文件的大小; 3.进一步加深对虚拟内存管理的理解。 二、实验设备和仪器 1.计算机 2.Win2000操作系统 三、实验内容及要求 1. 用系统监视器观察虚拟内存管理程序的性能; 2. 设置交换文件的大小并观察交换文件的大小; 3. 观察32位模块程序的加载情况; 实验后,要求写出一份详细的实验报告。 四、实验原理及步骤 1.实验原理 win2000将有限的物理内存映射至虚拟内存空间,每个应用程序都如同拥有4GB的内存地址空间。 应用程序通过调度程序(换页器)使用虚拟内存,当需要更多的内存空间时,换页器会将一部分内存页面换到硬盘上,以此来模拟更多的内存。应用程序不会意识到自己是在真正的物理内存上,还是在硬盘的虚拟内存中。 2. 步骤 (1) 启动程序/管理工具/性能 (2) 控制面板/系统/高级/性能 (3) 程序/附件/系统工具/系统信息 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。 11 实验六 进程通信实验 一、实验目的 1.了解linux环境下通过共享内存实现进程间通信的程序编写方法; 3.以实例加深进程间通讯的另一种机制:共享内存的理解。 二、实验设备和仪器 1.计算机 2.linux操作系统 三、实验内容及要求 要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。 程序如下: #include #define KEY 1234 //键 #define SIZE 1024 //欲建立的共享内存的大小 int main(){ int shmid; char *shmaddr; struct shmid_ds buf; shmid=shmget(KEY,SIZE,IPC_CREATE|0600);//建立共享内存 if(shmid==-1){ printf(\"create share memory failed: %s\ return 0; } if(fork()==0){ shmaddr=(char *)shmat(shmid,NULL,0);//系统自动选择一个地址连接 12 if(shmaddr==(void *)-1){ printf(\"connect to the share memory failed: %s\ return 0; } strcpy(shmaddr,\"hello,this is child process!\\n\"); shmdt(shmaddr); //断开与共享内存的连接 return 0; } else { sleep(3); //等待子进程执行完毕 shmctl(shmid,IPC_STAT,&buf); //取得共享内存的相关信息 printf(\" size of the share memory:\"); printf(\"shm_segsz=%d bytes \\n\ printf(\"process id of the creator:\"); printf(\"shm_cpid=%d\\n\ printf(\"process id of the last operator:\"); printf(\"shm_lpid=%d\\n\ shmaddr=(char *)shmat(shmid,NULL,0);//系统自动选择一个地址连接 if(shmaddr==(void *)-1){ printf(\"connect to the share memory failed: %s\ return 0; } printf(\"print the content of the share memory:\"); printf(\"%s\\n\ shmdt(shmaddr); //断开与共享内存的连接 shmctl(shmid,IPC_RMID,NULL); //当不再有任何其他进程使用该共享内存时系统将自动销毁它 } } 四、实验原理及步骤 1.实验原理 共享内存是Linux支持的3种进程间通信机制中的一种。它实际上是一段特殊的内存区域,这一段区域可以被两个或两个以上的进程映射至自身的地址空间中。一个进程写入共享内存中的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读操作读出,从而实现了进程间的通信。 2. 步骤 gedit proc.c (编辑程序) gcc –o proc proc.c(编译、链接程序) ./proc(执行程序) 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录, 13 实验结果分析及数据处理,问题与讨论。 实验七 时间片轮转进程调度算法实验 一、实验目的 1.观察Win2000环境下的时间片轮转进程调度算法; 3.以实例加深对进程调度算法的理解。 二、实验设备和仪器 1.计算机 2.Win2000操作系统 三、实验内容及要求 要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。 程序如下: #include int i,c=98; INT giThreadNumber = 1; DWORD dwThreadId; // 新线程的标识符 HANDLE hThread; // 新线程的句柄 INT iThread; //在对话框中选择的线程数 DWORD dwCreationFlags=0; // 线程创建标志 hThread = CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE )ChildMain, ( LPVOID )giThreadNumber, dwCreationFlags, & dwThreadId ); hThread = CreateThread( NULL, 0, ( LPTHREAD_START_ROUTINE )ChildMain1, 14 ( LPVOID )giThreadNumber, dwCreationFlags, & dwThreadId ); printf(\"线程1的输入:\\n\"); //c=scanf(\"%d\ for(i=0;i<1000000000;i++); printf(\"线程1的输出%d\\n\ printf(\"%d\\n\} DWORD ChildMain(giThreadNumber) // 子线程号 { long int i,b; char c=99; for(i=0;i<1000000000;i++); printf( \"bbbbbb\\n\" ); bb=1000; printf(\"线程2的输入:\\n\"); //scanf(\"%d\ printf(\"线程2的输出%d,%d\\n\ } DWORD ChildMain1(giThreadNumber) // 子线程号 { char c=100; long int i,b; printf( \"cccccc\\n\" ); for(i=0;i<100000000;i++); bb=10; printf(\"线程3的输入:\\n\"); //scanf(\"%d\ printf(\"线程3的输出%d,%d\\n\} 四、实验原理及步骤 1.实验原理 进程有3种基本状态:运行态、就绪态和阻塞态。进程各状态间可进行相互转换。各进程按时间片的方式进行轮转调度。进程调度算法主要有:FCJS,SJF,RR,HRN等。 2. 步骤 gedit proc.c (编辑程序) gcc –o proc proc.c(编译、链接程序) ./proc(执行程序) 15 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。 实验八 文件系统实验 一、实验目的 1. 以实例加深了解Win2000环境下的文件编程方法; 2.以实例加深了解Linux环境下的文件编程方法; 二、实验设备和仪器 1.计算机 2.Win2000操作系统 3.Linux操作系统 三、实验内容及要求 要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。 程序如下: //文件操作,在linux下的文件编程 #include int main(int argc,char *argv[]); #define BUF_SIZE 96 #define OUTPUT_MODE 0700 int main(int argc,char *argv[]){ int in_fd,out_fd,rd_count,wt_count; char buffer[BUF_SIZE]; if(argc!=3) exit(1); in_fd=open(argv[1],O_RDONLY); if(in_fd<0) exit(2); out_fd=creat(argv[2],OUTPUT_MODE); if(out_fd<0) exit(3); while(1){ 16 rd_count=read(in_fd,buffer,BUF_SIZE); if(rd_count<=0) break; wt_count=write(out_fd,buffer,rd_count); if(wt_count<=0) exit(4); } close(out_fd); close (out_fd); if(rd_count==0) exit(0); else exit(5); } //文件编程,windows的字符窗口编程 #include int main(int argc,char *argv[]){ int in_fd,out_fd,rd_count,wt_count; char buffer[BUF_SIZE]; FILE *o_file,*in_file; if(argc!=3) exit(1); in_file=fopen(argv[1],\"r\"); //打开参数中指定的读文件 o_file=fopen(argv[2],\"w\"); //打开参数中指定的写文件 while(!feof(in_file)){//遇到读文件结束符时结束循环 rd_count=fread(buffer,BUF_SIZE,1,in_file); wt_count=fwrite(buffer,BUF_SIZE,1,o_file); } close(in_file); close (o_file); } 四、实验原理及步骤 1.实验原理 win2000中NTFS文件系统象FAT文件系统一样使用族作为磁盘窨分配的基本单位,主文件表是以文件记录数据来实现的,每个文件记录的大小都被固定为1KB,NTFS把每个文件都视为一组文件属性。 2. 步骤 gedit proc.c (编辑程序) gcc –o proc proc.c(编译、链接程序) ./proc(执行程序) 五、实验报告要求: 在实验报告中,要求详细填写如下内容:实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。 17 18 因篇幅问题不能全部显示,请点此查看更多更全内容