大连理工大学
本科实验报告
课程名称:操作系统实验
学院(系):计算机科学与技术学院专业:计算机科学与技术
班级:电计
学号:
学生姓名:
年月日
实验项目列表
大连理工大学实验报告
学院(系):计算机科学与技术学院专业:计算机科学与技术班级:电计1301
姓名:学号:组:___
实验时间:2016.6.3 实验室:综412 实验台:
指导教师签字:成绩:
进程管理实验
一、实验目的
加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。
二、实验原理和内容
原理:(1)fork成功创建子进程后将返回子进程的进程号,不成功会返回-1 (2)exec 系统调用有一组6个函数,其中示例实验中引用了execve 系统调用语法:
#include
int execve(const char *path, const char *argv[], const char * envp[]);
path 要装入的新的执行文件的绝对路径名字符串.
argv[] 要传递给新执行程序的完整的命令参数列表(可以为空).
envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空). Exec 执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。exec 调用失败,它会返回-1。
内容:
(1) 每个进程都执行自己独立的程序,打印自己的pid ,每个父进程打印其
子进程的pid;
(2) 每个进程都执行自己独立的程序,打印自己的pid ,父进程打印其子进
程的pid;
(3) 编写一个命令处理程序,能处理max(m,n), min(m,n)和 average(m,n,l)
这几个命令。(使用exec 函数族) 三 实验代码及结果
(1)
#include
if(fork() == 0) {
printf("子进程的pid 为:%d.\n",getpid()); if(fork() == 0) {
printf("二级子进程的pid 为:%d.\n",getpid()); } } else {
printf("父进程的pid为%d.\n",getpid());
}
return 0;
}
运行结果:
(2)
#include
#include
int main()
{
if(fork() == 0)
{
printf("子进程的pid为%d.\n",getpid());
}
else
{
if(fork() == 0)
{
printf("子进程2的pid %d.\n",getpid());
}
else
{
printf("父进程的pid为%d.\n\n",getpid());
}
}
return 0;
}
(3)
调用函数为:
include
#include
#include
#define N 10
int main()
{
int i;
char cmdname[N];
printf("$ ");
scanf("%s",cmdname);
if(strcmp(cmdname,"min")==0)
{
execl("/home/lenovo/min","min",NULL);
}
else if(strcmp(cmdname,"max")==0)
{
execl("/home/lenovo/max","max",NULL);
}
else if(strcmp(cmdname,"ave")==0)
{
execl("/home/lenovo/average","ave",NULL);
}
else
printf("′í?ó!\n");
return 0;
}
Max函数为:
#include
#include
#include
int main()
{
int a,b;
printf("请输入要比较的两个数:\n");
scanf("%d%d",&a,&b);
printf("大的数是:%d\n",a>b?a:b);
}
Min函数为:
#include
#include
#include
int main()
{
int a,b;
printf("请输入要比较的两个数:\n");
scanf("%d%d",&a,&b);
printf("小的数是:%d\n",a
}
Average函数为:
#include
#include
#include
int main()
{
float a,b,c;
printf("请输入要求平均值的两个数:\n");
scanf("%f%f%f",&a,&b,&c);
printf("平均值为:%.3f\n",(a+b+c)/3);
}
实验结果为:
(此处文字打错,实际输入三个数)
四实验总结
本次实验熟悉了用cygwin软件模拟linux系统的编译环境,熟悉了编译语句gcc 1.c –o 1和执行语句./1.exe的使用。并且编程实现了fork成功创建子进程及父子进程间的关系,比如else则代表父进程,比如二级子进程的建立方法。
大连理工大学实验报告
学院(系):计算机科学与技术学院专业:计算机科学与技术班级:电计1301
姓名:学号:组:___
实验时间:2016.6.3 实验室:综412 实验台:
指导教师签字:成绩:
存储管理实验
一实验目的
加深对于存储管理的了解,掌握虚拟存储器的实现原理;观察和了解重要的页面置换算法和置换过程。练习模拟算法的编程技巧,锻炼分析试验数据的能力。
二实验内容
1. 示例实验程序中模拟两种置换算法:LRU算法和FIFO算法。
2. 能对两种算法给定任意序列不同的页面引用串和任意页面实内存数目的组合测试,显示页置换的过程。
3. 能统计和报告不同置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。
三实验代码及结果
#include
#include
#include
int a[100],b[100];//执行页号序列、主存中的队列
int len;//序列长度
int n;//引用页面号的个数0~n-1
int m;//内存中可容纳页面数目
int no;//缺页次数
float qyl;//缺页率
int front,rear;
int check(int x)//检查队列中是否有该页号
{
int j;
for(j=front;j<=rear;j++)
{
if(b[j]==x) return 1;
}
return 0;
}
int find(int i)//寻找队列中最近最少使用的页号,仅lrU算法使用该函数{
int j,k,small=100,x,count=0;
int flag[100];//标记这个数是否在最近使用的m个数中
memset(flag,0,sizeof(flag));
for(k=i-1;k>=0;k--)
{
if(flag[a[k]]==0)
{
flag[a[k]]=1;
count++;
if(count==m)
{
for(j=front;j<=rear;j++)
{
if(b[j]==a[k]) return j;
}
}
}
}
return x;
}
void FIFO()//先进先出算法
{
int i,j;
front=rear=0;
no=0;
b[front]=a[0];
printf("%d 无淘汰缺页加1\n",b[front]);
no+=1;
for(i=1;i { if((rear-front+1) { if(check(a[i])==0)//检测到队列中没有该页号 { b[++rear]=a[i]; for(j=front;j<=rear;j++) printf("%d ",b[j]); printf("无淘汰缺页加1\n"); no+=1; } else if(check(a[i])==1)//检测到队列中有该页号 { for(j=front;j<=rear;j++) printf("%d ",b[j]); printf("无淘汰不缺页\n"); } } else if((rear-front+1)==m)//内存页数已满 { if(check(a[i])==0)//检测到队列中没有该页号 { b[++rear]=a[i]; front+=1; for(j=front;j<=rear;j++) printf("%d ",b[j]); printf("淘汰页号%d 缺页加1\n",b[front-1]); no+=1; } else if(check(a[i])==1)//检测到队列中有该页号 { for(j=front;j<=rear;j++) printf("%d ",b[j]); printf("无淘汰不缺页\n"); } } } qyl=(float)no/(float)len; printf("序列长度:%d 缺页次数:%d 缺页率:%.2f\n",len,no,qyl); } void LRU()//最近最少使用算法 { int i,j,temp; front=rear=0; no=0; b[front]=a[0]; printf("%d 无淘汰缺页加1\n",b[front]); no+=1;