精品文档
年级 组号 实验 名称 11级 12组 专 业 实验室 计算机科学与技术 9#205 班级 日期 五班 2014/05/17 实验二、 进程控制与通信管理 分项内容 实验级别 实 验 内 容 1、Linux 系统常用进程管理命令的使用 2、Linux 系统常用进程创建与管理的系统调用 3、Windows平台常用进线程控制API 4、进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭) 5、简单进程通信(管道、消息缓冲、邮件槽等) 小 组 成 员 姓名 学号 组内分工 独立完成实验二(1) 独立完成实验二(2) 独立完成实验二(3) 独立完成实验二(4) 独立完成实验二(5) 操作系统观察级 原码阅读与系统编程级 原码阅读与系统编程级 码阅读与系统编程级 (原码阅读与系统编程级) 自我评分 良好 良好 良好 良好 良好 教师评分 小 组 成 绩 评 定 教师签名:
年 月 日 .
精品文档
1、Linux 系统常用进程管理命令的使用 2、Linux 系统常用进程创建与管理的系统实验调用 3、Windows平台常用进线程控制API 4、进程同步与互斥控制 5、简单进程分项1 通信 实 验 目 的 一、实验目的: 1、加深对进程概念的理解,明确进程和程序的区别。 2、进一步认识并发执行的实质。 3、分析进程争用资源的现象,学习解决进程互斥的方法。 实 验 要 求 具体题目:进程创建、进程控制 系统平台:Linux/Windows操作系统 二、实验原理 1. Linux 系统常用进程管理命令 (1)at命令:定时运行命令 让系统在两天后的17:30执行文件data中指定的作业,使用命令: #at -f data 15:30 +2 days (2)bg命令后台运行命令 如果要将一个大目录的文件进行排序后,将结果输入到一个文件中,可以使用命令: 实 验 原 理 步 骤 ( 算 法 流 程 ) #du -a / | sort -rn > /tmp/du.sorted (3)Fg挂起程序 使用fg命令时,要加入后台任务号码,如果不加任何号码,则所变动的均是当前任 务。 #du -a / | sort -rn > /tmp/du.sorted &[1] 237 #fg 1 (4) Jobs显示后台程序 先把两个进程放在系统后台运行,然后使用jobs命令查看后台任务的执行情况: #du -a /etc > user.data & [1] 233 # find / -name core -type f -ls > core.data & [2] 234 #jobs -l [1] + 237 Running du -a /etc > user.data [2] - 238 Running find / -name core -type f -ls > core.data (5)kill命令杀掉进程 .
精品文档
命令执行过程如果出错,用户可用\来结束任务。对于在后台运行的进程, 可以使用kill命令终止: #du -a / | sort -rn > /tmp/du.sorted & [1] 237 #kill 237 (6)nice命令改变权限优先级 将ls命令的优先序加1并执行,将结果输入文件1.txt: # nice -n 1 ls >1.txt (7)renice命令修改优先级 将进程PID为987及32的进程与进程拥有者为daemon及root的优先级别号加1: #renice +1 987 -u daemon root -p 32 (8)sleep命令暂停进程 下面的命令使进程先暂停60秒,然后查看哪个用户登录到系统中: #sleep 60; who 2、进程同步与互斥控制(数据同步),原理如下: (1)、设置全局变量:int ticket=100;互斥量:HANDLE hMutex; (2)、创建互斥信号量ticket:hMutex=CreateMutex(NULL,TRUE,\ (3)、用WaitForSingleObject(hMutex,INFINITE);捕获互斥信号量hMutex (4)、用ReleaseMutex(hMutex);释放互斥量的使用权 3、通过邮件槽实现简单进程通信,原理如下: (1)、油槽服务器: 1)hMailslot=CreateMailslot(\ MAILSLOT_WAIT_FOREVER,NULL);//创建一个邮路。 2)ReadFile(hMailslot,buf,100,&dwRead,NULL);//读取邮路数据 3)CloseHandle(hMailslot);//关闭油槽 (2)、油槽客户端: 1)hMailslot=CreateFile(\ FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //创建油槽文件 2)WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL);//写入数据 3)CloseHandle(hMailslot);//关闭油槽 实验源代码如下: 1、进程同步与互斥控制(数据同步): #include \#include
精品文档
DWORD WINAPI Fun1Proc(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject(hMutex,INFINITE); if(ticket>0) { cout<<\ } else break; ReleaseMutex(hMutex); } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while(TRUE) { WaitForSingleObject(hMutex,INFINITE); if(ticket>0) { cout<<\ } else break; ReleaseMutex(hMutex); } return 0; } int _tmain(int argc, _TCHAR* argv[]) { HANDLE hTread1; HANDLE hTread2; hTread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hTread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hTread1); CloseHandle(hTread2); hMutex=CreateMutex(NULL,TRUE,\ if(hMutex) { if(ERROR_ALREADY_EXISTS==GetLastError()) { .
精品文档
cout<<\ return 0; } } ReleaseMutex(hMutex); ReleaseMutex(hMutex); Sleep(10000); return 0; } 2、邮件槽进程通信: 1)油槽服务器:(关键代码段) void C油槽客户端Dlg::OnSend() { // TODO: 在此添加控件通知处理程序代码 HANDLE hMailslot; hMailslot=CreateFile(\READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(INVALID_HANDLE_VALUE==hMailslot) { MessageBox(\打开油槽失败!\ return; } CString str; char buf[100]; m_edit.GetWindowText(str); strcpy_s(buf,str); DWORD dwWrite; if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL)) { MessageBox(\写入数据失败!\ CloseHandle(hMailslot); return; } CloseHandle(hMailslot); } 2)油槽客户端:(关键代码段) void C油槽客户端Dlg::OnSend() { // TODO: 在此添加控件通知处理程序代码 HANDLE hMailslot; hMailslot=CreateFile(\.