4100225操作系统课程设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“操作系统课程设计”。
计算机与通信工程学院
计算机操作系统课程设计
学 号: 姓 名: 提交日期: 成 绩:
4100225 李彤 2013-01-10
第一部分:基于互斥量mutexes的线程互斥
一、设计任务
在Linux环境下实现,一个线程从终端接收用户的输入,另一个线程显示该字符串并清空用于输入的数组,用互斥量mutexes保证,在同一时刻只能有一个线程存取该字符串数组。
二、源代码
1.Linux代码
#include #include #include #include
sem_s;int data;
void write_data(int *a){
data=*a;
printf(“write data1”);
sem_post(&s);}
void read_data(void){
sem_wait(&s);
int product;
product=data[0]*data[1];
printf(“输出:%d*%d=%dn”,data);}
int main(void){
sem_init(&s,0,0);
int a=1;
pthread_create(&t1,NULL,(void *)operate,NULL);
pthread_create(&t2,NULL,(void *)operate,&a);
pthread_join(t1,NULL);
pthread_join(t2,NULL);}
2.Windows代码
#include #include using namespace std;
string a;int s=1;
void write(){ if(s=1)
s=s-1,cout
cin>>a,s=s+1;else cout
void read(){ if(s=1){
s=s-1;
cout
s=s+1;} else cout
system(“pause”);}
void main(){ int choose;cout
cin>>choose;
if(choose==3)
cout
write();else if(choose==2)
read();
main();}
三、运行结果
第二部分:进程管理器
一、设计任务
在Linux或Window系统环境下,实现一个系统进程管理器,能够显示当前系统的活动进程信息(进程名、用户、优先级、内存使用等),并能结束或创建特定进程。可参考Window下“任务管理器”功能。
二、源代码
#include #include #include #define NULL 0 int shumu=0;//进程的内容结构体 struct node { int a;char ch;};//进程PCB结构体 struct jincheng { int pid;int youxian;float luntime;float zhantime;char zhuangtai;//a表示执行,b表示动态就绪
node *neirong;struct jincheng *next;};
struct jincheng *neijin,*neizhi,*p,*q;
//创建新进程 int creat(){ int i;if(shumu>20){
printf(“内存已满请先换出进程!n”);
i=-1;
return i;} else {
if(neijin==NULL)//如果就绪队列中没有进程的话
{
p=(jincheng*)malloc(sizeof(jincheng));
printf(“请输入新进程的名字(数字):n”);
scanf(“%d”,&p->pid);
printf(“请输入新进程的优先级:(数字)n”);
scanf(“%d”,&p->youxian);
p->luntime=3.5;
p->zhantime=3;
p->neirong=(node*)malloc(sizeof(node));
p->neirong=NULL;
p->zhuangtai='b';//新建进程的状态设置为“就绪”
p->next=NULL;
neijin=p;
shumu++;
i=1;
}
else//如果就绪队列不是空队列
{
p=neijin;
while(p->next!=NULL)
{
p=p->next;//p一直指向就绪队列的队尾
}
q=(jincheng*)malloc(sizeof(jincheng));
q->next=p->next;
p->next=q;//在就绪队列的队尾加入新建的进程
printf(“请输入新进程的名字(数字):n”);
scanf(“%d”,&q->pid);
printf(“请输入新进程的优先级:(数字)n”);
scanf(“%d”,&q->youxian);
q->luntime=3.5;
q->zhantime=3;
q->neirong=(node*)malloc(sizeof(node));
q->neirong=NULL;
q->zhuangtai='b';//新建进程的状态设置为就绪
shumu++;
i=1;
} } return i;}
//换出进程
void huanchu(int a){ p=neijin;while(p->pid!=a&&p!=NULL){
q=p;
p=p->next;} if(p==NULL){
printf(“该进程不在内存里!n”);
return;} if(p==neijin){
neijin=neijin->next;} else {
q->next=p->next;//把目标进程从就绪队列中移出来
} }
//结束进程 void jieshu(){
neizhi->next=NULL;printf(“运行的进程已经结束!n”);return;}
//创建新进程后与正在运行进程比较优先级并根据优先级判断谁该占用处理机 int bijiao(){ int i,j;p=neijin;while(p!=NULL){
q=p;
p=p->next;//q指向进程的末尾,即新建的进程
} i=q->youxian;//i代表新进进程的优先级
j=neizhi->next->youxian;//j代表正在执行进程的优先级
if(i>j)//如果新建的进程的优先级高于正在执行程序的优先级
{
p=neijin;
if(p==q)//就绪队列的进程中只有一个进程
{
neijin=neizhi->next;
p->neirong=(node*)malloc(sizeof(node));
p->neirong->a=9;
p->neirong->ch='c';
neizhi->next=p;//把处理机交给优先级高的新进程
return 1;
}
else
{
while(p->next!=q)
{
p=p->next;
}//执行完后p指针在q指针前面
p->next=neizhi->next;//将正在执行的进程放置p的后面
q->neirong=(node*)malloc(sizeof(node));
q->neirong->a=9;
q->neirong->ch='c';
neizhi->next=q;//将q放置在正在执行列表中,把处理机交给优先级高的进程
neizhi->next->next=NULL;
return 1;
} } else
return-1;}
//从活动就绪进程队列中找到一个优先级最高的进程并为它分配处理机 int zhixing(){ int i,j;p=neijin;if(neizhi->next!=NULL){
return-1;} i=neijin->youxian;p=neijin->next;while(p!=NULL){
j=p->youxian;
if(i>=j)
{
p=p->next;
}
if(i
{
i=p->youxian;
p=p->next;
} } if(neijin->youxian==i){
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong->a=9;
neijin->neirong->ch='c';
neizhi->next=neijin;
neijin=neijin->next;
neizhi->next->next=NULL;} else {
p=neijin;
while(i!=p->youxian)
{
q=p;
p=p->next;
}// q是p前面的指针
p->neirong=(node*)malloc(sizeof(node));
p->zhuangtai='a';
p->neirong->a=9;
p->neirong->ch='c';
neizhi->next=p;//将p放入执行列表
q->next=p->next;//将优先级高的节点舍去
} return 1;}
//查看进程 void chakan(){ p=neizhi->next;printf(“该执行进程的名字为:%dn”,p->pid);printf(“该执行进程的的优先级:%dn”,p->youxian);printf(“该执行进程的轮转时间为:%fn”,p->luntime);printf(“该执行进程占用cpu的时间为:%fn”,p->zhantime);printf(“该执行的进程内容为:n”);printf(“%d ”,p->neirong->a);printf(“%c”,p->neirong->ch);printf(“n”);}
//进程通信
void tongxin(int a){ q=neijin;while(q->pid!=a&&q!=NULL){
q=q->next;}//q为id为a的进程
if(q==NULL){
printf(“所输入的进程不在内存中!n”);
return;}
p=neizhi->next;//p为正在执行的进程
q->neirong=(node*)malloc(sizeof(node));q->neirong->a=p->neirong->a;q->neirong->ch=p->neirong->ch;//将正在执行的进程内容复制给id为a的进程
printf(“通信成功!n”);return;}
//主函数 void main(){ int zhixing();//定义函数
void jieshu();//定义函数
void chakan();//定义函数
void tongxin(int);//定义函数
neizhi=(jincheng*)malloc(sizeof(jincheng));neizhi->next=NULL;neijin=(jincheng*)malloc(sizeof(jincheng));
neijin->next=NULL;
neijin->pid=1;neijin->youxian=6;neijin->luntime=3.5;neijin->zhantime=3;
neijin->neirong=(node*)malloc(sizeof(node));neijin->neirong=NULL;neijin->zhuangtai='b';shumu++;p=(jincheng*)malloc(sizeof(jincheng));p->next=neijin->next;neijin->next=p;
p->pid=2;p->youxian=5;p->luntime=3.5;p->zhantime=3;p->neirong=(node*)malloc(sizeof(node));p->neirong=NULL;p->zhuangtai='b';shumu++;
q=(jincheng*)malloc(sizeof(jincheng));q->next=p->next;p->next=q;q->pid=3;q->youxian=4;q->luntime=3.5;q->zhantime=3;q->neirong=(node*)malloc(sizeof(node));q->neirong=NULL;q->zhuangtai='b';shumu++;int i,n=1;int k,j,s;j=zhixing();int creat();while(n==1){
printf(“********************************************n”);
printf(“*
进程演示系统
*n”);
printf(“********************************************n”);
printf(“
1.创建新的进程
2.查看运行进程 n”);
printf(“
3.换出某个进程
4.结束运行进程 n”);
printf(“
5.进程之间通信
6.退出系统 n”);
printf(“********************************************n”);
printf(“请选择(1~6)n”);
scanf(“%d”,&i);
switch(i)
{
case 1:k=creat();
if(k==1)
printf(“进程创建成功!n”);
if(neijin->next==NULL)
{
printf(“由于只有一个进程所以为它分配处理机.n”);
neizhi->next=neijin;
neijin->neirong=(node*)malloc(sizeof(node));
neijin->neirong->a=3;
neijin->neirong->ch='c';
neijin=NULL;
continue;
}
k=bijiao();
if(k==1)
{
printf(“由于新进程的优先级高于正在执行的进程所以正在执行的n”);
printf(“进程让出处理机交给新进程,而它变为活动就绪!n”);
}
if(k!=1)
printf(“新进程的优先级低于正在运行的进程所以它只有等待!n”);
break;
case 2:
if(neizhi->next==NULL)
{
printf(“没有进程处于执行状态!n”);
continue;
}
chakan();break;
case 3:
if(neijin==NULL)
{
printf(“内存中已经没有处于活动就绪的进程了请创建!n”);
continue;
}
printf(“已有处于活动就绪进程的名字为:n”);
p=neijin;
printf(“(”);
while(p!=NULL)
{
printf(“%d ”,p->pid);
p=p->next;
}
printf(“)n”);
printf(“请输入要换出的处于活动就绪进程的名字n”);
scanf(“%d”,&s);
huanchu(s);
if(neijin==NULL)
printf(“内存中已经没有活动就绪进程!n”);
else
{
printf(“已有处于活动就绪进程的名字为:n”);
p=neijin;
printf(“(”);
while(p!=NULL)
{
printf(“%d ”,p->pid);
p=p->next;
}
printf(“)n”);
}
break;
case 4:
if(neizhi->next==NULL)
{
printf(“没有处于执行状态的进程!n”);
continue;
}
jieshu();
if(neijin==NULL)
{
printf(“已经没有处于活动就绪的进程请创建!n”);
continue;
}
j=zhixing();
if(j==1)
{ printf(“已为一个动态就绪进程中优先级最高的进程分配处理器!n”);
}
break;
case 5:
if(neijin==NULL)
{
printf(“内存中已经没有处于活动就绪的进程了请创建!n”);
continue;
}
if(neizhi->next==NULL)
{
printf(“没有处于执行状态的进程!n”);
continue;
}
printf(“请输入要与正在运行的进程进行进程通讯的进程名字n”);
scanf(“%d”,&s);
tongxin(s);
break;
case 6:exit(0);
default:n=0;
} } }
三、运行结果