当前位置:文档之家› 西南交大操作系统实验总报告

西南交大操作系统实验总报告

.操作系统实验报告指导教师:胡晓鹏.实验报告一实验名称: Linux 操作系统下的C语言编程实验目的: 1.认识 Linux 系统,熟悉Linux 操作系统的基本操作;2.了解 vi 命令的基本用法,能够使用vi 命令对文件进行基础的操作与编辑;3.能够在 Linux 环境下编写 C语言程序,生成 .out 文件,并成功执行;4.体会 Linux 环境下编程与Windows 环境下编程的异同,加深对Linux 操作系统的理解。

实验内容:熟悉 Linux 环境,编写简单 C 语言程序。

实验结果:.实验结论:在 Linux 操作系统下的编程环境不同于Windows ,编译器进行命令编译。

操作环境简洁,大多以键盘操作。

实验报告二实验名称:基于进程与线程的并发实验目的:1.了解进程与线程工作原理,掌握并发机制,学会编写简单的并发程序。

2.充分理解并掌握基于进程与线程的并发。

实验内容:在 Linux 环境进行基于进程与线程编写实验程序。

试验核心代码:int main(){ pthread_t tid[N];pid_t pid;pid=fork();if(pid<0){ printf("fail to fork\n");exit(1);}else if(pid==0){ printf("the child process:\n");}else{sleep(10);printf("the parent process:\n");}void *res;int err[3];err[0]=pthread_create(&tid[0],NULL,fn1,NULL);err[1]=pthread_create(&tid[1],NULL,fn2,NULL);err[2]=pthread_create(&tid[2],NULL,fn3,NULL);int i;for(i=0;i<N;i++){if(err[i]= pthread_join(tid[i],&res)!=0) { printf("cannot join the thread %d\n",i);exit(1);}}return 0;}void *fn1(void *arg){printf("the first thread is done\n");return (void *)1;}void *fn2(void *arg){printf("the second thread is done\n"); //sleep(1);return (void *)1;}void *fn3(void *arg){printf("the third thread is done\n");//sleep(2); return(void *)1;}实验结果:实验结论:进程与线程之间的关系为线程离不开进程,线程在多任务系统的作用使计算机高校工作,同时下创建进程是应尽量避免进程的出现。

掌握线程pthread_join()中的阻塞原理。

实验报告三实验题目:进程间的通信实验目的:学习在 linux环境进程间的信息传递和接收,理解进程间的信号通信,并能编写简单代码实现进程间的通信。

实验代码:#include <stdio.h>#include <signal.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>static int alarm_fired=0;void ouch(int sig){ alarm_fired=1;}int main(){ pid_t pid;pid=fork();if(pid==-1){ printf("fork failed\n");exit(1);}else if(pid==0){ kill(getpid(),SIGALRM); exit(0);}signal(SIGALRM,ouch);alarm(5);pause();.if(alarm_fired==1)printf("receive a signal %d\n",SIGALRM);exit(0);}实验结果 :实验结论:进程能进行信息通信,如果进程间有必要,能够实现很好的进程异步处理。

实验报告四实验题目:进程间的通信 - 共享内存实验目的:理解进程间共享内存机制,学会分析共享内存之间的通信方式并进行内存共享实践,编写简单程序实现内存简单共享。

实验代码 :核心代码:/**************************************************************///定义数据结构体struct shared_use_st{int written_by_you;char some_text[TEXT_SZ];};/* 写入 *********************************************************//* 创建共享内存 */shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);if(shmid==-1){fprintf(stderr,"shmget failed\n");exit(EXIT_FAILURE);}/* 映射共享内存*/shared_memory=shmat(shmid,(void *)0,0);if(shared_memory==(void *)-1){fprintf(stderr,"shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n",(int)shared_memory);/* 让结构体指针指向这块共享内存*/shared_stuff=(struct shared_use_st *)shared_memory;/* 循环的向共享内存中写数据,直到写入的为“ end为”止*/while(running){while(shared_stuff->written_by_you==1){sleep(1);// 等到读进程读完之后再写printf("waiting for client...\n");}printf("ener some text:");fgets(buffer,BUFSIZ,stdin);strncpy(shared_stuff->some_text,buffer,TEXT_SZ);shared_stuff->written_by_you=1;if(strncmp(buffer,"end",3)==0){running=0; // 结束循环}}/* 读取 ***********************************************************************//* 创建共享内存 */shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);if(shmid==-1){fprintf(stderr,"shmget failed\n");exit(EXIT_FAILURE);./* 映射共享内存*/shared_memory=shmat(shmid,(void *)0,0);if(shared_memory==(void *)-1){fprintf(stderr,"shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n",(int)shared_memory);/* 让结构体指针指向这块共享内存*/shared_stuff=(struct shared_use_st *)shared_memory;/* 控制读写顺序*/shared_stuff->written_by_you=0;/* 循环的从共享内存中读数据,直到读到“ end为”止*/while(running){if(shared_stuff->written_by_you){printf("You wrote:%s",shared_stuff->some_text);sleep(1); //读进程睡一秒,同时会导致写进程睡一秒,这样做到读了之后再写shared_stuff->written_by_you=0;if(strncmp(shared_stuff->some_text,"end",3)==0){running=0; // 结束循环}}}实验结果:实验结论:内存共享中应该含有安全防护机制,内存在共享的同时应该做到内存的保护,共享内存段是更应该做到安全高效共享。

应当加强训练共享内存段申请原则,多多学习管道运输的实现。

实验报告五实验题目:虚拟内存实验目的:模拟替换算法技术,编程实现 LRU和 CLOCK算法,掌握替换算法技术,完全实现替换策略。

实验主要函数:void lru_p(int n,int m,int proc[]);void clock_p(int n,int m,int proc[]);实验代码 :#include <stdio.h>#include <time.h>// 准备用时钟函数调用库函数#include <iostream>using namespace std;void lru_p(int n,int m,int proc[]){cout<<"------------------------------------------"<<endl;cout<<" 这是 least recently used:"<<endl;struct page{int time;int pro;};struct page *p=(struct page*)malloc(n*sizeof(page));int i = 0;int flag = 0;//记录是否满页int exit;//初始化时间for(int j=0;j<n;j++){p[j].time=0;}while(i<m){// 初始化进程不占用页exit=0;for(j = 0;j <flag;j++){p[j].time++;if(p[j].pro == proc[i]) // 处理相同如何情况下的相同进程{exit=1;p[j].time=1;}}if(exit==0&&(flag<n))// 没有相同进程且不缺页{ p[flag].pro=proc[i];p[flag].time=1;flag++;}elseif(exit==0)//处理缺页没有相同进程但缺页{int key=0;int maxtime=p[0].time;for(j=1;j<n;j++)if(maxtime<p[j].time){maxtime=p[j].time; key=j;}p[key].pro=proc[i];p[key].time=1;}//输出for(j=0;j<flag;j++){printf(" %d",p[j].pro);}cout<<endl;i++;}}void clock_p(int n,int m,int proc[]){cout<<"------------------------------------------"<<endl;cout<<" 这是 clock:"<<endl;struct page{int flag;int pro;};struct page *p=(struct page*)malloc(m*sizeof(page)); ..//初始化队列for(int k=0;k<n;k++)p[k].flag=0;int i=0;int next;int j=0;//标记初始位置int mart=0;while(i<m){next=1;while(next){for(k=0;k<mart;k++){if(p[k].pro==proc[i]){next=0;}}if(next){if(!p[j].flag){p[j].pro=proc[i];p[j].flag=1;next=0;if(mart<n)mart++;}else{p[j].flag=0;next=1;if(mart<n)mart++;}j++;j=j%n;}}//输出i++;for(k=0;k<mart;k++)printf(" %d",p[k].pro);cout<<endl;}}void main(){int pages;cout <<" 输入页面数: ";cin>>pages;cout<<" 输入你的进程个数:";int m;cin>>m;cout<<" 输入你的进程ID:";int *proc=new int[m];for(int i=0;i<m;i++)cin>>proc[i];lru_p(pages,m,proc);clock_p(pages,m,proc);}实验结果:实验结论:替换策略是计算机高效工作,充分利用资源,而不同的替换算法都有自己的利弊,不同的场景应充分权衡利弊进行选择。

相关主题