当前位置:文档之家› 操作系统实习报告(源代码)

操作系统实习报告(源代码)

操作系统实习报告(源代码)
操作系统实习报告(源代码)

#define false 0

#define true 1

#include "stdio.h"

typedef struct

{

char name[3]; /*文件或目录名*/

char type[2]; /*文件类型名*/

char attribute; /*属性*/

char address; /*文件或目录的起始盘块号*/

char length; /*文件长度,以盘块为单位*/

}content; /*目录结构*/

#define n 5 /*模拟实验中系统允许打开文件的最大数量*/

typedef struct

{

int dnum; /*磁盘盘块号*/

int bnum; /*盘块内第几项*/

}pointer; /*已打开文件表中读写指针的结构*/

typedef struct

{

char name[20]; /*文件绝对路径名*/

char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/

int number; /*文件起始盘块号*/

int length; /*文件长度,文件占用的字节数*/

int flag; /*操作类型,用"0"表示以读操作方式开文件,用"1"表示写操作方式打开文件*/ pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum为"0"*/ pointer write; /*写文件的位置,文件建立时dnum为文件起始盘块号,bnum为"0",打开时为文件末尾*/

}OFILE; /*已打开文件表项类型定义*/

struct

{

OFILE file[n]; /*已打开文件表*/

int length; /*已打开文件表中登记的文件数量*/

}openfile; /*已打开文件表定义*/

char buffer1[64];/*模拟缓冲1*/

content buffer2[8];/*模拟缓冲2*/

FILE *fc; /*模拟磁盘的文件指针*/

void copen(OFILE *x1,OFILE *x2)

OFILE *x1,*x2;

{

strcpy(x1->name,x2->name);

x1->attribute=x2->attribute;

x1->number=x2->number;

x1->length=x2->length;

x1->flag=x2->flag;

x1->read.dnum=x2->read.dnum;

x1->read.bnum=x2->read.bnum;

x1->write.dnum=x2->write.dnum;

x1->write.bnum=x2->write.bnum;

}

sopen(name)

/*在已打开文件表中查找文件name*/

char *name;

{

int i;

i=0;

while(i

i++;

if(i>=openfile.length)

return(-1);

return(i);

}/*查找sopen函数结束*/

dopen(name)

/*在已打开文件表中删除文件name*/

char *name;

{

int i;

i=sopen(name);

if(i==-1)

printf("文件未打开/n");

else

{

copen(&openfile.file[i],&openfile.file[openfile.length-1]);

openfile.length--;

}

}/*删除函数结束*/

iopen(x)

/*在已打开文件表中插入文件name*/

content *x;

{

int i;

i=sopen(x->name);

if(i!=-1)

{

printf("文件已经打开/n");

return(false);

}

else if(openfile.length==n)

{

printf("已打开文件表已满/n");

return(false);

}

else

{

copen(&openfile.file[openfile.length],x);

openfile.length++;

return(true);

}

}/*填写已打开文件表函数结束*/

allocate( )

/*分配一个磁盘块,返回块号*/

{

int i;

fseek(fc,0,SEEK_SET); /*将模拟磁盘的文件指针移至模拟磁盘FAT表*/

fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲buffer1中*/

for(i=3;i<63;i++)

if(buffer1[i]==0)

{ /*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘*/

buffer1[i]=255;

fseek(fc,0,SEEK_SET);

fwrite (buffer1,64L,1,fc);

return(i); /*返回磁盘号*/

}

fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲buffer1中*/

for(i=0;i<63;i++)

if(buffer1[i]==0)

{/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写回磁盘*/ buffer1[i]=255;

fseek(fc,-64L,SEEK_CUR);

fwrite(buffer1,64L,1,fc);

return(i+64); /*返回磁盘号*/

}

printf("已经没有磁盘空间/n");

return(false);

}/*分配磁盘块函数结束*/

read_file(name,length)

/*读文件函数,文件路径名name,读取长度length*/

char *name;

int length;

{

int i,t;

char ch;

if((i=sopen(name))==-1)

{

printf("文件没有打开或不存在/n");

return(false);

}

if(openfile.file[i].flag==1)

{

printf("文件以写方式打开,不能读/n");

return(false);

}

t=0;

fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);

fread(buffer1,64,1,fc);

while(t

{

putchar(buffer1[openfile.file[i].read.bnum]);/*读出一个字符(这里是在屏幕上显示)*/

if((t+1)%64==0)putchar('/n');

/*修改读指针*/

openfile.file[i].read.bnum++;

if(openfile.file[i].read.bnum>=64)/*一块读完,读取下一个盘块*/

{

fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET);

fread(buffer1,64,1,fc);

openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64];/*修改读指针*/

openfile.file[i].read.bnum=0;

fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);

fread(buffer1,64,1,fc);/*读取下一个*/

}

t++;

}

}/*读函数结束*/

write_file(name,buff,length)

/*写文件函数*/

char *name;/*文件路径名*/

char *buff;/*存放准备写入磁盘的内容*/

int length;/*写入内容的长度*/

{

int i,t,dd;

if((i=sopen(name))==-1)/*文件不存在,无法写*/

{

printf("文件没有打开或不存在/n");

return(false);

}

if(openfile.file[i].flag==0)

{

printf("文件以读方式打开,不能写/n");

return(false);

}

t=0;

fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);

fread(buffer1,64,1,fc);

while(t

{

buffer1[openfile.file[i].write.bnum]=buff[t];

openfile.file[i].write.bnum++;

openfile.file[i].length++;

if(openfile.file[i].write.bnum>=64)

{

fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);

fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/

if((dd=allocate())==false)

{

openfile.file[i].write.bnum--;

openfile.file[i].length--;

printf("无磁盘空间,部分信息丢失,写失败/n");

return(false);

}/*if*/

fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);

fread(buffer1,64,1,fc);

buffer1[openfile.file[i].write.dnum%64]=dd;

fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);

fwrite(buffer1,64,1,fc);

openfile.file[i].write.dnum=dd;

openfile.file[i].write.bnum=0;

}/*if*/

t++;

}/*while*/

fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);

fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/

}/*写函数结束*/

search(name,flag,dnum,bnum)

/*查找路径名为name的文件或目录,返回该目录的起始盘块号*/

