南邮操作系统实验报告
南邮操作系统实验三
南邮操作系统实验三实验报告( 2014/ 2015 学年第一学期)课程名称操作系统教程实验名称页面调度算法的模拟实现实验时间2014 年12 月 3 日指导单位计算机软件学院指导教师徐鹤学生姓名楚灵翔班级学号B12040731 学院(系) 计算机学院专业软件工程实验报告实验名称页面调度算法的模拟实现指导教师徐鹤实验类型上机实验学时 2 实验时间2014.12.3一、实验目的和要求1、模拟实现页面调度算法中的FIFO、LRU和OPT算法2、进程的页面请求序列,即一系列页面号(页面号用整数表示,用空格作为分隔符),用来模拟待换入的页面;3、输出要求:显示缺页的总次数和缺页中断率二、实验环境(实验设备)VMware Workstation,Ubuntu三、实验过程描述#define n 12#define m 3int page[n]; //保存需要访问的页面int i,j,q,mem[m]={0},List[m][n],sum;char flag,f[n];void Init();void FIFO();void LRU();void main(){cout<<"*********************实验***********************"<<endl;< bdsfid="127" p=""></endl;<> cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;< bdsfid="129" p=""></endl;<>cout<<" ┃页面调度算法的模拟实现┃"<<endl;< bdsfid="131" p=""></endl;<>cout<<" ┠───────────────────────┨"<<endl;< bdsfid="133" p=""></endl;<>cout<<" ┃先进先出算法FIFO ┃"<<endl;< bdsfid="135" p=""></endl;<>cout<<" ┃最近追少使用算法LRU ┃"<<endl;< bdsfid="137" p=""></endl;<>cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;< bdsfid="139" p=""></endl;<>cout<<" 请输入页面访问序列:\n"<<" ";for(i=0;i<n;i++)< bdsfid="142" p=""></n;i++)<>cin>>page[i];cout<<endl;< bdsfid="145" p=""></endl;<>FIFO();Init();LRU();}void Init() //初始化函数{sum=0; //初始化计算缺页次数的变量for(int i=0;i<m;i++)< bdsfid="153" p=""></m;i++)<>mem[i]=0;for(i=0;i<m;i++)< bdsfid="156" p=""></m;i++)<>for(j=0;j<n;j++)< bdsfid="158" p=""></n;j++)<>List[i][j]=0;}void FIFO(){for(i=0;i<="">{q=0;while((page[i]!=mem[q])&&(q!=m))q++;if(q==m)flag='*'; //缺页,则置标志flag为'*' elseflag=' ';if(flag=='*'){for(j=m-1;j>0;j--) //淘汰最先调入的页面调入当前访问的mem[j]=mem[j-1];mem[0]=page[i];}for(j=0;j<m;j++)< bdsfid="178" p=""></m;j++)<>List[j][i]=mem[j];f[i]=flag;}cout<<" 0代表为空,*代表有缺页:\n";cout<<endl;< bdsfid="184" p=""></endl;<>cout<<"-----------FIFO算法结果------------"<<endl;< bdsfid="186" p=""></endl;<>for(i=0;i<m;i++)< bdsfid="188" p=""></m;i++)<>{for(j=0;j<n;j++)< bdsfid="191" p=""></n;j++)<>cout<<list[i][j]<<" ";<="" bdsfid="193" p=""></list[i][j]<<"> cout<<endl;}< bdsfid="195" p=""></endl;}<>for(i=0;i<n;i++)< bdsfid="197" p=""></n;i++)<>{if(f[i]=='*')sum++;cout<<f[i]<<" ";<="" bdsfid="202" p=""></f[i]<<">}cout<<"\n-----------------------------------"<<endl;<bdsfid="205" p=""></endl;<>cout<<"缺页次数是:"<<sum<<"缺页率是:"<<<endl;<="" bdsfid="207" p=""></sum<<"缺页率是:"<}void LRU(){for(i=0;i<="">{q=0;while((page[i]!=mem[q])&&(q!=m))q++;if(q==m)flag='*'; //缺页,则置标志flag为'*'elseflag=' ';for(j=q;j>0;j--)mem[j]=mem[j-1];mem[0]=page[i];for(j=0;j<m;j++)< bdsfid="225" p=""></m;j++)<>List[j][i]=mem[j];f[i]=flag;}cout<<endl;< bdsfid="229" p=""></endl;<>cout<<"------------LRU算法结果------------"<<endl;< bdsfid="231" p=""></endl;<>for(i=0;i<m;i++)< bdsfid="233" p=""></m;i++)<>{for(j=0;j<n;j++)< bdsfid="236" p=""></n;j++)<>cout<<list[i][j]<<" ";<="" bdsfid="238" p=""></list[i][j]<<"> cout<<endl;< bdsfid="240" p=""></endl;<>}for(i=0;i<n;i++)< bdsfid="243" p=""></n;i++)<>{if(f[i]=='*')sum++;cout<<f[i]<<" ";}<="" bdsfid="248" p=""></f[i]<<">cout<<endl;< bdsfid="250" p=""></endl;<>cout<<"-----------------------------------"<<endl;<bdsfid="252" p=""></endl;<>cout<<"缺页次数是:"<<sum<<"缺页率是:"<<<=""></sum<<"缺页率是:"<实验结果:四、实验小结(包括问题和解决方法、心得体会、意见与建议等)通过本次实验,我对于页面调度算法有了更加深刻的认识。
南邮操作系统实验二徐小龙
/* 创建失败*/
/* 子进程*/
/* 父进程*/ /* 同步*/
运行结果及其结果分析
5
实 验 报 告
6
7
实 验 报 告
8
四、实验小结 (包括问题和解决方法、心得体会、意见与建议等)
五、指导教师评语
成 绩
批阅人
日
期
9
/* 创建子进程*/
4
switch(pid) { case -1: printf("fork fail!\n"); exit(1); case 0: printf("subprocess!\n"); exit(0); default: wait(0); printf("completed !\n"); exit(0); }
二、实验环境(实验设备)
Windows XP + VMWare + Ubuntu
1
二、 实验原理及内容
1、实验程序一的要求 1)编写一 C 语言程序(以自己的姓名拼音或者学号命名) ,实现在程序运 行时通过系统调用 fork()创建两个子进程,使父、子三进程并发执行,父亲进 程执行时屏幕显示“parent”,儿子进程执行时屏幕显示“son”,女儿进程执行时 屏幕显示“daughter”。在执行进程的同时,打印各个进程的 ID 号(提示:调 用 getpid()) 。 2)多次连续反复运行这个程序(提示:可设置循环,让已被创建的子进 程作为父进程,继续创建子进程) ,观察屏幕显示结果的顺序,直至出现不一 样的情况为止。记下这种情况,试简单分析其原因。 3)能够查看你的程序所创建的进程的详细信息(提示:ps 命令+参数) 。 并能够以树形结构(提示:pstree 命令)显示你所创建的进程的父子关系(提 示:若在实验程序一运行结束后再查看进程,则无法显示程序一中创建的进 程,所以只能在程序一运行期间,查看当前进程) 。 4)经过 GCC 编译的可执行的目标文件要重命名为以自己姓名的拼音为文 件名,不能以 a.out 为文件名
南邮系统分析与设计实验报告-3
通达学院课内实验报告课程名:系统分析与设计任课教师:刘影专业:信息管理与信息系统学号:姓名:二○一四至二○一五年度第二学期南京邮电大学管理学院)链和消息的创建:在协作图中添加“Administrator”类对象“)序列图和协作图的转换:双击浏览器中要转换的协作图,选择菜单栏中“活动图的建模——借阅者借书活动图首先要确定要为哪个对象建模和明确所需要建立模型核心问题。
们确定需要建模的系统的用例,以及用例的参与者。
对于“借阅者借书”的用例来说,参与者是借阅者和图书管理员,借阅者通过图书管理员来进行借书活动,涉及的用例是借书。
)创建活动图:右击浏览器中的“Logic View”图标,在弹出的快捷菜单中选择“”命令,在“Logical View”下会创建“State/Activity Model)绘制泳道:在“借阅者借书活动图”中创建“借阅者”和“图书管理员”这两个泳道,具体方法如下:单击工具栏中相应按钮,在图形编辑区域单击,可以创建默认名为其他活动状态与分支可按照上述方法绘制,完整的“借阅者借书”活动图如下图所示:状态图的建模——图书状态图一.确定状态间的实体以及实体的状态对于图书管理系统而言,最需要的建模实体就是图书的状态,添加,被预定,被借阅,被删除。
当确定了需要建模的实体,并找出了实体的初始状态和终止状态以及其他相关状态后,找出相关状态间的事件和转换,它们间的转换规则是:刚被购买后的新书可以通过系统管理员添加成为能够被借阅的图书。
图书被预定后成为被预定状态。
)绘制转换:单击工具栏中相应图标,单击起始状态向目标状态拖动。
)绘制事件:双击“图书状态图”图形编辑区域中刚建好的转换,在弹出的“其余状态和事件可按照上述方法依次绘制。
南邮操作系统实验4.文件系统模拟实现
关闭文件close close (fd);
实验内容及原理说明——实验4
读文件read
写文件write
nr = read (fd, buf, count); buf 为读出信息所应送入的用户数据区首地址 count 为要求传送字节数 nr 为实际读入字节数 一旦读到文件末尾,系统调用就返回,故nr可能小于 count,甚至为0 nw = write (fd, buf, count); 参数类似 read 其中 buf 是信息传送的源地址,即将buf指向的用户数 据区中的信息写入文件中
具体功能:
#include <unistd.h> #include <stdio.h> #include <fcntl.h>
实验内容及原理说明——实验4
创建文件creat(兼具打开功能)
fd = creat (filenamep, mode);
filenamep指向所要创建的文件路径名
实验4:文件系统的模拟实现
实验基本信息 实验内容说明
实验基本信息
实验名称
文件系统的模拟实现
实验类型:综合 学时:2+2 实验时间:13.5.30(下午3-4节) 地点:教5-501 实验环境:
VMWare + Ubuntu
实验内容及原理说明——实验4
实验目link、open、close、 read、write的使用,编程模拟实现文件系统基本功能 运行终端给出命令提示,请用户选择创建、删除、读、 写、退出等操作(可用数字表示不同命令) 根据用户选择命令,提示用户输入文件名、文件内容 等信息 执行用户命令
南京邮电大学-操作系统实验报告
课内实验报告课程名:操作系统任课教师:沈超专业:信息管理与信息系统学号:姓名:二○一六至二○一七年度第一学期南京邮电大学经济与管理学院Process[numberschedul].order=tempcounter;}程序结果截图:二、银行家算法(网上借鉴)银行家算法,当进程提出资源申请时,系统首先检查该进程对资源的申请量是否超过其最大需求量及系统现有的资源能否满足进程需要。
若超过,则报错,若不能满足,则让该进程等待;否则进一步检查把资源分给该进程后系统能否出于安全状态,若安全,则分配,否则置该进程为等待资源状态。
算法实现过程:设进程i 提出请求REQUEST [j] ,则银行家算法按如下规则进行判断。
(1) 如果REQUEST [i] [j]<= NEED[i][j] ,则转(2) ;否则,出错。
(2) 如果REQUEST [i] [j]<= A V AILABLE[i][j] ,则转(3) ;否则,出错。
(3) 系统试探分配资源,修改相关数据:A V AILABLE[j]-=REQUEST[i][j];ALLOCATION[i][j]+=REQUEST[i][j];NEED[i][j]-=REQUEST[i][j];(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
Check()关键代码:{int k, f, no=0;int work[M],a[M];char finish[M];anquan=1;for(i=0;i<n; i++) finish[i]='F';for(j=0;j<m; j++) work[j]=available[j]; k=n;do{ for (i=0;i<n; i++){if (finish[i]=='F'){ f=1;for (j=0;j<m; j++)if (need[i][j]>work[j]) printf("处于安全状态.");printf("安全序列号:");for (i=0;i<n;i++) printf ("%d ",a[i]); printf("\n");printf("进程");printf(" ");printf(" Max ");rintf(" ");rintf("allocation");printf(" ");printf("need");printf(" ");f=0;if (f==1)//找到还没完成的且需求数小于可提供进程继续运行的{ finish[i]='T';a[no++]=i;//记录安全序列号for (j=0;j<m; j++)work[j]=work[j]+allocation[i][j];//释放该进程已分配的资源available[j] =work[j];}}}k--; }while(k>0);f=1;for (i=0;i<n; i++)//判断有没有进程没完成{ if (finish[i]=='F'){f=0;break; }} if (f==0) {printf("不安全状态!\n");anquan=0;} else {printf("available");printf("\n");for (i=0;i<n; i++){ printf("%2d",i);printf(" ");for(j=0;j<m; j++)printf("%2d",max[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",allocation[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",need[i][j]);printf(" ");for(j=0;j<m; j++){if(i>0)break;printf("%2d",available[j]);}printf("\n");}}}程序结果截图:三、实验总结:这次上机模拟了进程调度过程和解决了死锁问题,让我对短作业优先调度算法和银行家算法有了比在课堂上更深刻的认识。
南京邮电大学操作系统实验报告
通信与信息工程学院2015 / 2016学年第二学期实验报告课程名称:操作系统实验名称:1、LINUX及其使用环境2、进程管理3、进程间通信4、文件的操作和使用班级学号专业电子信息工程学生姓名指导教师赵建立实验名称试验一 LINUX及其使用环境实验类型验证实验学时1实验时间2016.6.2一、实验目的和要求1、了解UNIX的命令及使用格式。
2、熟悉UNIX/LINUX的常用基本命令。
3、练习并掌握UNIX提供的vi编辑器来编译C程序。
4、学会利用gcc、gdb编译、调试C程序。
二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1、熟悉LINUX的常用基本命令。
如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。
(1)显示目录文件 ls例:ls -al 显示当前目录下的所有文件(2)建新目录 mkdir例:mkdir test 新建一个test目录(3)删除目录rmdir(4)改变工作目录位置 cd例:cd test 更改工作目录至test目录下(5)显示当前所在目录pwd(6)查看目录大小du(7)文件属性的设置 chmod(8)命令在线帮助 man2、设计一个实现文件拷贝功能的shell程序。
(1)在文本编辑器里输入shell程序:#!/bin/shecho “please enter source file:”read soucecho please enter destination file:”read destcp $souc $destls $dest将程序保存在主目录下,命名为shell.(2)打开终端,输入ls -l,显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称。
输入 ./shell,运行shell程序。
输入源文件hello.c,目标文件B13011206.c。
南邮系统分析与设计实验报告-1【模板范本】
通达学院课内实验报告课程名:系统分析与设计任课教师:刘影专业: 信息管理与信息系统学号:姓名:二○一四至二○一五年度第二学期南京邮电大学管理学院《系统分析与设计》课程实验第一次实验报告实验内容及基本要求:实验项目名称:初始UML语言实验类型:验证每组人数:1人实验内容及要求:内容:学会安装并使用Rational Rose软件,了解工具栏中按钮的功能。
要求:学生要掌握Rational Rose软件的安装过程。
了解工具栏中按钮功能.并能熟练应用主要操作按钮。
认真理解系统定义,并初步定义自己拟定分析的系统功能.实验结果:一.Rational Rose软件的安装步骤:1.下载Rational rose压缩包,解压至桌面,单击setup。
exe可执行文件进行安装2.选择第一个Instal IBM Rational Rose Enterprise Edition进行下一步安装,下图单击“是”3.单击“下一步",选择“Desktop installation from CD image"进行安装4.单击“下一步”:5.单击“下一步”6.单击”下一步“,在软件许可证协议中,单击接受7.单击“下一步”8.单击“下一步”9.单击“下一步”10.单击Install11.单击Finish,在下一步中选择第二个,单击“下一步”12.选择Browse,在弹出文件选择对话框,在破解方法文件夹中的Rose_2007_CRACK中的CRACK中选择license.upd文件,单击“打开".13.单击Inport,在生成的对话框中单击inport14.系统导入成功15.单击“确定”二.Rational Rose主界面以及工具栏中按钮功能1.主界面:2。
工具栏说明:Rose的界面分为三个部分:Browser窗口、Diagram窗口、Document窗口,Browser窗口:用来浏览、创建、删除和修改模型中的模型元素。
操作系统实验模板1
实验代码:
#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
const int MaxNumber=100;
int TrackOrder[MaxNumber];
int MoveDistance[MaxNumber];//移动距离
{
A=abs(TrackOrder[j]-temp);
n=j;
}
else continue;
}
Finished[n]=true;
MoveDistance[i]=A;
temp=TrackOrder[n];
A=M;
FindOrder[i]=TrackOrder[n];
}
}
//SCAN,扫描算法
void SCAN()
}
cout<<setw(20)<<"平均寻道长度:"<<AverageDistance<<endl;
cout<<endl;
}
int main()
{
int y=1;
int s;
Inith();
while(y)
{
cout<<"请选择寻道方式:1--FCFS; 2--SSTF; 3--SCAN;4--CSCSN: ";
}
cout<<"是否继续选择寻道算法?1--是;0--否: ";
int p;
cin>>p;
y=p;
}
南邮Java实验报告1-综合图形界面程序设计
南邮Java实验报告1-综合图形界面程序设
计
自查报告。
在本次实验中,我设计了一个综合图形界面程序,实现了基本的图形绘制、文本输入和按钮操作功能。
在完成实验过程中,我对自己的工作进行了自查,总结如下:
1. 程序功能完整性,在实验中,我确保了程序能够实现基本的图形绘制、文本输入和按钮操作功能,并且能够正确响应用户的操作。
我对每个功能模块进行了测试,确保程序的功能完整性。
2. 界面美观度,在设计界面时,我注重了界面的美观度和用户体验,保证了界面的布局合理,颜色搭配和图形元素的大小比例协调,使得用户操作起来更加舒适。
3. 代码规范性,在编写代码时,我遵循了Java编程规范,命名规范和代码风格规范,确保了代码的可读性和可维护性。
我对代码进行了注释,方便他人阅读和理解。
4. 错误处理和异常处理,在程序中,我对用户的输入和操作进
行了错误处理和异常处理,保证了程序的稳定性和健壮性。
当用户
输入错误或者操作不当时,程序能够给出相应的提示或者处理方式。
5. 性能优化,在编写程序时,我尽量避免了冗余的代码和不必
要的计算,保证了程序的性能优化。
我对程序进行了性能测试,确
保程序能够在各种情况下都能够正常运行。
通过这次自查,我发现了一些不足之处,比如界面美观度还有
待提高,代码规范性需要进一步加强等。
在今后的学习和实践中,
我会继续努力改进自己的不足之处,提高自己的编程能力和程序设
计水平。
同时,我也会继续关注Java编程技术的发展,不断学习和
掌握新的知识和技能,为自己的成长和发展打下更加坚实的基础。
嵌入式系统 实验报告 南邮
实验报告( 2011 / 2012 学年第二学期)课程名称ARM嵌入式系统原理与开发实验名称嵌入式Linux交叉开发环境建立与程序开发实验时间2012 年 6 月21 日指导单位计算机学院指导教师王诚学生姓名颜泽鑫班级学号B09011027 学院(系) 通信与信息工程专业电子信息工程实验一、熟悉Linux开发环境实验目的:熟悉Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用,学习使用Linux操作系统的常用命令。
使用Linux的armv4l-unknown-linux-gcc编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。
实验内容与要求:使用Redhat Linux 9.0操作系统环境,安装ARM-Linux的开发库及编译器。
创建一个新目录,并在其中编写hello.c和Makefile文件。
学习在Linux下的编程和编译过程,以及ARM开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
学会集成环境的安装与开发。
实验设备及工具(包括软件调试工具):硬件:UP-NETARM2410-S嵌入式实验平台、PC机Pentium 500以上, 硬盘10GB以上。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境。
实验过程:运行PC机上的Linux系统,进入系统后,建立工作目录,所用语句如下:[root@zxt smile]# mkdir hello[root@zxt smile]# cd hello编写的hello.c如下:#include <stdio.h>main(){printf(“hello world \n”);}要使上面的hello.c程序能够运行,必须要编写一个Makefile文件,Makefile 文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。
南邮微机实验报告
南邮微机实验报告《南邮微机实验报告》南京邮电大学微机实验室是学生们进行计算机实验和学习的重要场所。
在这里,我们学习了计算机硬件和软件的基本知识,掌握了计算机系统的组成和工作原理,提高了我们的计算机应用能力。
下面是我们在南邮微机实验室进行的一次实验报告。
实验名称:操作系统安装与配置实验目的:通过实际操作,掌握计算机操作系统的安装和配置方法,提高我们的操作系统安装和配置能力。
实验内容:1. 准备工作:备份重要数据,准备操作系统安装光盘或U盘。
2. 操作系统安装:将安装光盘或U盘插入计算机,按照提示进行操作系统安装。
3. 操作系统配置:完成安装后,进行基本的系统配置,包括网络设置、用户账户设置、软件安装等。
实验步骤:1. 准备工作:备份个人重要数据,准备Windows 10安装U盘。
2. 操作系统安装:将U盘插入计算机,重启计算机,按照提示进行Windows10操作系统安装。
3. 操作系统配置:安装完成后,进行基本的系统配置,包括网络设置、用户账户设置、软件安装等。
实验结果:通过实际操作,我们成功地安装和配置了Windows 10操作系统,完成了基本的系统配置,包括网络设置、用户账户设置和软件安装等。
这次实验让我们对操作系统安装和配置有了更深入的理解,提高了我们的操作系统应用能力。
实验总结:通过这次实验,我们不仅掌握了操作系统安装和配置的基本方法,还提高了我们的实际操作能力。
我们将继续在南邮微机实验室进行更多的实验,不断提升我们的计算机应用能力,为将来的学习和工作做好充分的准备。
南邮微机实验室为我们提供了一个良好的学习环境,让我们能够通过实际操作来深入理解计算机知识。
我们将继续努力,不断提高自己的计算机应用能力,为将来的发展打下坚实的基础。
【报告】南邮单片机实验报告
【报告】南邮单片机实验报告一、实验目的本次南邮单片机实验旨在通过实际操作和实践,深入了解单片机的工作原理、编程方法以及其在实际应用中的功能实现。
通过完成一系列实验任务,提高我们对单片机系统的设计、开发和调试能力,为今后在电子信息领域的学习和工作打下坚实的基础。
二、实验设备1、单片机开发板2、计算机3、编程软件(如 Keil C51)4、下载器5、示波器6、万用表三、实验内容(一)点亮 LED 灯1、原理通过控制单片机的引脚输出高低电平,来控制连接在引脚上的 LED 灯的亮灭。
2、编程实现使用 C 语言编写程序,设置相应引脚为输出模式,并通过循环语句实现 LED 灯的闪烁效果。
3、调试与观察将程序下载到单片机中,观察 LED 灯的闪烁情况,使用示波器测量引脚的电平变化,以验证程序的正确性。
(二)数码管显示1、原理数码管由多个发光二极管组成,通过控制不同段的发光二极管的亮灭,可以显示不同的数字和字符。
2、编程实现编写程序,实现数码管的动态扫描显示,将需要显示的数字或字符转换为对应的段码,并通过定时中断实现动态刷新。
3、调试与观察下载程序后,观察数码管的显示效果,检查是否能够正确显示预定的数字和字符。
(三)按键控制1、原理按键连接到单片机的引脚,当按键按下时,引脚的电平发生变化,通过检测引脚电平的变化来实现按键的识别和响应。
2、编程实现设置引脚为输入模式,采用查询或中断的方式检测按键状态,根据按键的不同操作执行相应的功能。
3、调试与观察按下不同的按键,观察系统的响应是否符合预期,如 LED 灯的状态改变、数码管显示内容的变化等。
(四)温度传感器采集与显示1、原理使用数字式温度传感器(如 DS18B20)采集环境温度,传感器将温度转换为数字信号,单片机通过特定的通信协议读取温度数据。
2、编程实现编写驱动程序,实现与温度传感器的通信,读取温度值,并将其转换为合适的显示格式。
3、调试与观察将传感器置于不同的温度环境中,观察数码管或液晶显示屏上显示的温度值是否准确。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
南邮系统分析与设计实验报告
通达学院课内实验报告课程名:系统分析与设计任课教师:刘影专业:信息管理与信息系统学号:____________姓名:______________二O—四至二O—五年度第二学期南京邮电大学管理学院《系统分析与设计》课程实验第二次实验报告“Use Case Diagram ”命令,创建新的用例图后,在浏览器的" Use Case View ”树形结构下多了一个名为“ NewDiagram”的图标,重命名为“借阅者用例图”。
双击“借阅者用例图” 图标,会出现用例图编辑工具和编辑区。
①绘制参与者:单击工具栏的参与者图标到右边的编辑区,修改名称为“借阅者”。
②绘制用例:单击工具栏中用例图标,在编辑区内要绘制的地方单击左键,会出现带有默认名的“ NewUseCase的新用例,双击该用例,弹出“Use Case Specification for NewUseCase对话框,用于属性的设置。
③绘制用例与参与者的关系:单击相应的图标,鼠标移动到“借阅者”上,这时按下鼠标左键不放,移动鼠标至用例上松开鼠标,注意线段箭头的方向为松开鼠标的方向,关联关系的箭头应有参与者指向用例,不可画反。
④绘制用例间的关系:单击相应图标,注意线段箭头的方向是松开鼠标左键时的方向,双击虚线段,在弹出的“ Depe ndency Specificatio n for Un title ”对话框,设置相应属性,“Stereotype ”下拉列表列出了用例间所有可用的关系,选择相应关系。
根据以上步骤,创建出的借阅者用例图如下:*圳!1百2.按照以上步骤,图书管理员用例图和系统管理员用例图如下:駅烯悴士-L^in^4Kbt>>険査用戶自畫性"沁血冲点11书曰I •片料口图书管理员用例图系统管理员用例图类图建模一一图书管理系统类图—.确定系统中的类对于“图书管理系统”来说,根据功能可以基本抽象出图书管理系统中的多个类:“ Borrower ”借阅者类,“ Librarian ”图书管理员类,“ Administrator ”系统管理员类, “Book”图书类,“Resever”预定类,“Loan”借阅类,“Title ”书目类。
南邮微机实验报告
一、实验名称微机原理与接口技术实验二、实验目的1. 理解微机的基本工作原理和硬件组成。
2. 掌握计算机常用接口芯片的基本功能和使用方法。
3. 熟悉微机实验系统的操作流程。
4. 培养动手实践能力和分析问题、解决问题的能力。
三、实验内容1. 微机硬件系统认知- 了解微机的硬件组成,包括CPU、内存、主板、硬盘、显卡、声卡等。
- 通过实验观察微机硬件各部分的功能和连接方式。
2. 微机接口芯片实验- 学习并行接口芯片8255的使用方法和编程技巧。
- 实现键盘输入和LED显示,设计一个简单的定时显示装置。
3. 微机实验系统操作- 熟悉微机实验系统的使用方法和操作流程。
- 掌握实验软件的安装和使用。
4. 汇编语言程序设计- 学习汇编语言的基本语法和编程技巧。
- 编写简单的汇编语言程序,实现特定功能。
四、实验步骤1. 微机硬件系统认知- 观察微机硬件各部分的功能和连接方式。
- 使用实验设备观察CPU、内存、主板、硬盘等硬件的工作状态。
2. 微机接口芯片实验- 根据实验指导书,配置并行接口芯片8255。
- 编写程序实现键盘输入和LED显示功能。
- 设计定时显示装置,实现时间显示和按键控制。
3. 微机实验系统操作- 安装实验软件,熟悉实验系统的操作流程。
- 使用实验软件进行实验操作。
4. 汇编语言程序设计- 学习汇编语言的基本语法和编程技巧。
- 编写汇编语言程序,实现特定功能。
五、实验结果与分析1. 微机硬件系统认知- 通过实验观察,了解了微机硬件各部分的功能和连接方式。
- 掌握了微机实验系统的使用方法和操作流程。
2. 微机接口芯片实验- 成功实现了键盘输入和LED显示功能。
- 设计的定时显示装置能够正常工作。
3. 微机实验系统操作- 熟练掌握了微机实验系统的操作流程。
4. 汇编语言程序设计- 成功编写了汇编语言程序,实现了特定功能。
六、实验心得体会通过本次实验,我对微机原理和接口技术有了更深入的了解。
实验过程中,我学会了如何使用微机实验系统,掌握了微机接口芯片的编程技巧,提高了动手实践能力。
南邮通电实验报告(3篇)
第1篇一、实验目的1. 了解南邮供电系统的基本结构和工作原理。
2. 掌握南邮供电系统的操作和维护方法。
3. 培养实验操作能力和团队合作精神。
二、实验器材1. 交流电源:220V、50Hz2. 电表:电压表、电流表3. 电线:绝缘电线、连接线4. 电容器:0.1μF、0.01μF5. 电感器:100mH、50mH6. 电阻:1Ω、10Ω、100Ω7. 灯泡:40W、60W8. 开关:单刀双掷开关、单刀单掷开关9. 实验板:南邮通电实验板三、实验原理南邮供电系统主要由变压器、配电线路、配电设备、用电设备等组成。
本实验主要研究配电线路和配电设备的工作原理。
1. 变压器:变压器是一种能量传递装置,通过电磁感应原理将高压电能转换为低压电能。
本实验中使用的变压器为单相变压器。
2. 配电线路:配电线路是指从变压器输出端到用电设备之间的输电线路。
本实验中使用的配电线路为单相线路。
3. 配电设备:配电设备包括开关、熔断器、电表等,用于控制、保护和测量电能。
四、实验步骤1. 实验前准备:检查实验器材是否完好,熟悉实验原理和步骤。
2. 组装实验电路:按照实验要求连接电路,包括变压器、配电线路、配电设备、用电设备等。
3. 通电实验:(1)测量变压器输入端电压:使用电压表测量变压器输入端电压,记录数据。
(2)测量配电线路电压:使用电压表测量配电线路电压,记录数据。
(3)测量配电设备电压:使用电压表测量配电设备电压,记录数据。
(4)测量用电设备电压:使用电压表测量用电设备电压,记录数据。
(5)测量电流:使用电流表测量变压器输入端、配电线路、配电设备、用电设备的电流,记录数据。
4. 关闭实验电路:断开开关,切断电源。
5. 实验数据整理:整理实验数据,分析实验结果。
五、实验结果与分析1. 实验数据:(1)变压器输入端电压:220V(2)配电线路电压:220V(3)配电设备电压:220V(4)用电设备电压:220V(5)变压器输入端电流:0.5A(6)配电线路电流:0.5A(7)配电设备电流:0.5A(8)用电设备电流:0.5A2. 实验结果分析:(1)变压器输入端电压与配电线路电压、配电设备电压、用电设备电压相等,说明供电系统电压稳定。
南京邮电大学实验报告模版
实验报告( 2014 / 2015 学年第一学期)课程名称计算机操作系统实验名称虚构储存中页面置换算法的模拟实现实验时间2014 年 12 月19 日指导单位南京邮电大学指导教师崔衍学生姓名学院 (系) 物联网院班级学号专业网络工程实验报告实验名称虚构储存中页面置换算法的指导教师崔衍模拟实现实验种类上机实验实验学时4实验时间一、实验目的和要求目的:经过恳求页式储存管理中页面置换算法模拟设计,认识虚构储存技术的技术特色,掌握恳求页式储存管理的页面置换算法要求:(1)设计实现下边算法,并输出下述各样算法的命中率。
①先进先出的算法(FIFO);②近来最少使用算法(LRR) ;③最正确裁减算法(OPT)先裁减最不常用的页地点。
(2)多次频频运转改良后的程序,察看并记录运转结果,并剖析原由。
二、实验环境 (实验设施 )二、实验原理及内容实验三#include <iostream.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>#define Bsize 4typedef struct BLOCK// 申明一种新种类——物理块种类{int pagenum;// 页号int accessed;//接见字段,其值表示多久未被接见}BLOCK;int pc;// 程序计数器,用来记录指令的序号int n;// 缺页计数器,用来记录缺页的次数static int temp[320];// 用来储存320 条随机数BLOCK block[Bsize]; //定义一大小为 4 的物理块数组//*************************************************************void init( );// 程序初始化函数int findExist(int curpage);// 查找物理块中能否有该页面int findSpace( );// 查找能否有安闲物理块int findReplace( );// 查找应予置换的页面void display ( );// 显示void suijishu( );// 产生 320 条随机数 ,显示并储存到 temp[320] void pagestring( );// 显示调用的页面行列void OPT( );//OPT 算法void LRU( );// LRU 算法void FIFO( );//FIFO算法//*************************************************************void init( ){for(int i=0;i<Bsize;i++){block[i].pagenum=-1;block[i].accessed=0;pc=n=0;}}//-------------------------------------------------------------int findExist(int curpage){for(int i=0; i<Bsize; i++){if(block[i].pagenum == curpage )return i;// 检测到内存中有该页面,返回block 中的地点}return -1;}//-------------------------------------------------------------int findSpace( ){for(int i=0; i<Bsize; i++){if(block[i].pagenum == -1)return i;// 找到安闲的block ,返回 block 中的地点}return -1;}//-------------------------------------------------------------int findReplace( ){int pos = 0;for(int i=0; i<Bsize; i++){if(block[i].accessed >block[pos].accessed)pos = i;// 找到应予置换页面,返回BLOCK 中地点}return pos;}//-------------------------------------------------------------void display( ){for(int i=0; i<Bsize; i++){if(block[i].pagenum != -1){ printf(" %02d",block[i].pagenum);}}cout<<endl;}//-------------------------------------------------------------void suijishu( ){int flag=0;cin>>pc;cout<<"****** 依据要求产生的 320 个随机数: *******"<<endl;for(int i=0;i<320;i++){temp[i]=pc;if(flag%2==0) pc=++pc%320;if(flag==1) pc=rand( )% (pc-1);if(flag==3) pc=pc+1+(rand( )%(320-(pc+1)));flag=++flag%4;printf(" %03d",temp[i]);if((i+1)%10==0) cout<<endl;}}//-------------------------------------------------------------void pagestring( ){for(int i=0;i<320;i++){printf(" %02d",temp[i]/10);if((i+1)%10==0) cout<<endl;}}//-------------------------------------------------------------void OPT( ){int exist,space,position ;int curpage;for(int i=0;i<320;i++){if(i%100==0) getch( );pc=temp[i];curpage=pc/10;exist = findExist(curpage);if(exist==-1){space = findSpace ( );if(space != -1){block[space].pagenum = curpage;display( );n=n+1;}else{for(int k=0;k<Bsize;k++){for(int j=i;j<320;j++){if(block[k].pagenum!= temp[j]/10){block[k].accessed = 1000;}// 未来不会用,设置为一个很大数else{block[k].accessed = j;break;}}}position = findReplace( );block[position].pagenum = curpage;display( );n++;}}}cout<<" 缺页次数 :"<<n<<endl;cout<<" 缺页率 :"<<(n/320.0)*100<<"%"<<endl;}//-------------------------------------------------------------void LRU( ){int exist,space,position ;int curpage;for(int i=0;i<320;i++){if(i%100==0) getch( );pc=temp[i];curpage=pc/10;exist = findExist(curpage);if(exist==-1){space = findSpace( );if(space != -1){block[space].pagenum = curpage;display( );n=n+1;}else{position = findReplace( );block[position].pagenum = curpage;display( );n++;}}else block[exist].accessed = -1;// 恢复存在的并刚接见过的BLOCK 中页面accessed为 -1 for(int j=0; j<4; j++)}cout<<" 缺页次数 :"<<n<<endl;cout<<" 缺页率 :"<<(n/320.0)*100<<"%"<<endl;}//-------------------------------------------------------------void FIFO( ){int exist,space,position ;int curpage;for(int i=0;i<320;i++){if(i%100==0) getch( );pc=temp[i];curpage=pc/10;exist = findExist(curpage);if(exist==-1){space = findSpace( );if(space != -1){block[space].pagenum = curpage;display( );n=n+1;}else{position = findReplace( );block[position].pagenum = curpage;display( );n++;block[position].accessed--;}}for(int j=0; j<Bsize; j++)}cout<<" 缺页次数 :"<<n<<endl;cout<<" 缺页率 :"<<(n/320.0)*100<<"%"<<endl;}//*************************************************************void main( ){int select;cout<<" 请输入第一条指令号(0~320) : ";suijishu( );cout<<"***** 对应的调用页面行列*******"<<endl;pagestring( );do{cout<<"****************************************"<<endl;cout<<"------1:OPT2:LRU 3:FIFO4:退出 -----"<<endl;cout<<"****************************************"<<endl;cout<<"请选择一种页面置换算法:";cin>>select;cout<<"****************************************"<<endl;init( );switch(select){case 1:cout<<"最正确置换算法OPT:"<<endl;cout<<"*****************"<<endl;OPT( );break;case 2:cout<<" 近来最久未使用置换算法LRU:"<<endl;cout<<"**************************"<<endl;LRU( );break;case 3:cout<<" 先进先出置换算法FIFO:"<<endl;cout<<"*********************"<<endl;FIFO( );break;default: ;}}while(select!=4); }实验结果:实验四Login 用户登录bool chklogin(char *users, char *pwd){int i;for(i=0; i<8; i++){if( (strcmp(users,usrarray[i].name)==0) && (strcmp(pwd,usrarray[i].pwd)==0)) return true;}return false;}Create创立文件int create(){temp=initfile(" ",0);cin>>temp->filename;cin>>temp->content;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;cout<<"文件成立成功 !"<<endl;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==0) {printf(" 对不起 ,文件已存在 !");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;cout<<"文件成立成功 !"<<endl;}return 1;}int dir(){int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root){cout<<"\ <DIR> "<<".."<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors" <<i<<" files"<< j <<endl;return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<"<DIR>\ "<<temp->filename<<endl;i++;}else{cout<<"<FILE> "<<temp->filename<<endl;j++;}temp=temp->next;}cout<<"Total: "<<" directors" <<i<<"files"<< j <<endl;}Read读取文件int read(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在 !"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {cout<<recent->child->content<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0) {cout<<temp->next->content<<endl;return 1;}}cout<<"文件不存在 !"<<endl;}}Write 写入文件int write(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在 !"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {recent->child->isopen=1;//设置文件标志为翻开cin>>recent->child->content;recent->child->isopen=0;//设置文件标志为封闭cout<<"文件写入成功 !"<<endl;return 1;}elsetemp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0){recent->child->isopen=1;//设置文件标志为翻开cin>>temp->next->content;recent->child->isopen=0;//设置文件标志为封闭cout<<"文件写入成功 !"<<endl;return 1;}}cout<<"文件不存在 !"<<endl;}}Del 删除int del(){char filename[FILENAME_LENGTH];cin>>filename;temp=new fnode;if(recent->child){temp=recent->child;while(temp->next && (strcmp(temp->filename,filename)!=0 || temp->isdir!=0)) temp=temp->next;if(strcmp(temp->filename,filename)!=0){cout<<"不存在该文件! "<<endl;return 0;}}else{cout<<"不存在该文件! "<<endl;return 0;}if(temp->parent==NULL){temp->prev->next=temp->next;if(temp->next)temp->next->prev=temp->prev;temp->prev=temp->next=NULL;else{if(temp->next)temp->next->parent=temp->parent;temp->parent->child=temp->next;}delete temp;cout<<"文件已删除 !"<<endl;}成立目录int mkdir(){temp=initfile(" ",1);cin>>temp->filename;if(recent->child==NULL){temp->parent=recent;temp->child=NULL;recent->child=temp;temp->prev=temp->next=NULL;}else{ttemp=recent->child;while(ttemp->next){ttemp=ttemp->next;if(strcmp(ttemp->filename,temp->filename)==0&&ttemp->isdir==1) {printf(" 对不起 ,目录已存在 !");return 1;}}ttemp->next=temp;temp->parent=NULL;temp->child=NULL;temp->prev=ttemp;temp->next=NULL;}return 1;切换目录int dir(){int i=0,j=0;temp=new fnode;temp=recent;if(temp!=root){cout<<"\ <DIR> "<<".."<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors" <<i<<" files"<< j <<endl; return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<"<DIR>\ "<<temp->filename<<endl;i++;}else{cout<<"<FILE> "<<temp->filename<<endl;j++;} temp=temp->next;}cout<<"Total: "<<" directors" <<i<<"files"<< j <<endl; }四、实验小结(包含问题和解决方法、心得领会、建议与建议等)经过课程设计 ,加深了对操作系统的认识 ,认识了操作系统中各样资源分派算法的实现 ,特别是对虚构储存 ,页面置换有了深入的认识 ,并可以用高级语言进行模拟演示。
南京邮电大学操作系统实验报告
南京邮电大学操作系统实验报告This manuscript was revised on November 28, 2020通信与信息工程学院2015 / 2016学年第二学期实验报告课程名称:操作系统实验名称:1、LINUX及其使用环境2、进程管理3、进程间通信4、文件的操作和使用班级学号专业电子信息工程学生姓名指导教师赵建立一、实验目的和要求1、了解UNIX的命令及使用格式。
2、熟悉UNIX/LINUX的常用基本命令。
3、练习并掌握UNIX提供的vi编辑器来编译C程序。
4、学会利用gcc、gdb编译、调试C程序。
二、实验环境Windows XP + VMWare + RedHat Enterprise Linux(RHEL) 4三、实验原理及内容1、熟悉LINUX的常用基本命令。
如ls、mkdir、grep等,学会使用man、help等其它命令,掌握vi编辑器的使用。
(1)显示目录文件 ls例:ls -al 显示当前目录下的所有文件(2)建新目录 mkdir例:mkdir test 新建一个test目录(3)删除目录rmdir(4)改变工作目录位置 cd例:cd test 更改工作目录至test目录下(5)显示当前所在目录pwd(6)查看目录大小du(7)文件属性的设置 chmod(8)命令在线帮助 man2、设计一个实现文件拷贝功能的shell程序。
(1)在文本编辑器里输入shell程序:#!/bin/shecho “please enter source file:”read soucecho please enter destination file:”read destcp $souc $destls $dest将程序保存在主目录下,命名为shell.(2)打开终端,输入ls -l,显示目录下所有文件的许可权、拥有者、文件大小、修改时间及名称。
输入 ./shell,运行shell程序。
南邮交换技术实验报告成品[五篇范文]
南邮交换技术实验报告成品[五篇范文]第一篇:南邮交换技术实验报告成品实验一脉冲与双音多频信号的接收实验(实验指导书中“实验五”)一、实验目的1、了解脉冲信号与双音多频信号在程控交换系统中的发送和接受方法。
2、熟悉该电路的组成及工作过程。
二、实验仪器1、程控交换实验箱一台2、电话单机两台三、实验内容与步骤1、实验准备:连接电话单机;检查实验箱与 PC机的串口连线。
2、打开实验箱电源,电源指示灯亮,正常状态下,CPU工作指示灯间歇闪动,+5V、-5V、-48V开关电源灯亮,25Hz信号灯闪亮,L11-L14 灯亮,串行通信指示灯亮,四路话机处于待机状态。
之后启动 PC 机,选择进入实验界面。
3、脉冲信号发号收号实验1)设置话机拨号方式“P”。
2)主叫取机,PC 上显示出主叫号码。
19-1 3)主叫听到拨号音后,拨被叫号码。
拨号同时观察 PC界面上脉冲拨号波形,当有键按下时可看到拨号脉冲波形。
拨号完毕后PC 界面上显示被叫号码(只认前两位拨号)4、DTMF 信号的发送、接收、编/解码实验1)设置话机拨号方式“T”。
2)主叫取机,PC 上显示出主叫号码。
3)主叫听到拨号音后,拨被叫号码。
4)拨号同时观察 PC 界面上的双音频信号波形并记录: DTMF 状态:DTMF 状态检测点。
当有键按下时,该点为高电平;DTMF信号消失后,该点则为低电平。
收号中断:DTMF 发号中断检测点。
当无键按下时,该点为低电平;有键按下时是高电平,同时DTMFIN灯亮。
DTMF 输入: DTMF 拨号检测点。
当有键按下时有双音频信号;无键按下时无信号。
19-24)按键同时观察发光二极管L11-L14 与所按键值的关系(BCD 码)。
数码管同步显示电话拨号。
19-3看是否满足表 5-4 所述的对应关系。
拨号完毕后,实验界面上显示被叫号码。
四、心得体会第一个实验相对比较简单,在了解仪器的基础上很容易就能做出实验结果。
实验过程相对来说比较简单,在仪器充足的情况下并不难实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程实验报告
实验题目:
Linux进程信号通信、进程消息通信
专业软件工程
学生姓名
班级学号
教师陈兴国
指导单位计算机学院
日期 2016-9-30
一、实验目的
1.了解Linux的信号,熟悉Linux系统中进程之间软中断通信的基本原理
2.学习如何利用消息缓冲队列进行进程间的通信,并加深对消息通信机制的理解。
二、实验指导
1.kill(),signal(),lockf()系统调用
kill()系统调用
系统调用格式:int kill(pid,sig)
参数定义: int pid,sid;
pid是一个或一组进程的标识符,sig是要发送的软中断信号。
pid>0时,核心将信号发送给进程pid;
pid=0时,核心将信号发送给与发送进程同组的所有进程;
pid<0时,核心将信号发送给搜有用户标识符真正等于发送进程的有效用户标识号的进程。
signal()系统调用
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式:
signal (sig,function)
参数定义:
Signal (sig,function)
int sig;
void (*func)();
sig用于指定信号的类型,sig为0则没有收到任何信号。
function:在该进程中的一个函数地址,在核心态返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGNAL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。
lockf()系统调用
用作锁定文件的某些段或者整个文件。
系统调用格式:lockf(files,function,size)
参数定义:
int lockf(files,function,size)
int files,function;
long size;
2.消息的创建,发送和接收
使用系统调用msgget(),msgsnd,msgrec,及msgctl()函数编写消息的发送和接收程序
三、实验过程描述与结果分析
1.Linux进程信号通信
#include <stdio.h>
#include <signal.h>
#include<unistd.h>
#include <stdlib.h>
void waiting(),stop();
int wait_mark;/*用来避免锁的竞争,保证p1,p2无法在同一时刻获得文件的锁,即lockf(stdout,1,0)*/
main()
{
int p1,p2,stdout;
signal(SIGINT,stop);/*if press the ^c or ^break ,jump to stop function*/ while((p1=fork())==-1) ;/* create child process p1*/
if(p1>0)
{
while( ( p2=fork() ) ==-1);/* create child process p2*/
if(p2>0)
{
wait_mark=1;
sleep(5);/* 接收到^c信号,转stop函数*/
waiting();
kill(p1,16); /*向子进程p1发送软中断信号16*/
kill(p2,17);/*向子进程p2发送软中断信号17*/
wait(0);/*wait()系统方法,父进程会一直等待,直到子进程因暂停或者终止
发来软中断信号为止*/
wait(0);
printf("Parent process is killed!\n");
exit(0);
}
else{//p2被杀死的逻辑,响应kill(p1,17);
wait_mark=1;
signal(17,stop);/*接收到父进程发来的软中断信号,然后执行stop函数*、*/
waiting();
lockf(stdout,1,0);/*锁定输出,使得下面的语句可以正常输出打印*/
printf("Child process 2 is killed by parent!\n");
lockf(stdout,0,0);/*解锁输出*/
exit(0);/*正常终止子进程p2,使得父进程跳出wait(0),得以继续执行*/ }
}
else{//p1被杀死的逻辑,响应kill(p2,16);
wait_mark=1;
signal(16,stop);
waiting();
lockf(stdout,1,0);
printf("Child process 1 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
void waiting(){
while(wait_mark!=0);
}
void stop(){
wait_mark=0;
}
按住Ctrl+c,可见执行结果
2.Linux进程消息通信
1.server.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#define MSGKEY 75
struct msgform{
long mtype;
char mtext[256];
};
int main(int argc, char const *argv[]) {
struct msgform msg;
int msgqid;
int j,pid,*pint;
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
for(;;){
msgrcv(msgqid,&msg,256,1,0);
pint=(int*)msg.mtext;
pid=*pint;
printf("server:receive from pid %d\n",pid);
msg.mtype=pid;
*pint=getpid();
msgsnd(msgqid,&msg,sizeof(int),0);
}
return 0;
}
2.client.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#define MSGKEY 75
struct msgform{
long mtype;
char mtext[256];
};
int main(int argc, char const *argv[])
{
struct msgform msg;
int msgqid,pid,*pint;
msgqid=msgget(MSGKEY,0777);
pid=getpid();
pint=(int*)msg.mtext;
*pint=pid;
msg.mtype=1;
msgsnd(msgqid,&msg,sizeof(int),0);
msgrcv(msgqid,&msg,256,pid,0);
printf("client:receive from pid%d\n",*pint);
return 0;
}
运行结果:
四、自我评析与总结
1.你认为你完成的实验那些地方做得比较好或比较出色
做的相对比较快,一些命令比较熟悉一点
2.差距与局限,什么地方做得不太好,或什么地方可以做得更好程序的编写,C语言遗忘的很严重,还是得常用
3.从本实验得到的收获。
对编写与调试过程中经验教训的总结多试错,多查资料,遇到问题积极解决
4.对实验题的改进意见
无。