《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(81页珍藏版)》请在优知文库上搜索。
1、课程实验报告课程名称:操作系统原理课程设计专业班级:学号:姓名指导教师:报告日期:计算机科学与技术学院目录1 .实验目的22 .实验环境23,实验内容23.1 实验一23.2 实验二23.3 实验三23.4 实验四34.实验设计34.1 实验一34.1.1 文件拷贝34.1.2 并发进程分窗口显示34.2 实验二444.3 实验三44.4 实验四55,实验步骤51.1 实验一51.1.1 文件拷贝51.1.2 并发进程分窗口显示71.2 实验二111.3 实验三121.4 实验四136 .调试记录147 .心得体会168 .程序清单178.1 实验一178.1.1 文件拷贝178.1.2 并发
2、进程窗口显示188.2 实验二278.3 实验三298.4 实验四32L实验目的1掌握LinUX操作系统的使用方法;2了解LinUX系统内核代码结构;3掌握实例操作系统的实现方法。2,实验环境本次课程设计采用的操作系统环境是Widows7sUbutu双系统,Ubuntu系统版本为15.04,内核版本是Linux3.19o3 .实验内容3.1 实验一1)编写一个C程序,用fread、fwrite等库函数实现文件拷贝功能。2)编写一个C程序,使用基于文本的终端图形编程库(CUrSeS)或图形界面(QT/GTK,分窗口显示三个并发进程的运行(一个窗口实时显示当前时间,一个窗口实时监测CPU的利用率,
3、一个窗口做1到100的累加求和,刷新周期分别为1秒,2秒和3秒)。3.2 实验二采用编译内核的方法,添加一个新的系统调用实现文件拷贝功能编写一个应用程序,测试新加的系统调用3.3 实验三采用模块方法,添加一个新的字符设备的驱动程序,实现翻开/关闭、读/写等根本操作,编写一个应用程序,测试添加的驱动程序。3.4 实验四1)7解/proc文件的特点和使用方法。2)监控系统状态,显示系统部件的使用情况。3)用图形界面监控系统状态,包括CPU和内存利用率、所有进程信息等(可自己补充、添加其他功能)。4 .实验设计4.1 实验一4.1.1 文件拷贝实现文件拷贝功能需要使用的函数是fopen、fgetc、
4、fputc,由命令行参数获取2个文件名,根据其文件名和路径分别翻开该2个文件,设置循环,使用fgetc和fputc函数每次从源文件复制1个字节到目的文件,直到源文件指针到文件尾,实现文件拷贝操作。4.1.2 并发进程分窗口显示使用图形界面GTK实现窗口的显示,使用fork创立三个并发进程:pid=fork():创立子进程。返回值:0从子进程返回0从父进程返回exit进程自我终止,进入僵死状态wait()等待进程终止(由父进程调用)exec()执行一个可执行程序(文件)。4.2 实验二不同的Linux内核版本编译内核和添加系统调用的方法不尽相同,在网上查阅了资料之后找到适合3.19版本内核的编译
5、方法。所谓系统调用,即LinUX内核中设置了一组用于实现各种系统功能的子程序,称为系统调用,用户可以通过系统调用命令在自己的应用程序中调用它们。其调用机制为:使用存放器中适当的值跳转到内核中事先定义好的代码中执行:跳转到系统调用的总入口system_call,检查系统调用号,再查找系统调用表sys_call_table,调用内核函数,最后返回。实验二目的是更改内核中系统调用模块,增加自定义函数实现文件拷贝功能。实验三1.inUX设备驱动程序是一组常驻内存的具有特权的共享库,是低级硬件处理例程,每个设备文件有两个设备号,主设备号标识驱动程序,从设备号表示使用同一个设备驱动程序的不同硬件设备。设备
6、驱动程序的功能包括:对设备初始化和释放,把数据从内核传送到硬件和从硬件读取数据,读取应用程序传给设备文件的数据和回送应用程序请求的数据,检测和处理设备出现的错误。1.irlUX支持的设备包括三种:字符设备、块设备和网络设备。添加设备驱动程序大致需要以下几个步骤:1.注册设备2 .定义功能函数3 .卸载设备4.4实验四proc文件系统特点:1 .进程文件系统和内核文件系统组成的复合体2 .将内核数据对象化为文件形式进行存取的一种内存文件系统3 .监控内核的一种用户接口,拥有一些特殊的纯文本文件,从中可以获取系统状态信息4 .系统信息:与进程无关,随系统配置的不同而不同5 .进程信息:系统中正在运
7、行的每一个用户级进程的信息其中各个文件保存的信息如下:proccmdlie:内核启动的命令行proccpuinfo:CPU信息procstat:CPU的使用情况、磁盘、页面、交换、所有的中断、最后一次的启动时间等procmeminfo:内存状态的有关信息利用/proc文件获取系统状态信息,并通过GTK图形化编程将系统信息以及通过这些信息计算得出的如CPU利用率、内存使用等通过窗口显示出来。5.实验步骤5.1 实验一5.1.1 文件拷贝文件拷贝主要是利用文件指针操作,在源文件和目的文件之间进行字符的复制,拷贝之前要判断源文件是否存在以及能否翻开,这需要设置一个判断语句,同时也要设置判断语句判断目
8、的文件是否存在,假设不存在需要能够创立一个目的文件,最后执行循环拷贝。步骤如下:1 .在Linux终端使用编译命令:gccmycopy.c-omycopy产生可执行文件。2 .创立源文件wagzihao目的文件Shaochongjun03 .编辑源文件:声打开,保存1.wangzihao.txtcopytheword.4 .翻开可执行程序:./mycopywagzihaoShaochongjun5 .查看目的文件发现已经实现拷贝:wangzihao.txtXQshaochongjun.txtcopytheword.6 .假设源文件不存在会报错:WangzthaoQwangzihao-Lenov
9、o-G40s:-$.mycopywangzihao.ttshaochongjun.txtFailtoopensourcefile!if(fsource=fopeniargvl,rb)=NULL)(printf(FailZoopensourcefile!n);returnO;)if(ftarget=fopen(argv2,wb)=NULL)(printf(Failtoopentargetfile!n);returnO;)5.1.2并发进程分窗口显示1.使用forkO函数创立三个进程,使用exec函数族实现程序的调用:intmain.)3pid_ttime;pid_tcpu;pid_tgu三;if
10、(time=fork()-l)3(printf(forkerrorn);return-1;if(ti三e0)3execlp(./time”,0);else3if(cpu=fork()三-l)/createcpu3printf(forkerrorn);return-1;if(cpu=三0)3execlp(./cpu,0);-else3(if(sum=fork()=三-l)/create3(printf(forkerrorn);return-1;-if(三um=0)3execlp(m.三u三i,0);ele/fatherprocess3wait(Stisie);wait(&cpu);WaiC(su
11、m);2 .调用创立窗口函数init_window(),将进程中的信息在窗口中显ZF.ntmain(intargc,char*argv)3pthread_tid;int士,ret;ret=pthread_create(4id,NULL,(void*)thread,NULL);GtkWidget*vbox;定义一标装盒;GckWidget*window;/%初始化整个GTK+程序,是每一个GTK+程序必不可少的部分+/gtk_init(iAgc,&argv);/,这里生成了一个窗口构彳牛一GtkWindow.GTK_W工NDOW/OPLEVZL包含窗口window=gtk_window_new(
12、GTK_WINDOW_TOPLEVZL?;gtk_window_set_title(GTK_WINDOW:window)rtime);gtk_window_set_default_size(GTK_WINDOW(window),300r200);gtk_window_set_position(GTK_WINDOW,window),GTK_WIN_POS_CZNTZR);label=gtk_label_new(t);gtk_container_add(GTK-CONTAIN三R(window),label);gtk_widget_show(label);*并始显示0gtk_widget_show
13、(window);gtk_main();return0;)3 .分别创立三个程序实现显示系统时间、CPU利用率、累加求和功能:chart50;GtkWidgec*label;Igettime()time-tcimep;time(Ximep);sprintf(t,%s,crimeIGtimeP);Ivoid*thread(void*argc)whilei1)getcime();gtk_label_set_text(GTK_LABSL:1abe1),t);slelp(l);?floatcpu()(FILS*fp;charbuf128;charcpu5;longintuser,nice,sys,id
14、le,iowairirqrsoftirq;longintalllrall2ridlelridle2;floatusage;fp=fopenproc三tat,rrw);ICfp=NULL)Princf(errorn,);fgeta:buf,sizeofbuf),fp);sscanf(buf,%s%ld%ld%ld%ld%ld%ld%ld,cpu,&user,finicer&sys,&idle,6iowaitrHrq,6aoftirq);alll=user+nice+sys+idle+iowait+irq+softirq;idlel=idle;rewind(fp);/secondsleep(l);memsetbufr0,sizeofibuf);cpu0三,0,;usr=nice=sys=idle=iowait=irq=softirq=0;fgets(buf,sizeof(buf),fp);sscanf(buf,%s%ld%ld%ld%ld%ld%ld%ld,cpuf(user,(nice,6sys,&idle,iowaix,&irq,Oftirq);all2=user+nice+三ys+