实验2进程控制与通信管理.docx
《实验2进程控制与通信管理.docx》由会员分享,可在线阅读,更多相关《实验2进程控制与通信管理.docx(15页珍藏版)》请在冰豆网上搜索。
实验2进程控制与通信管理
年级
11级
专业
计算机科学与技术
班级
五班
组号
12组
实验室
9#205
日期
2014/05/17
实验
名称
实验二、 进程控制与通信管理
实
验
内
容
分项内容
实验级别
1、Linux系统常用进程管理命令的使用
操作系统观察级
2、Linux系统常用进程创建与管理的系统调用
原码阅读与系统编程级
3、Windows平台常用进线程控制API
原码阅读与系统编程级
4、进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)
码阅读与系统编程级
5、简单进程通信(管道、消息缓冲、邮件槽等)
(原码阅读与系统编程级)
小组成员
姓名
学号
组内分工
自我评分
教师评分
独立完成实验二
(1)
良好
独立完成实验二
(2)
良好
独立完成实验二(3)
良好
独立完成实验二(4)
良好
独立完成实验二(5)
良好
小
组
成
绩
评
定
教师签名:
年月日
实验分项1
1、Linux系统常用进程管理命令的使用2、Linux系统常用进程创建与管理的系统调用3、Windows平台常用进线程控制API4、进程同步与互斥控制5、简单进程通信
实
验
目
的
一、实验目的:
1、加深对进程概念的理解,明确进程和程序的区别。
2、进一步认识并发执行的实质。
3、分析进程争用资源的现象,学习解决进程互斥的方法。
实
验
要
求
具体题目:
进程创建、进程控制
系统平台:
Linux/Windows操作系统
实
验
原
理
步
骤
(
算
法
流
程
)
2、实验原理
1.Linux系统常用进程管理命令
(1)at命令:
定时运行命令
让系统在两天后的17:
30执行文件data中指定的作业,使用命令:
#at-fdata15:
30+2days
(2)bg命令后台运行命令
如果要将一个大目录的文件进行排序后,将结果输入到一个文件中,可以使用命令:
#du-a/|sort-rn>/tmp/du.sorted
(3)Fg挂起程序
使用fg命令时,要加入后台任务号码,如果不加任何号码,则所变动的均是当前任
务。
#du-a/|sort-rn>/tmp/du.sorted&[1]237
#fg1
(4)Jobs显示后台程序
先把两个进程放在系统后台运行,然后使用jobs命令查看后台任务的执行情况:
#du-a/etc>user.data&
[1]233
#find/-namecore-typef-ls>core.data&
[2]234
#jobs-l
[1]+237Runningdu-a/etc>user.data
[2]-238Runningfind/-namecore-typef-ls>core.data
(5)kill命令杀掉进程
命令执行过程如果出错,用户可用"kill"来结束任务。
对于在后台运行的进程,
可以使用kill命令终止:
#du-a/|sort-rn>/tmp/du.sorted&
[1]237
#kill237
(6)nice命令改变权限优先级
将ls命令的优先序加1并执行,将结果输入文件1.txt:
#nice-n1ls>1.txt
(7)renice命令修改优先级
将进程PID为987及32的进程与进程拥有者为daemon及root的优先级别号加1:
#renice+1987-udaemonroot-p32
(8)sleep命令暂停进程
下面的命令使进程先暂停60秒,然后查看哪个用户登录到系统中:
#sleep60;who
2、进程同步与互斥控制(数据同步),原理如下:
(1)、设置全局变量:
intticket=100;互斥量:
HANDLEhMutex;
(2)、创建互斥信号量ticket:
hMutex=CreateMutex(NULL,TRUE,"ticket");
(3)、用WaitForSingleObject(hMutex,INFINITE);捕获互斥信号量hMutex
(4)、用ReleaseMutex(hMutex);释放互斥量的使用权
3、通过邮件槽实现简单进程通信,原理如下:
(1)、油槽服务器:
1)hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,
MAILSLOT_WAIT_FOREVER,NULL);//创建一个邮路。
2)ReadFile(hMailslot,buf,100,&dwRead,NULL);//读取邮路数据
3)CloseHandle(hMailslot);//关闭油槽
(2)、油槽客户端:
1)hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//创建油槽文件
2)WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL);//写入数据
3)CloseHandle(hMailslot);//关闭油槽
实验源代码如下:
1、进程同步与互斥控制(数据同步):
#include"stdafx.h"
#include
#include"iostream"
usingnamespacestd;
intindex=0;
intticket=100;
HANDLEhMutex;
DWORDWINAPIFun1Proc(LPVOIDlpParameter)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if(ticket>0)
{
cout<<"thread1sellticket:
"<}
else
break;
ReleaseMutex(hMutex);
}
return0;
}
DWORDWINAPIFun2Proc(LPVOIDlpParameter)
{
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if(ticket>0)
{
cout<<"thread2sellticket:
"<}
else
break;
ReleaseMutex(hMutex);
}
return0;
}
int_tmain(intargc,_TCHAR*argv[])
{
HANDLEhTread1;
HANDLEhTread2;
hTread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hTread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hTread1);
CloseHandle(hTread2);
hMutex=CreateMutex(NULL,TRUE,"ticket");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"Onlyoneinstancecanrun!
"<return0;
}
}
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);
Sleep(10000);
return0;
}
2、邮件槽进程通信:
1)油槽服务器:
(关键代码段)
voidC油槽客户端Dlg:
:
OnSend()
{
//TODO:
在此添加控件通知处理程序代码
HANDLEhMailslot;
hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hMailslot)
{
MessageBox("打开油槽失败!
");
return;
}
CStringstr;
charbuf[100];
m_edit.GetWindowText(str);
strcpy_s(buf,str);
DWORDdwWrite;
if(!
WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL))
{
MessageBox("写入数据失败!
");
CloseHandle(hMailslot);
return;
}
CloseHandle(hMailslot);
}
2)油槽客户端:
(关键代码段)
voidC油槽客户端Dlg:
:
OnSend()
{
//TODO:
在此添加控件通知处理程序代码
HANDLEhMailslot;
hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hMailslot)
{
MessageBox("打开油槽失败!
");
return;
}
CStringstr;
charbuf[100];
m_edit.GetWindowText(str);
strcpy_s(buf,str);
DWORDdwWrite;
if(!
WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL))
{
MessageBox("写入数据失败!
");
CloseHandle(hMailslot);
return;
}
CloseHandle(hMailslot);
}
(写不完时,可另加附页。
)
实
验
结
果
及
分
析
三、实验结果:
1、实验截图:
2-1进程控制达到数据同步处理截图
2-2油槽通信控制面板截图
2-3油槽-服务器截图
2-4油槽-客户端截图
2-5发送-接受效果截图
2、结果分析:
1)、ls命令列出了指定目录下的文件名和目录名,参数-l要求显示文件或目录的详
细信息,例如类型、访问权限、连接数、拥有者等。
在Linux中,用户通过利用fork创建的进程来与原进程运行相同的程序代码,为了
使新进程运行新的程序,用户可以使用系统调用exec来装入一个新的程序到当前进
程的地址空间,如果exec调用成功,系统开始执行新程序,永远不会返回原来的程
序。
2)、进程同步与互斥控制,能有效的控制全局变量在某一进程执行过程中唯一被访
问。
在多线程程序中容易出现共享资源因时间片到期而终止访问,这样就很容易出
现数据的错乱。
假如全局变量未火车票;对于线程函数(FunProc1、FunProc2),在
访问全局变量ticket时,ticket自减一。
如果在线程函数1(FunProc1)访问ticket,
还没有来得及自减一就因时间片到期而被线程函数2(FunProc2)抢占访问,然后
自减一。
这样就造成了资源数据不一致,从而产生很危险的后果。
本实验通过设置互斥信号量从而达到线程之间对共享资源的同步访问,以此还可以
实现进程同步中的读者/写者问题。
3)、由于油槽是单向通信机制,所以只能通过创建油槽服务器进程读取数据,打开
油槽客户端进程写入数据。
如果只打开油槽服务器,创建读取数据进程而没有打开
客户端就会导致服务器进入无限等代状态,造成程序崩溃。
在创建进程句柄后要记得释放句柄,不然会产生不良后果。
心
得
体
会
在了解了操作系统中进程间的通信的方式我们使用了邮槽实现了简单的进程间的通信,在实际的应用中,进程间的通信往往是十分重要的,我们可以使用其它的应用程序提供的信息,使我们自己的程序开发更为完善,在进程间的通信中,我们还可以使用管道技术,管道技术又分为命名管道和匿名管道,匿名管道是实现本机之见的进程通信,命名管道很好的解决了,客户端和服务器之间的通信,另一种实现服务器和客户端之间的通信是邮槽,通过该实验更加深入理解了操作系统的通信方式——邮槽通信以及信息通信。
真正体会从课本上学到的东西是有限了,要提高自己的技术水平,还是得实践去努力。
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)