char *name;

int flag; /*flag=8表示查找目录,否则为文件*/

int *dnum,*bnum;/*返回找到文件或目录的目录项的位置:盘块dnum中第bnum项*/ {

int k,i,s,t,j,last=0;

char pna[3],type[2];

if((strcmp(name,"")==0)||(strcmp(name,"/")==0))/*根目录*/

return(2);

k=0;

if(name[0]=='/')k=1;

i=2; /*i=根目录的起始盘块号*/

while(last!=1)

{

/*pna=从name中分离出"/"后一个目录名(或文件名)*/

for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='/0';s++,k++)

pna[s]=name[k];

for(;s<3;s++)/*用空格补全名字长度*/

pna[s]=' ';

while(name[k]!='.'&&name[k]!='/0'&&name[k]!='/')/*除去多余字符*/

k++;

type[0]=type[1]=' ';

if(name[k]=='.')/*取文件类型名type*/

if(flag==8)

{

printf("目录不应该有有类型名,查找失败/n");

return(false);

}

else

{/*文件遇到类型名认为结束,后面的字符作废*/

k++;

if(name[k]!='/0')type[0]=name[k];

k++;

if(name[k]!='/0')type[1]=name[k];

if(name[k]!='/0'&&name[k+1]!='/0')

{

printf("文件名错误/n");

return(false);

}

last=1;

}

else

if(name[k]!='/0')k++;

if(name[k]=='/0')

last=1;

/*查找目录且名字等于pna的目录项*/

fseek(fc,i*64L,SEEK_SET);

fread(buffer2,64L,1,fc);

j=0;

if(last==1&&flag!=8)

while(j<8&&!(buffer2[j].attribute!=8&&buffer2[j].name[0]==pna[0]&&

buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]&&

buffer2[j].type[0]==type[0]&&buffer2[j].type[1]==type[1]))

j++;

else

while(j<8&&!(buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]&&buffer2[j].name[1]= =pna[1]

&&buffer2[j].name[2]==pna[2]))

j++;

if(j<8)/*找到该目录或文件*/

if(last==1)/*查找结束*/

{

*dnum=i;

*bnum=j;

return(buffer2[j].address);

}

else/*查找还未结束*/

i=buffer2[j].address;/*读取下一个盘块*/

else

return(false);

}/*while 查找结束*/

}/*search()结束*/

create_file(name,attribute)

/*建立文件函数,路径名name,文件属性attribute*/

char *name;

int attribute;

{

int dnum,bnum,i,j,last,k,s,d,t,tt,b,dd,flag,dn,bn;

char dname[3],tname[2],pathname[20];

OFILE x;

if(attribute%2==1)

{

printf("只读文件,无法写,不能建立/n");

return(false);

}

if(openfile.length==n)

{

printf("已打开表已满,不能建立/n");

return(false);

}

/* 将name分成两部分,目录路径pathname和目录名dname*/

for(j=0;name[j]!='/0';j++)/*查找最后一个"/"*/

if(name[j]=='/')s=j;

/*分离目录路径*/

for(j=0;j

pathname[j]=name[j];

pathname[j]='/0';

/*分离文件名*/

for(k=0,j=s+1;name[j]!='/0'&&k<3&&name[j]!='.';j++,k++)

dname[k]=name[j];

if(k==0)

{

printf("错误文件名或目录名/n");

return(false);

}

for(;k<3;k++)

dname[k]=' ';

k=0;

if(name[j++]=='.')/*分离类型名*/

{

for(;name[j]!='/0'&&k<2&&name[j]!='.';j++,k++)

tname[k]=name[j];

}

for(;k<2;k++)

tname[k]=' ';

if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn 和项数bn*/

{

printf("目录不存在,不能建立");

return(false);

}

/*确认该目录不存在的同时查找空目录项*/

b=-1;

fseek(fc,d*64L,SEEK_SET);

fread(buffer2,64L,1,fc); /*读出dnum盘块的内容*/

for(t=0;t<8;t++)

{

if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]== dname[2]

&&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1])

{/*找到名字dname的文件,建立失败*/

printf("文件已经存在,不能建立/n");

return(false);

}

if(buffer2[t].name[0]=='$'&&b==-1)

b=t;

}/*for*/

if(b==-1)/*没有空目录项,建立失败*/

{

printf("目录无空间/n");

return(false);

}

if((dd=allocate( ))==false)/*分配给建立目录的磁盘盘块dd*/

{

printf("建立文件失败/n");

return(false);

}

/*填写目录项*/

for(i=0;i<3;i++)

buffer2[b].name[i]=dname[i];

for(i=0;i<2;i++)

buffer2[b].type[i]=tname[i];

buffer2[b].attribute=attribute;

buffer2[b].address=dd;

buffer2[b].length=0;

fseek(fc,d*64L,SEEK_SET);

fwrite(buffer2,64L,1,fc);

/*填写已打开文件表*/

strcpy(https://www.doczj.com/doc/6218617257.html,,name);

x.attribute=attribute;

x.number=dd;

x.length=0;

x.flag=1;

x.read.dnum=x.write.dnum=dd;

x.read.bnum=x.write.bnum=0;

iopen(&x);

}/*建立文件结束*/

open_file(name,attribute)

/*打开文件函数*/

char *name;

int attribute;

