操作系统实验指导书确定稿Word文档格式.docx
- 文档编号:16327445
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:18
- 大小:20.50KB
操作系统实验指导书确定稿Word文档格式.docx
《操作系统实验指导书确定稿Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书确定稿Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
将/bin子目录下文件和子目录存入file1;
将/use/bin子目录下文件和子目录追加到file1;
从file1中选取可执行文件的行,存入file2;
从文件file2中选取文件名垂直列存入file31.
五、实验报告要求:
在实验报告中,要求详细填写如下内容:
实验目的,实验设备和仪器,实验原理简述,实验记录,实验结果分析及数据处理,问题与讨论。
实验二进程实验
1.学会在linux下创建进程;
2.观察进程并发执行的情况;
3.加深对进程的理解。
要求读懂程序,并观察程序的输出,并分析实验结果,写出实验报告。
程序如下:
#include<
stdio.h>
sys/types.h>
unistd.h>
intmain(void){
pid_tpid;
intdata=5;
if((pid=vfork())<
0)
{
printf("
forkerror"
);
exit(0);
}
elseif(pid==0)
data--;
child'
sdatais%d\n"
data);
execve("
newproc"
0,0);
else
parent'
}
//注意,此处的程序单独编译
main(){
inti;
thisisinnewproc!
\n"
for(i=0;
i<
400000;
i++){
//putchar(i);
进程用来述程序的并发执行,进程有3种基本状态:
运行态、就绪态和阻塞态。
进程各状态间可进行相互转换。
各进程按时间片的方式进行轮转调度。
geditproc.c(编辑程序)
gcc–oprocproc.c(编译、链接程序)
geditnewproc.c(编辑程序)
gcc–oprocnewproc.c(编译、链接程序)
./proc(执行程序)
实验三信号量实践程序实验
1.学会使用信号量解决资源共享问题;
2.观察各进程并发执行竟争资源的情况;
3.加深对信号量的理解。
/*file:
semaphore.c*/
//信号量实践程序,在程序中建立了5个进程,每个进程都尝试运行update_file()
stdlib.h>
time.h>
sys/wait.h>
linux/sem.h>
#defineNUM_PROCS5
#defineSEM_ID250
#defineFILE_NAME"
/tmp/sem_aaa"
#defineDELAY4000000
voidupdate_file(intsem_set_id,char*file_path,intnumber){
structsembufsem_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"
number);
printf("
fclose(file);
//发送信号,把信号量的数值加1,此处相当于对信号量进行V操作
sem_op.sem_op=1;
//子进程写文件
voiddo_child_loop(intsem_set_id,char*file_name){
pid_tpid=getpid();
inti,j;
3;
update_file(sem_set_id,file_name,pid);
for(j=0;
j<
4000000;
j++);
intmain(intargc,char**argv)
{
intsem_set_id;
//信号量集的ID
unionsemunsem_val;
//信号量的数值,用于semctl()
intchild_pid;
intrc;
//建立信号量集,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)
semctl"
//建立一些子进程,使它们可以同时以竞争的方式访问信号量
NUM_PROCS;
child_pid=fork();
switch(child_pid){
case-1:
fork"
case0:
//子进程
do_child_loop(sem_set_id,FILE_NAME);
exit(0);
default:
//父进程接着运行
break;
}
//等待子进程结束
intchild_status;
wait(&
child_status);
we'
redone\n"
fflush(stdout);
return0;
为使多个进程能互斥地访问某临界资源,只需为该资源设置一个互斥信号量mutex,并设其初值为1,然后将各进程的临界区CS置于P(mutex)和V(mutex)操作之间即可。
geditsemaphore.c(编辑程序)
gcc–osemaphoresemaphore.c(编译、链接程序)
./semaphore(执行程序)
实验四生产者-消费者程序实验
实验目的
2.观察生产者和消费者进程并发执行竞争资源的情况;
3.进一步以实例加深对信号量的理解。
//生产者-消费者程序
//fileproducer-consumer.c
//在程序中,父进程建立许多子进程,父进程增加信号量的数值,子进程减少信号量的数值
#defineNUM_LOOPS20
intmain(intargc,char*argv[])
//信号量的数值
//子进程的PID
//信号量操作结构
//返回值
structtimespecdelay;
//延迟时间
//建立信号量集,集中只含有一个信号量
sem_set_id=semget(IPC_PRIVATE,1,0600);
semget"
semaphoresetcreated,semaphoresetid%d\n"
sem_set_id);
//信号量数值设置为零
sem_val.val=0;
//建立子进程
child_pid=fork();
switch(child_pid){
case-1:
//失败
case0:
for(i=0;
NUM_LOOPS;
//被阻塞,直到信号量的数值变为非负值
sem_op.sem_num=0;
sem_op.sem_op=-1;
sem_op.sem_flg=0;
semop(sem_set_id,&
printf("
consumer:
i);
fflush(stdout);
break;
default:
//父进程
producer%d\n"
//把信号量的数值增加1
sem_op.sem_op=1;
//等待一段时间
if(rand()>
3*(RAND_MAX/4)){
delay.tv_sec=0;
delay.tv_nsec=10;
nanosleep(&
delay,NULL);
}
geditproducer-consumer.c(编辑程序)
gcc–oproducer-consumerproducer-consumer.c(编译、链接程序)
./producer-consumer(执行程序)
实验五存储管理实验
1.在Win2000下观察虚拟内存管理程序的性能;
2.学会设置交换文件的大小并观察交换文件的大小;
3.进一步加深对虚拟内存管理的理解。
2.Win2000操作系统
用系统监视器观察虚拟内存管理程序的性能;
设置交换文件的大小并观察交换文件的大小;
观察32位模块程序的加载情况;
实验后,要求写出一份详细的实验报告。
win2000将有限的物理内存映射至虚拟内存空间,每个应用程序都如同拥有4GB的内存地址空间。
应用程序通过调度程序(换页器)使用虚拟内存,当需要更多的内存空间时,换页器会将一部分内存页面换到硬盘上,以此来模拟更多的内存。
应用程序不会意识到自己是在真正的物理内存上,还是在硬盘的虚拟内存中。
启动程序/管理工具/性能
控制面板/系统/高级/性能
程序/附件/系统工具/系统信息
实验六进程通信实验
1.了解linux环境下通过共享内存实现进程间通信的程序编写方法;
3.以实例加深进程间通讯的另一种机制:
共享内存的理解。
sys/ipc.h>
sys/shm.h>
errno.h>
#defineKEY1234//键
#defineSIZE1024//欲建立的共享内存的大小
intmain(){
intshmid;
char*shmaddr;
structshmid_dsbuf;
shmid=shmget(KEY,SIZE,IPC_CREATE|0600);
//建立共享内存
if(shmid==-1){
createsharememoryfailed:
%s"
strerror(errno));
return0;
if(fork()==0){
shmaddr=(char*)shmat(shmid,NULL,0);
//系统自动选择一个地址连接
if(shmaddr==(void*)-1){
connecttothesharememoryfailed:
strcpy(shmaddr,"
hello,thisischildprocess!
shmdt(shmaddr);
//断开与共享内存的连接
{
sleep(3);
//等待子进程执行完毕
shmctl(shmid,IPC_STAT,&
buf);
//取得共享内存的相关信息
sizeofthesharememory:
"
shm_segsz=%dbytes\n"
buf.shm_segsz);
processidofthecreator:
shm_cpid=%d\n"
buf.shm_cpid);
processidofthelastoperator:
shm_lpid=%d\n"
buf.shm_lpid);
printthecontentofthesharememory:
%s\n"
shmaddr);
shmctl(shmid,IPC_RMID,NULL);
//当不再有任何其他进程使用该共享内存时系统将自动销毁它
共享内存是Linux支持的3种进程间通信机制中的一种。
它实际上是一段特殊的内存区域,这一段区域可以被两个或两个以上的进程映射至自身的地址空间中。
一个进程写入共享内存中的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读操作读出,从而实现了进程间的通信。
实验七时间片轮转进程调度算法实验
1.观察Win2000环境下的时间片轮转进程调度算法;
3.以实例加深对进程调度算法的理解。
#include<
windows.h>
DWORDChildMain();
DWORDChildMain1();
intbb=1;
main()
inti,c=98;
INTgiThreadNumber=1;
DWORDdwThreadId;
//新线程的标识符
HANDLEhThread;
//新线程的句柄
INTiThread;
//在对话框中选择的线程数
DWORDdwCreationFlags=0;
//线程创建标志
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ChildMain,(LPVOID)giThreadNumber,
dwCreationFlags,&
dwThreadId);
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ChildMain1,(LPVOID)giThreadNumber,
线程1的输入:
//c=scanf("
%d"
&
c);
1000000000;
i++);
线程1的输出%d\n"
c);
bb);
DWORDChildMain(giThreadNumber)//子线程号
longinti,b;
charc=99;
printf("
bbbbbb\n"
);
bb=1000;
线程2的输入:
//scanf("
b);
线程2的输出%d,%d\n"
c,b);
DWORDChildMain1(giThreadNumber)//子线程号
charc=100;
cccccc\n"
100000000;
bb=10;
线程3的输入:
线程3的输出%d,%d\n"
进程有3种基本状态:
进程调度算法主要有:
FCJS,SJF,RR,HRN等。
实验八文件系统实验
以实例加深了解Win2000环境下的文件编程方法;
2.以实例加深了解Linux环境下的文件编程方法;
3.Linux操作系统
//文件操作,在linux下的文件编程
fcntl.h>
intmain(intargc,char*argv[]);
#defineBUF_SIZE96
#defineOUTPUT_MO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书 确定