{

OFILE x;

int dnum,bnum,last,i,d;

if((d=search(name,4,&dnum,&bnum))==false)

{

printf("文件不存在,打开操作失败/n");

return(false);

}

fseek(fc,dnum*64L,SEEK_SET);/*读出对应目录项*/

fread(buffer2,64,1,fc);

if((buffer2[bnum].attribute%2==1)&& attribute==1)/*对只读文件要求写*/ {

printf("文件不能写,打开失败");

return(false);

}

strcpy(https://www.doczj.com/doc/6218617257.html,,name);

x.attribute=buffer2[bnum].attribute;

x.number=buffer2[bnum].address;

x.read.dnum=x.write.dnum=buffer2[bnum].address;

x.read.bnum=x.write.bnum=0;

x.flag=attribute;

if(attribute==1)

{

while(d!='/xff')/*寻找文件末尾*/

{

fseek(fc, d/64*64L, SEEK_SET);

fread(buffer1,64L,1,fc);/*读出dnum项所在FAT*/

last=d;

d=buffer1[d%64];/*读出dnum块下一块内容赋给dnum*/ }/*while*/

x.write.dnum=last;/*填写写指针*/

fseek(fc, last*64L, SEEK_SET);

fread(buffer1,64L,1,fc);

for(i=0;i<64&&buffer1[i]!='#';i++);

x.write.bnum=i;

x.length=(buffer2[bnum].length-1)*64+i;

}

iopen(&x);/*填写已打开文件表*/

}

close_file(name)

/*关闭文件函数*/

char *name;

{

int i,dnum,bnum;

if((i=sopen(name))==-1)

{

printf("打开的文件中没有该文件,关闭失败/n");

return(false);

}

if(openfile.file[i].flag==1)/*写文件的追加文件结束符*/

{

fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);

fread(buffer1,64,1,fc);

buffer1[openfile.file[i].write.bnum]='#';

fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);

fwrite(buffer1,64,1,fc);

fputc('#',fc);

search(name,4,&dnum,&bnum);/*查找该文件目录位置*/

/*修改目录中的文件长度*/

fseek(fc,dnum*64L, SEEK_SET);

fread(buffer2,64,1,fc);

buffer2[bnum].length=openfile.file[i].length/64+1;

fseek(fc, dnum*64L, SEEK_SET);

fwrite(buffer2,64,1,fc);

}

/*在已打开文件表中删除该文件的登记项*/

if(openfile.length>1)

copen(&openfile.file[i],&openfile.file[openfile.length-1]);

openfile.length--;

}

delete(name)

/*删除文件*/

char *name;

{

int dnum,bnum,t;

if((t=search(name,4,&dnum,&bnum))==false)

{

printf("文件不存在/n");

return(false);

}

if(sopen(name)!=-1)

{

printf("该文件打开,不能删除/n");

return(false);

}

fseek(fc,dnum*64L, SEEK_SET);

fread(buffer2,64,1,fc);

buffer2[bnum].name[0]='$';/*将该文件的目录置成空目录*/

fseek(fc,dnum*64L, SEEK_SET);

fwrite(buffer2,64,1,fc);

while(t!='/xff')/*通过FAT查找每一个盘块号,并依次删除*/

{

dnum=t;

fseek(fc, dnum/64*64, SEEK_SET);

fread(buffer1,64,1,fc);

t=buffer1[dnum%64];

buffer1[dnum%64]=0;

fseek(fc, dnum/64*64L, SEEK_SET);

fwrite(buffer1,64,1,fc);

}

}/*文件删除结束*/

md(name)

/*建立目录函数,目录路径名name*/

char *name;

{

int dnum,bnum,i,j,last,k,s,d,t,tt,b,dd,flag,dn,bn;

char dname[3],pathname[20];

i=2;/* i=根目录的起始盘块号*/

/* 将name分成两部分,目录路径pathname和目录名dname*/ for(j=0;name[j]!='/0';j++)/*查找最后一个"/"*/

if(name[j]=='/')s=j;

/*分离目录路径*/

for(j=0;j

pathname[j]=name[j];

pathname[j]='/0';

/*分离目录名*/

for(k=0,j=s+1;name[j]!='/0'&&k<3&&name[j]!='.';j++,k++) dname[k]=name[j];

if(k==0)

{

printf("错误文件名或目录名/n");

return(false);

}

for(;k<3;k++)

dname[k]=' ';

if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径*/

{

printf("目录不存在,不能建立/n");

return(false);

}

b=-1;

/*确认该目录不存在的同时查找空目录项*/

fseek(fc,d*64L,SEEK_SET);

fread(buffer2,64L,1,fc);/*读出d盘块的内容*/

for(t=0;t<8;t++)

{

if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1] &&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8) {/*找到名字dname的目录,建立失败*/

printf("目录已经存在,不能建立/n");

return(false);

}

if(buffer2[t].name[0]=='$'&&b==-1)

b=t;

}/*for*/

if(b==-1)/*没有空目录项,不能建立*/

{

printf("目录无空间/n");

return(false);

}

if((dd=allocate( ))==false)/*分配给建立目录的磁盘盘块dd*/

{

printf("目录不能建立/n");

return(false);

}

/*填写目录项*/

for(i=0;i<3;i++)

buffer2[b].name[i]=dname[i];

buffer2[b].type[0]=buffer2[b].type[1]=' ';

buffer2[b].attribute=8;

buffer2[b].address=dd;

buffer2[b].length=0;

fseek(fc,d*64L,SEEK_SET);

fwrite(buffer2,64L,1,fc);

/*分给新建目录的盘块初始化*/

for(t=0;t<8;t++)

buffer2[t].name[0]='$';

fseek(fc, dd*64L, SEEK_SET);

fwrite(buffer2,64L,1,fc);

}/*建立目录结束*/

dir(name)

/*显示目录内容*/

char *name;

{

int i,bnum,t,tt,dnum,dn,bn;

if((dnum=search(name,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和盘块内项数bn*/

{

printf("目录不存在/n");

return(false);

}

printf("名称扩展名起始盘块长度/n");

/*显示目录内容*/

fseek(fc,dnum*64L, SEEK_SET);

fread(buffer2,64L,1,fc);

for(t=0;t<8;t++)/*显示该盘块中目录项的内容*/

if(buffer2[t].name[0]!='$')

printf(" %c%c%c %c%c %4d%7d/n", buffer2[t].name[0], buffer2[t].name[1],

buffer2[t].name[2], buffer2[t].type[0], buffer2[t].type[1],buffer2[t].address, buffer2[t].length);

}/*显示目录函数结束*/

typefile(name)

/*显示文件内容*/

char *name;

{

int i,dnum,dn,bn,t;

if((dnum=search(name,1,&dn,&bn))==false)

{

printf("文件不存在/n");

return(false);

}

if(sopen(name)!=-1)

{

printf("该文件打开,不能显示/n");

return(false);

}

while(dnum!='/xff')

{

fseek(fc,dnum*64L,SEEK_SET);

fread(buffer1,64,1,fc);/*读一个盘块到缓冲*/

for(t=0;t<64&&buffer1[t]!='#';t++)/*显示缓冲中内容*/ putchar(buffer1[t]);

printf("/n");

/*获得下一个盘块*/

fseek(fc, dnum/64*64L, SEEK_SET);

fread(buffer1,64,1,fc);

dnum=buffer1[dnum%64];

}

}/*显示文件函数结束*/

change(name,attribute)

/*改变文件name的属性为attribute*/

char *name;

int attribute;

{

int dnum,bnum;

if(search(name,1,&dnum,&bnum)==false)/*查找文件目录*/ {

printf("文件不存在/n");

return(false);

}

if(sopen(name)!=-1)

{

printf("该文件打开,不能改变文件属性/n");

return(false);

}

fseek(fc,dnum*64L,SEEK_SET);

fread(buffer2,64,1,fc);/*读出该目录所在盘块*/

buffer2[bnum].attribute=attribute;/*修改属性*/

fseek(fc,dnum*64L,SEEK_SET);

fwrite(buffer2,64,1,fc);/*写回磁盘*/

}/*改变文件属性函数结束*/

main( )

{

char name[20];

int attribute,type,length,i,a,j;

char buffer[64];

/*建立文件,模拟磁盘*/

if((fc=fopen("c://os//c","w+"))==NULL)

{

printf("无法打开文件/n");

exit(0);

}

/*初始化已打开文件表*/

openfile.length=0;

/*初始化磁盘*/

/*初始化文件分配表*/

buffer1[0]=buffer1[1]=buffer1[2]=255;/*磁盘第0、1块存放FAT表,第2块存放跟目录*/

for(i=3;i<64;i++)

buffer1[i]=0;

buffer1[13]=buffer1[49]=254;/*假定模拟磁盘中有两个坏盘块:第13块和49块*/

fwrite(buffer1,64L,1,fc);

for(i=0;i<64;i++)

buffer1[i]=0;

fwrite(buffer1,64L,1,fc);

/*初始化根目录*/

for(i=0;i<8;i++)

buffer2[i].name[0]='$';/*若目录项的第一个字符为"$"表示该目录项为空*/ fwrite(buffer2,64L,1,fc);

/*初始化已打开文件表*/

while(1)

{

printf("/n 0 - 结束/n");

printf(" 1 - 建立文件/n");

printf(" 2 - 打开文件/n");

printf(" 3 - 读文件/n");

printf(" 4 - 写文件/n");

printf(" 5 - 关闭文件/n");

printf(" 6 - 删除文件/n");

printf(" 7 - 建立目录/n");

printf(" 8 - 显示目录内容/n");

printf(" 9 - 显示文件内容/n");

printf(" 10 - 改变文件属性/n");

printf(" 选择功能项(0~9):");

scanf("%d",&a);

switch(a)

{

case 0: /*a=0程序结束*/

fclose(fc);

exit(0);

case 1: /*a=1建立文件*/

printf("输入文件路径名和文件属性(1-只读文件,3-只读系统文件,4-普通文件):");

scanf("%s%d",name,&attribute);

create_file(name,attribute); /*建立文件*/

break;

case 2: /*a=2打开文件*/

printf("输入文件路径名和操作类型(0-读文件,1-写文件):");

scanf("%s%d",name,&type);

open_file(name,type); /*打开文件*/

break;

case 3: /*a=3读文件*/

printf("输入文件路径名和读长度");

scanf("%s%d",name,&length);

read_file(name,length); /*读文件*/

break;

case 4: /*a=4写文件*/

printf("输入文件路径名:");

scanf("%s",name);

printf("输入写的内容和和写长度");

scanf("%s%d",buffer,&length);

write_file(name,buffer,length); /*写文件*/

break;

case 5: /*a=5关闭文件*/

printf("输入文件路径名");

scanf("%s",name);

close_file(name); /*关闭文件*/

break;

case 6: /*a=6删除文件*/

printf("输入文件路径名");

scanf("%s",name);

delete(name); /*删除文件*/

break;

case 7: /*a=7建立目录*/

printf("输入目录路径名");

scanf("%s",name);

md(name); /*建立目录*/

break;

case 8: /*a=8显示目录*/

printf("输入目录路径名");

scanf("%s",name);

dir(name); /*显示目录*/

break;

case 9: /*a=9显示文件*/

printf("输入文件路径名");

scanf("%s",name);

typefile(name); /*显示文件*/

break;

case 10:/* a=10改变文件属性*/

printf("输入文件路径名和文件属性(1-只读文件,3-只读系统文件,4-普通文

件):");

scanf("%s%d",name,&attribute);

change(name,attribute);

}/* switch */

}/* while */

}/*main( )结束*/

操作系统-Linux课程实验报告

实验、 Linux Ubuntu的安装、创建新的虚拟机VMWare 实验 Shell编程 1.实验目的与内容 通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。 编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。 2.程序源代码清单 #include<> #include int main(){ printf("Hello Linux\n"); int pid; int state; int pfd[2]; pipe(pfd); if (fork()==0){ printf("In the grep progress\n"); dup2(pfd[0],0); close(pfd[0]); close(pfd[1]); execlp("grep","grep","sh",0); perror("exelp grep error"); } esle if(fork()==0){ printf("In the ps progress\n"); dup2(pfd[1],1); close(pfd[0]); close(pfd[1]); execlp("ps","ps","-ef",0); perror("execlp ps -ef"); }

close(pfd[1]); close(pfd[0]); wait(&state); wait(&state); } 实验内核模块 实验步骤: (1).编写内核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。 (2).编译内核模块Makefile文件 # Makefile under ifneq ($(KERNELRELEASE),) #kbuild syntax. dependency relationshsip of files and target modules are listed here. obj-m := else PWD := $(shell pwd) KVER ?= $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf .*.cmd *.o *. *.ko .tmp_versions *.symvers *.order endif 编译完成之后生成模块文件。 (3).内核模块源代码 #include #include #include #include #include #include #define MODULE #define MODULE_VERSION "" #define MODULE_NAME "clock" struct proc_dir_entry* my_clock; int read_clock(char* page, char** start, off_t off, int count, int* eof, void* data) { int len; struct timeval xtime;

北大操作系统高级课程-陈向群作业-线程调度实习报告

线程调度实习报告

目录 内容一:总体概述 (3) 内容二:任务完成情况 (3) 任务完成列表(Y/N) (3) 具体Exercise的完成情况 (3) 内容三:遇到的困难以及解决方法 (8) 内容四:收获及感想 (9) 内容五:对课程的意见和建议 (9) 内容六:参考文献 (9)

内容一:总体概述 本次lab主要是对线程调度的学习和理解。当计算机系统是多道程序设计系统时,通常就会有多个进程或或线程同时竞争CPU。只要有两个或更多的进程处于就绪态,这种情况就会发生,那么就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法称为调度算法。 进程调度策略的选择对整个系统性能有至关重要的影响,一个好的调度算法应该考虑很多方面:公平、有效、响应时间、周转时间、系统吞吐量等等。但这些因素之间又是相互矛盾的,最终的取舍根据系统要达到的目标而定,同时我们也可以看出多进程的管理是~种非常复杂的并发程序设计.每个进程的状态不仅由其自身决定,而且还要受诸多外在因素的影响.而在此基础上的进程调度,为了保证操作系统的稳定性、提高效率和增加灵活性,还必须采用很多方法,这些都是值得我们去研究和探讨的。 本次实验针对Nachos系统的代码的阅读和修改,了解Nachos系统中线程调度在代码中如何实现,以及在其上扩展线程调度算法,实现基于优先级的抢占式调度算法。 内容二:任务完成情况 任务完成列表(Y/N) Exercise1 Exercise2 Exercise3 完成情况Y Y Y 具体Exercise的完成情况 Exercise1调研 了解Linux或Windows中采用的进程/线程调度算法。 解答:Linux 的调度算法演化伴随着其内核版本的更迭,具有代表性的版本以此为:2.4,2.6,以及最近几年频繁更替的版本:3.5,3.6,3.7,3.8,其中3.8 是最新的稳定版本。下面就其调度机制的演化进行论述。 在 2.4 版本的内核之前,当很多任务都处于活动状态时,调度器有很明显的限制。这是由于调度器是使用一个复杂度为O(n) 的算法实现的。在这种调度器中,调度任务所花费的时间是一个系统中任务个数的函数。换而言之,活动的任务越多,调度任务所花费的时间越长。在任务负载非常重时,处理器会因调度消耗掉大量的时间,用于任务本身的时间就非常少了。因此,这个算法缺乏可伸缩性。在对称多处理系统(SMP)中,2.4 版本之前的调度器对所有的处理器都使用一个运行队列。

Linux操作系统源代码详细分析

linux源代码分析:Linux操作系统源代码详细分析 疯狂代码 https://www.doczj.com/doc/6218617257.html,/ ?:http:/https://www.doczj.com/doc/6218617257.html,/Linux/Article28378.html 内容介绍: Linux 拥有现代操作系统所有功能如真正抢先式多任务处理、支持多用户内存保护虚拟内存支持SMP、UP符合POSIX标准联网、图形用户接口和桌面环境具有快速性、稳定性等特点本书通过分析Linux内核源代码充分揭示了Linux作为操作系统内核是如何完成保证系统正常运行、协调多个并发进程、管理内存等工作现实中能让人自由获取系统源代码并不多通过本书学习将大大有助于读者编写自己新 第部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 /asm-generic/smplock.h 107 /asm-i386/atomic.h 108 /asm- i386/current.h 109 /asm-i386/dma.h 109 /asm-i386/elf.h 113 /asm-i386/hardirq.h 114 /asm- i386/page.h 114 /asm-i386/pgtable.h 115 /asm-i386/ptrace.h 122 /asm-i386/semaphore.h 123 /asm-i386/shmparam.h 124 /asm-i386/sigcontext.h 125 /asm-i386/siginfo.h 125 /asm-i386/signal.h 127 /asm-i386/smp.h 130 /asm-i386/softirq.h 132 /asm-i386/spinlock.h 133 /asm-i386/system.h 137 /asm-i386/uaccess.h 139 //binfmts.h 146 //capability.h 147 /linux/elf.h 150 /linux/elfcore.h 156 /linux/errupt.h 157 /linux/kernel.h 158 /linux/kernel_stat.h 159 /linux/limits.h 160 /linux/mm.h 160 /linux/module.h 164 /linux/msg.h 168 /linux/personality.h 169 /linux/reboot.h 169 /linux/resource.h 170 /linux/sched.h 171 /linux/sem.h 179 /linux/shm.h 180 /linux/signal.h 181 /linux/slab.h 184 /linux/smp.h 184 /linux/smp_lock.h 185 /linux/swap.h 185 /linux/swapctl.h 187 /linux/sysctl.h 188 /linux/tasks.h 194 /linux/time.h 194 /linux/timer.h 195 /linux/times.h 196 /linux/tqueue.h 196 /linux/wait.h 198 init/.c 198 init/version.c 212 ipc/msg.c 213 ipc/sem.c 218 ipc/shm.c 227 ipc/util.c 236 kernel/capability.c 237 kernel/dma.c 240 kernel/exec_do.c 241 kernel/exit.c 242 kernel/fork.c 248 kernel/info.c 255 kernel/itimer.c 255 kernel/kmod.c 257 kernel/module.c 259 kernel/panic.c 270 kernel/prk.c 271 kernel/sched.c 275 kernel/signal.c 295 kernel/softirq.c 307 kernel/sys.c 307 kernel/sysctl.c 318 kernel/time.c 330 mm/memory.c 335 mm/mlock.c 345 mm/mmap.c 348 mm/mprotect.c 358 mm/mremap.c 361 mm/page_alloc.c 363 mm/page_io.c 368 mm/slab.c 372 mm/swap.c 394 mm/swap_state.c 395 mm/swapfile.c 398 mm/vmalloc.c 406 mm/vmscan.c 409

操作系统课程设计报告书

题目1 连续动态内存管理模拟实现 1.1 题目的主要研究内容及预期达到的目标 (1)针对操作系统中内存管理相关理论进行设计,编写程序并进行测试,该程序管理一块虚拟内存。重点分析三种连续动态内存分配算法,即首次适应算法、循环首次适应算法和最佳适应算法。 (2)实现内存分配和回收功能。 1.2 题目研究的工作基础或实验条件 (1)硬件环境:PC机 (2)软件环境:Windows XP,Visual C++ 6.0 1.3 设计思想 首次适应算法的实现:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高址空间保留大的空闲区。 循环首次适应算法的实现:在分配内存空间时,不再每次从表头开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。 最佳适应算法的实现:从全部空闲区中找到能满足作业要求的、且最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表中的空闲分区要按从小到大进行排序,从表头开始查找第一个满足要求的自由分配。 1.4 流程图 内存分配流程图,如图1-1所示。

图1-1 内存分配流程图内存回收流程图,如1-2所示。

图1-2 内存回收流程图 1.5 主要程序代码 (1)分配内存 void allocate(char z,float l) { int i,k; float ad; k=-1; for(i=0;i= l && free_table[i].flag == 1) if(k==-1 || free_table[i].length

计算机操作系统实验课实验报告

实验报告 实验课程: 计算机操作系统学生姓名:XXX 学号:XXXX 专业班级:软件 2014年12月25日

目录 实验一熟悉Windows XP中的进程和线程.. 3实验二进程调度 (7) 实验三死锁避免—银行家算法的实现 (18) 实验四存储管理 (24)

实验一熟悉Windows XP中的进程和线程 一、实验名称 熟悉Windows XP中的进程和线程 二、实验目的 1、熟悉Windows中任务管理器的使用。 2、通过任务管理器识别操作系统中的进程和线程的相关信息。 3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。 三、实验结果分析 1、启动操作系统自带的任务管理器: 方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。

2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并 完成下表: 表一:统计进程的各项主要信息 3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。再

从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是任务管理器无法结束进程, 原因是该系统是系统进程。 4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所 有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论explorer.exe是管理桌面图标的文件(说出explorer.exe进程的作用)。 5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进 程“explorer.exe”的各项信息,并填写下表: 进程:explorer.exe 中的各个线程

计算机管理实习报告

计算机管理实习报告 新疆农业大学实习报告实习课程名称:毕业实习学院:计算机与信息工程学院专业、班级:信息管理与信息系统024指导教师:张胜光报告人:柳新年学号:024631432时间:XX年4月22日实习主要内容:因为时间的原因,和工商联没有计算机中心,因此我没能介入到网络管理的每一个方面,重点完成了针对计算机维护、网络安全的实习。现将我在工商联实习的心得总结如下:一、计算机维护计算机维护分为硬件维护和软件维护两个方面。工商联的计算机现状大概是总共有用于办公的计算机20余台,大部分是方正奔腾4的品牌机,还有一些联想的品牌机,以及少量打印机。

1、对硬件的维护主要集中在上一代未更新的计算机,因为使用年限比较久,硬件老化及磨损相对比较严重。在使用现在部分大型软件的时候经常出现死机,蓝屏,自动重启等现象。一般常见的引起硬件故障的主要原因有很多种,例如:各个配件间的兼容性不好;有些硬件的质量不过关等。但一般常见的硬件故障主要由以下几个方面引起。首先,电源电压不稳定或经常断电引起的故障。微机所使用的电源的电压不稳定,那么硬盘在读写文件时就会出现丢失或被损坏的现象。如果经常会发生不正常的断电现象导致微机重启,或是经常在计算机运行程序时进行冷启动,将会使系统受到破坏。为使微机更安全地工作,最好使用电源稳压器或不间断电源。其次,部件之间接触不良引起的故障。接触不良主要反映在各种卡类与主板的接触不良或电源线数据线音频线的连接不良。其中,各种接口卡内存条与主板接触不良最为常见。例如:显卡与主板接

触不良可能会使显示器不显示,内存条与主板接触不良可能使微机不工作等,通常只要更换相应的插槽或用橡皮轻轻擦一擦接口卡或内存条的金手指,即可排除故障。2、软件维护方面,在新近配置的一批方正计算机中因为随商家发货过来的时候,已经装好了操作系统还附带安装了瑞星杀毒软件,但是因为他们安装的操作系统WindowsXP没有打上SP2补丁,而且安装的瑞星杀毒软件也是XX年版的,再加上所有的办公计算机都是挂在网络上的,这样就使得计算机对病毒和入侵的抵御能力很差,但同时又面临开放网络的大量病毒和入侵,造成该批计算机大面积中毒。给我们带来了巨大的工作量,在这次病毒感染中,计算机感染的集中表现为:震荡波和一种叫的病毒。我们开始更新瑞星杀毒软件,能找到内存中的病毒并清除,但是这并不能从根本上解决问题。因为病毒是利用操作系统本身存在的漏洞进行攻击的,如果不把漏洞堵上,还是会被感

操作系统课程设计报告

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告 学院:计算机学院 专业班级: 13软件工程1班 提交时间: 2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。

二、环境条件 系统: WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景 计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。

(4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下:钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

操作系统实习报告样本

操作系统实习报告样本 1 操作系统实习报告内容(1) 基本信息:完成人姓名、学号、报告日期 (2) 实习内容(3) 实习目的(4) 实习题目(5) 设计思路和流程图(6) 主要数据结构及其说明(7) 源程序并附上注释(8) 程序运行时的初值和运行结果(9) 实习体会:实习中遇到的问题及解决过程、实习中产生的错误及原因分析、实习的体会及收获、对搞好今后实习提出建设性建议等。实习报告可以书面或电子文档形式提交。 2操作系统实习报告样本样本1一、实习内容模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。二、实习目的在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实习理解在分页式存储管理中怎样实现虚拟存储器。三、实习题目本实习有三个小题。第一题:模拟分页式存储管理中硬件的地址转换和产生缺页中断。[设计思路、数据结构、流程图]:(1) 分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式为:页号标志主存块号在磁盘上的位置其中,标志——用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标志位=0,则表示该页尚未装入主存。主存块号——用来表示已经装入主存的页所占的块号。在磁盘上的位置——用来指出作业副本的每一页被存放在磁盘上的位置。(2) 作业执行时,指令中的逻辑地址指出参加运算的操作数存放的地址,该地址被解释为页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式:绝对地址=块号′块长+单元号计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。按计算出的绝对地址可以取到操作数,完成一条指令的执行。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,由操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。(3) 设计一个“地址转换”程序来模拟硬件的地址转换

Linux操作系统源代码详细分析报告

Linux操作系统源代码详细分析 容简介: Linux 拥有现代操作系统所有的功能,如真正的抢先式多任务处理、支持多用户,存保护,虚拟存,支持SMP、UP,符合POSIX标准,联网、图形用户接口和桌面环境。具有快速性、稳定性等特点。本书通过分析Linux的核源代码,充分揭示了Linux作为操作系统的核是如何完成保证系统正常运行、协调多个并发进程、管理存等工作的。现实中,能让人自由获取的系统源代码并不多,通过本书的学习,将大大有助于读者编写自己的新程序。 第一部分 Linux 核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 include/asm-generic/smplock.h 107 include/asm-i386/atomic.h 108 include/asm-i386/current.h 109 include/asm-i386/dma.h 109 include/asm-i386/elf.h 113 include/asm-i386/hardirq.h 114 include/asm-i386/page.h 114 include/asm-i386/pgtable.h 115 include/asm-i386/ptrace.h 122 include/asm-i386/semaphore.h 123 include/asm-i386/shmparam.h 124 include/asm-i386/sigcontext.h 125 include/asm-i386/siginfo.h 125 include/asm-i386/signal.h 127 include/asm-i386/smp.h 130 include/asm-i386/softirq.h 132 include/asm-i386/spinlock.h 133 include/asm-i386/system.h 137 include/asm-i386/uaccess.h 139

操作系统课程设计报告

上海电力学院 计算机操作系统原理 课程设计报告 题目名称:编写程序模拟虚拟存储器管理 姓名:杜志豪.学号: 班级: 2012053班 . 同组姓名:孙嘉轶 课程设计时间:—— 评语: 成绩: 目录 一、设计内容及要求 (4) 1. 1 设计题目 (4) 1.2 使用算法分析: (4)

1. FIFO算法(先进先出淘汰算法) (4) 1. LRU算法(最久未使用淘汰算法) (5) 1. OPT算法(最佳淘汰算法) (5) 分工情况 (5) 二、详细设计 (6) 原理概述 (6) 主要数据结构(主要代码) (6) 算法流程图 (9) 主流程图 (9) Optimal算法流程图 (10) FIFO算法流程图 (10) LRU算法流程图 (11) .1源程序文件名 (11) . 2执行文件名 (11) 三、实验结果与分析 (11) Optimal页面置换算法结果与分析 (11) FIFO页面置换算法结果与分析 (16) LRU页面置换算法结果与分析 (20) 四、设计创新点 (24) 五、设计与总结 (27)

六、代码附录 (27) 课程设计题目 一、设计内容及要求 编写程序模拟虚拟存储器管理。假设以M页的进程分配了N

块内存(N

视频监控系统实习报告范本

. 安全防技术 视频监控系统工程技术实训报告 班级: : 课程名称:安全防技术 实训项目:视频监控系统工程综合实训 指导老师: 提交日期:2016年8月日

概要 视频监控是指以维护社会公共安全为目的,而采取的防入侵、防盗、防破坏和安全检查措施。视频监控设计是完成一个视频监控系统工程项目的第一步,也是非常关键的一布。 本次校园视频监控从校园建筑安全防系统工程的设计实际出发,依据用户任务书和国家的有关规与标准,建立一个以视频监控安全防系统。以人防与物防、技防相结合,达到防入侵、防盗、防破坏等系统进行联合设计,组成一个综合的、多功能的安全防系统是社会建设发展的需要也是校园安稳和平的需要。 校园视频监控系统的工程设计根据使用要求、现场情况、工程规模、系统造价以及校园的特殊需要等来综合考虑,达到最佳效果。 系统组成:本次实训的系统主要由前端设备、线路设备和终端设备组成。由于现在楼宇自动化的程度越来越高,作为其中一个重要组成部分的视频监控系统也得到了相当的发展,所以视频监控是发展前景很大的项目。

目录 前言....................................... .. (4) 第一章系统介绍 ............................. . (5) 第二章设计思路.............................. ... . (6) 第三章主要设备介绍 (8) 第四章主要设备(摄像机、硬盘录像机工作原理) (10) 4.1前端系统设备.................................. .. (10) 4.2视频监控前端现场设备安装要求................... . (15) 4.3终端视频图像监控子系统................... . (15) 第五章视频监控的简介................... . (19) 第六章实验步骤 (27) 第七章海康网络设备搜索软件的使用步骤 (28) 第八章海康网络设备客户端4200软件使用步骤 (33) 结论 (43) 致 (44) 参考文献 (45)

操作系统课程设计银行系统源代码

##include #include #include using namespace std; #define Seat 10 #define Time 500 //顾客来的最大间隔时间 int number = 0; //当前服务的顾客总数 int PrivateNum=0,PublicNum=0,FinancialNum=0; //取号数 int seat_num=10; HANDLE seat,SemaphorePrviate,SemaphorePublic,SemaphoreFinancial;//窗口信号量HANDLE cSemaphorePrviate,cSemaphorePublic,cSemaphoreFinancial; //顾客信号量HANDLE mutex; CRITICAL_SECTION c_seat; //临界区,用来限制同一时刻只能有一个线程来改变座位的数量CRITICAL_SECTION print; //临界区,用来限制同一时刻只能有一个线程来访问资源,防止输出重叠 //对私叫号 DWORD WINAPI PrivateServiceThread(PVOID s1pv) { while(true) { srand((unsigned)time(NULL)); WaitForSingleObject(cSemaphorePrviate,INFINITE); Sleep(1500); EnterCriticalSection(&print); cout<<"对私窗口叫号!"<

操作系统课程设计报告

东莞理工学院 操作系统课程设计报告学院:计算机学院 专业班级:13软件工程1班 提交时间:2015/9/14 指导教师评阅意见: . 项目名称:进程与线程管理功能 一、设计目的 用语言来模拟进程和线程管理系统,加深对进程和线程的理解,掌握对进程和线程各种状态和管理的算法原理。 二、环境条件 系统:WindowsXP、VMWare、Ubuntu Linux 语言:C/C++ 开发工具:gcc/g++、Visual C++ 6.0 三、设计内容 1. 项目背景

计算机的硬件资源有限,为了提高内存的利用率和系统的吞吐量,就要根据某种算法来管理进程和线程的状态从而达到目的。 进程与线程管理功能完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 进程与线程管理功能 基本要求:完成基于优先级的抢占式线程调度功能,完成进程虚拟内存管理功能。 提高要求:(增加1项就予以加分) (1) 实现多种线程调度算法; (2)通过“公共信箱”进行通信的机制,规定每一封信的大小为128字节,实现两个用户进程之间通过这个“公共信箱”进行通信。 (3) 实现多用户进程并发的虚拟内存管理功能。 (4) 实现用户进程间通信功能,并用生产者/消费者问题测试进程间通信功能的正确性。 (5) 实现改进型Clock页面置换算法。 (6) 实现Cache功能,采用FIFO替换算法。 2. 扩展内容 实现多种线程调度算法:时间片轮转调度算法 四、人员分工 优先级调度算法:钟德新,莫友芝 时间片轮转调度算法:张德华,袁马龙 设计报告由小组队员共同完成。小组成员设计的代码分工如下: 钟德新编写的代码:void Prinft(){ PCB *p; system("cls");//清屏 p=run; //运行队列 if(p!=NULL) { p->next=NULL; } cout<<"当前正在运行的进程:"<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<procname<<"\t\t"<pri<<"\t"<needOftime<<"\t\t"<runtime<<"\t\t"<state<next; } cout<

操作系统课程设计实验报告

河北大学工商学院 课程设计 题目:操作系统课程设计 学部信息学部 学科门类电气信息 专业计算机 学号2011482370 姓名耿雪涛 指导教师朱亮 2013 年6月19日

主要内容 一、设计目的 通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 二、设计思想 实现一个模拟操作系统,使用VB、VC、CB等windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 设计模板如下图: 注:本人主要涉及设备管理模块

三、设计要求 设备管理主要包括设备的分配和回收。 ⑴模拟系统中有A、B、C三种独占型设备,A设备1个,B设备2个,C设备2个。 ⑵采用死锁的预防方法来处理申请独占设备可能造成的死锁。 ⑶屏幕显示 注:屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 设备管理模块详细设计 一、设备管理的任务 I/O设备是按照用户的请求,控制设备的各种操作,用于完成I/O 设备与内存之间的数据交换(包括设备的分配与回收,设备的驱动管理等),最终完成用户的I/O请求,并且I/O设备为用户提供了使用外部设备的接口,可以满足用户的需求。 二、设备管理函数的详细描述 1、检查设备是否可用(主要代码) public bool JudgeDevice(DeviceType type) { bool str = false; switch (type) { case DeviceType.a: {

Linux操作系统实习报告

桂林理工大学·信息科学与工程学院Linux操作系统报告 学院:信息科学与工程学院 班级:计算机2010-1 指导:王爱学 学号:3100717102 姓名:周杰 日期:2013年12月25日

【摘要】 Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux 内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 Linux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。 【操作】 1.ls -l -a -F的区别 从图中可以看出,-a,-l,-F的特点: 单纯的ls命令不能显示隐藏文件,需要-a才能显示文件名以.开头的隐藏文件和文件夹 ls -l则可以以长格式显示文件信息 ls -F则是:在列出的文件目录名称后加一符号例如可执行文件加"*", 目录则加"/"

2. cd 命令 cd 这个命令是用来进出目录的它的使用方法和在dos下没什么两样,但和dos不同的是Linux 的目录对大小写是敏感的,如果大小写拼写有误,你的cd操作是成功不了的,另外cd 如果直接输入cd 后面不加任何东西会回到使用者自己的Home,目录假设如果是root,那就是回到/root,这个功能同cd ~是一样的 3. mkdir rmdir mkdir 命令用来建立新的目录如输入如下命令 mkdir zj 将在当前目录下新建一个zj 目录 rmdir 用来删除已建立的目录如输入如下命令 rmdir zj 将删除已存在的空目录zj 4. cp

计算机操作系统概论名词解释

第1部分操作系统概论名词解释 脱机输入/输出 具体的输入/输出不需要在主计算机上进行的方式也称“脱机输入/输出” 批处理 作业是由操作系统成批地进行处理,操作系统能自动地从输入池读入下一个作业,并予以运行和输出,如此直到整批作业全部处理完毕。 SPOOLING 由操作系统将磁盘模拟为输入/输出设备的处理方式称为SPOOLING(Simultaneous Periph eral Operating On Line),即“并行的外部设备操作联机”,也称“假脱机”。SPOOLING系统是以磁盘为几乎无限巨大的缓冲区来解决低速的I/O设备与高速的CPU之间的速度匹配问题。 分时系统 为了降低交互式系统的等待时间和运行时间的比率,系统通过多台终端同时向很多用户提供运行环境,这种分时系统就能以合理的成本向用户提供交互式使用计算机的方便。 多路性 一台主机可连接多台终端,多个终端用户可以同时使用计算机,共享系统的硬软件资源。 交互性 用户能与系统进行对话。在一个多步骤作业的运行过程中,用户能通过键盘等设备输入数据或命令,系统获得用户的输入后做出响应,显示执行的状况或结果。 实时操作系统 是一种能在限定的时间内对输入进行快速处理并做出响应的计算机处理系统 多处理机系统 一个计算机系统中可具有多个CPU或处理机。一般用微处理器构成阵列系统,其运算速度可以达到上万亿次, 分布式操作系统 分布式系统是一种多计算机系统,这些计算机可以处于不同的地理位置和拥有不同的软硬件资源,并用通信线路连接起来,具有独立执行任务的能力。分布式系统具有一个统一的操作系统,它可以把一个大任务划分成很多可以并行执行的子任务,并按一定的调度策略将它们动态地分配给各个计算机执行,并控制管理各个计算机的资源分配、运行及计算机之间的通信,以协调任务的并行执行。以上所有的管理工作对用户都是透明的。 网络操作系统 计算机网络是指用数据通信系统把分散在不同地方的计算机群和各种计算机设备连接起来的集合,它主要用于数据通信和资源共享,特别是软件和信息共享。

相关主题
文本预览
相关文档 最新文档