欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    操作系统进程通信共享内存课程设计.pdf

    • 资源ID:73704790       资源大小:1.12MB        全文页数:28页
    • 资源格式: PDF        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统进程通信共享内存课程设计.pdf

    精品.河南城建学院 操作系统课程设计说明书 设计题目:进程通信 专 业:计算机科学与技术 指导教师:邵国金、郭猛、薛冰 班 级:学 号:姓 名:同 组 人:计算机科学与工程系 2013 年 1 月 10 日 精品.前 言 本设计是基于课程中学到的 UNIX 系统调用,使用操作系统环境是 Red Hat Linux 9,言语开发环境是 Linux 的 GNU C 或 C+。Linux 操作系统是一个向用户开放源码的免费的类UNIX 操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在 Linux 环境下进行。这就要求大家:(1)熟悉 Linux 的操作和开发环境;(2)具有 C 语言知识(Linux 操作系统大约 90%的源码是用 C 语言编写)。我们的设计和实验将在 Windows xp 环境下,基于虚拟机软件 VMWare 软件进行安装。学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。基于共享内存的进程通信,通过在两个进程间创建一块共享内存,将共享内存块分为两部分,标示位和数据域。通过实践让我们了解了什么是共享内存通信机制,实现了程序进程间的通信。积极通过合作,完成任务。精品.目录 一、系统开发环境.-4-二、设计目的.-5-三、设计题目及要求.-6-四、总体设计.-7-1、服务器功能.-7-2、客户端功能.-8-3、文件读取功能.-9-4、界面显示函数.-10-5、组成框图:.-10-6.共享内存分配.-10-7.总体流程图.-11-五、详细设计.-12-1.主函数.-12-2.菜单显示.-13-3.服务器端:.-13-4.客户端程序:.-15-5、部分函数介绍.-17-六、调试与测试.-18-七、执行结果及分析.-19-八、源程序清单.-21-九、心得体会.-26-精品.十、参考文献.-28-一、系统开发环境 Windows Xp 系统、虚拟机上运行的 Red Hat Linux 9 系统运行环境。精品.二、设计目的 1、进一步了解什么是进程,以及创建进程的方式。2、实现 UNIX/LINUX 系统环境下的进程通信方式。3、熟练掌握 C/S 中的共享内存通信机制。4、开辟一个共享区,实现进程共享资源,互相通信。精品.三、设计题目及要求 利用 UNIX 系统提供的进程通信机制实现通信以及共享内存区的实现(1)共享存储区的创建,附接和断接 使用系统调用 shmget(),shmat(),msgdt(),shmctl(),编制一长度为 1K 的消息发送和接收的程序。1)为了便于操作和观察结果,用一个程序作为“引子”,先后 fork()两个子进程,SERVER 和 CLIENT,进行通信。SERVER 和 CLIENT 也可分别为 2 个各自独立的程序。2)SERVER 端建立一个 Key 为 375 的共享区,并将第一个字节置为-1,作为数据空的标志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,并进行处理。然后再次把它的值设为-1。如果遇到的值为 0,则视为结束信号,取消该队列,并退出 SERVER。SERVER 每接收到一次数据后显示“(server)received”。3)CLIENT 端建立一个 Key 为 375 的共享区,当共享取得第一个字节为-1时,SERVER 端空闲,可发送请求。CLIENT 随即填入 9 到 0。期间等待 Server端的再次空闲。进行完这些操作后,CLIENT 退出。CLIENT 每发送一次数据后显示“(client)sent”。精品.4)父进程在 SERVER 和 CLIENT 均退出后结束。(2)功能扩展:在 sever 端创建一个服务函数,从而形成 C/S 通讯模式 要求 SERVER 每接收到一次数据后不仅仅显示“(server)received”,而是做一些其它事情,比如读取或查询某个文件等。此功能可由设计者自己定义。四、总体设计 1.服务器功能 服务器共有四块共享内存,分别用 addr1,addr2,addr3,addr4 接收,其中 addr1 为整形指针,addr1,addr2,addr3 为结构体型指针,结构体的定义如下:Typedef strcut address Int mark;Char ch20;address;其中的 mark 成员用来作为标记为标示共享内存块的状态,-1 表示该内存块空闲,服务端可以发送服务请求,1,2,3 这分别表示服务器正在处理不同的服务请求,客精品.户端需等待。而字符数组成员 ch 则用来将各个客户端的文件中的数据放入对应的共享内存块中,与服务器交换数据。而内存块之所以既能实现客户端与服务器的通信,又能相互之间交换数据,在于shmat 函数的返回值为 void*,可以将其转化为任意类型的指针变量,该函数调用如下:Addr1=(address*)shmat(shmid1,1024,0);Addr2=(address*)shmat(shmid2,1024,0);Addr3=(address*)shmat(shmid31024,0);该四块共享内存分别用于实现接受各个客户端的服务请求,处理客户端 1,客户端 2,客户端 3 的服务请求。各个共享内存模块的处理方法基本一致,即服务器处理完客户端的请求,将 addr置为-1,即表示自己已空闲,可以接受服务请求;客户端发出服务请求后,等待服务器处理,一旦服务得到相应,将 addr 置为 1 或 2 或 3。2.客户端功能 可具体分成 3 个客户端,每个客户端均包含两块共享内存,第一块用于发送请求,其键值为各个客户端所知,第二块用于与服务器交互阶段的数据传递,其键值仅有本客户端与服务器知道。每块共享内存一包含两部分:1 用于表示共享内存块的状态的 addr1-mark,2 用于保存本客户端数据信息的数据域。其所在的进程完成自己的请求后,调用 exit(0)退出本进程。其分配共享内存块的系统的调用函数为:Shmid1=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid2=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid3=shmget(SHMKEY,1024,0777|IPC_CREAT);至于内存共享的实现方式,与服务器相同。精品.3.文件读取功能 每个客户端均设置此功能,例如购买手机卡时,客户端 1 需检索自己的文件中是否存在该号码,如果已存在,则提示客户改号码已注册,需重新选择。该功能模块涉及到:1 读文件 2 查找 对于读文件,首先需打开文件,该函数定义一个文件型指针 fp,赋值操作为:Fp=fopen(“Info.txt”,”rw+”);打开文件成功后,利用 fgetc()函数从文件中一个一个字符的读取,当遇到n时,说明一个号码已经读取完毕。其函数使用如下:C=fgetc();While(!feof(fp)If(c=n)Numberi=0;I=-1;Else Numberi=c;C=fgetc();+I;对于本系统的检索功能,因为文件的读取操作较慢,很有可能使客户端进程阻塞,故设置一个 cellnumber()函数,使其预先将本文件中的所有号码全部读出,放入一个字符型二维数组中,这样当服务器需检索文件中号码时,直接从该二维数组中检索即可,大大提高了检索速度。检索所采用的方法是顺序查找法,可以达到预定的速度要求。精品.4.界面显示函数 即系统中的 display()函数,其包含四个功能选项:1:购买手机卡;2:手机充值;3;办理网银;4:;退出本系统 前三项功能每一项对应一个客户进程,具体哪项进程由 choice 变量控制。5.组成框图:总体服务 3 个客户端 display()cellnumber()服务器端 6.共享内存分配 共享内存区 -1 由 SERVER 端开辟一块用来与各个客户端通信的共享内存区 共享内存区 精品.-1 客户 1 与服务器端共享内存区。共享内存区 客户 2 与服务器端共享内存区 共享内存区 客户 3 与服务器端共享内存区。7.总体流程图 Y N -1 -1 开始 i=fork()Cellnumber 文件信息 i=0 i=fork()精品.Y N Y N 总体流程图 1 五、详细设计 1.主函数 int main()int choice,i;char ch520;display();do printf(请选择一项功能项:n);scanf(%d,&choice);fflush(stdin);while(choice!=1&choice!=2&choice!=3&choice!=4)printf(输入有误,请重新输入:n);scanf(%d,&choice);fflush(stdin);if(choice=4)return 0;else i=0 Client()Chioice结束 Serverr 服务器 Client(1)Client(2)Client(3)精品.while(i=fork()=-1);if(!i)server(ch);else while(i=fork()=-1);if(!i)client(choice);wait(0);wait(0);while(choice!=4);return 0;2.菜单显示 void display()printf(-n);int i;for(i=1;imakr=-1;while(addr1-makr=-1);if(addr1-makr=1)c=fgetc(fp);int i=0;while(!feof(fp)if(c=n)numberi=0;i=-1;if(!strcmp(number,addr1-ch)printf(号码已经占用,请重新选择一个:n);return;else numberi=c;c=fgetc(fp);+i;printf(手机号码已选定,请缴费 100 元:n);addr1-makr=-1;精品.while(addr1-makr=-1);if(addr1-makr=2)printf(交易完成,祝您愉快!n);shmctl(shmid1,IPC_RMID,0);if(*addr=2)shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);printf(请输入您的手机号码:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=1)printf(Input Your Payroll:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=2)printf(充值完成!n);shmctl(shmid2,IPC_RMID,0);if(*addr=3)shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);printf(请输入您的身份证号:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=1)printf(请输入您的手机号码:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=2)printf(办理完成,祝您愉快!n);shmctl(shmid3,IPC_RMID,0);shmctl(shmid,IPC_RMID,0);4.客户端程序:void client(int choice)int shmid1,shmid2,shmid3;精品.int payroll;char ch120,ch250;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);while(*addr!=-1);if(choice=1)*addr=1;shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);while(addr1-makr!=-1);scanf(%s,addr1-ch);addr1-makr=1;while(addr1-makr!=-1);printf(已缴费 100 元!n);addr1-makr=2;if(choice=2)*addr=2;shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);while(addr2-makr!=-1);scanf(%s,ch1);addr2-makr=1;while(addr2-makr!=-1);scanf(%d,&payroll);addr2-makr=2;if(choice=3)*addr=3;shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);while(addr3-makr!=-1);scanf(%s,ch1);addr3-makr=1;while(addr3-makr!=-1);scanf(%s,ch2);addr3-makr=2;精品.5.部分函数介绍 1.int fork()创建一个新进程。用法:int fork()其中返回 int 取值意义如下:0:创建子进程,从子进程返回的 id 值 0:从父进程返回的子进程 id 值-1:创建失败 2.int shmget(key,size,shmflg|IPC_CREAT)头文件:#include#include 参数定义:key:为申请共享内存的标示符;size:为申请共享内存的大小;shmflg:用户设置的标识或访问方式,与消息缓冲 shmget 中的含义相同,这实验中可以使用 0777|IPC_CREAT,表示任意进程可读可写。IPC_CREAT:当 shmflg&IPC_CREAT 为真时,如果内核中不存在键值与 key 相等的共性内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符。利用此系统调用在内存中开辟一块共享区。用法:int shmget()返回值为开辟出来共享内存的标号。3.void*shmat(int shmid,const void*shmaddr,int shmflg)头文件:#include#include 参数定义:shmid:表示申请共享内存空间的标示符。shmaddr:指定共享内存出现在进程内存地址什么位置,直接指定为 NULL 让内核自己决定一个合适的位置 shmflg:SHM_RDONLY 为只读模式,其他为读写模式。返回值为共享内存的首地址。4.int shmctl(int shmid,int cmd,strucr shmid_ds*buf)头文件:#include#include 参数定义:精品.Shmid:共享内存标识符。该系统使用了内存共享机制来实现进程之间的通信与数据传递,其包含四个大的功能模块:1:服务器功能,即 server 函数;2:客户端功能,即 client 函数;3:读取各个客户端文件功能,即 cellnumber 函数 4:界面显示函数,即 display 函数 下面是每个功能模块的具体分析过程:六、调试与测试 任务一编译方法:编译:cc liulong.c 执行:./a.out 任务二编译方法是:编译:cc o endend endend.c 执行./endend 运行时,根据选择不同的功能选项来启动不同客户端,而 server 端作为服务器仍将继续运行,你再次启动 client 来请求服务。精品.七、执行结果及分析 当选这功能项 1 时,客户 1 与服务器建立共享区来建立通信,这里用到了和文件相关联,在当前目录下有一个文件,文件中有五条电话号码记录,当客户选择自己的电话号码是如果输入的电话号码和文件中五条记录中的一项相同就会弹出“手机号码已存在,请重新选择!”这句话也就是说该号码已被别人注册并使用,提示用户重新选择自己的号码。精品.通过编译后进入该程序,如果输入的不是当前功能项提供的几个选项会弹出来错误提示,提示用户重新输入想要选择的功能项,这里用到了 fflush(stdin)这个函数,当输入有误时会清除掉缓冲区中的数据以便于用户再次输入。当选择功能项 2 时,这是一个为用户充值的服务,选中该功能项时客户端2 会和服务器建立基于共享内存的通信,这是用户可以输入自己的电话号码,这里也可以关联到文件,可以在当前目录下创建一个文件,其中记录了用户的电话号码和对应的余额,根据这个来为用户提供要充值的服务。当选择功能项 3 时,这是一个为用户办理网银的服务,该功能也可以和文件相关联,在当前目录下建立一个文件其中记录了用户的电话号码、身份证号,根据用户输入共享区的数据,把共享区中的数据取出和文件中已存在的数据作比较,可以得到是否该用户已存在进而来为用户提供办理网银的服务。精品.当各项功能服务都不需要时,可以选择退出本系统,选择功能项 4 时自动退出本服务系统。八、源程序清单#include#include 精品.#include#include#include#define SHMKEY 75#define CLIENTONE 100#define CLIENTTWO 150#define CLIENTTHREE 200 void cellnumber(char phonenumber520)int j=0;char c;char number20=0;FILE*fp;if(fp=fopen(Info.txt,rw+)=NULL)printf(文件未能打开!n);return;c=fgetc(fp);int i=0;while(!feof(fp)if(c=n)numberi=0;i=-1;strcpy(phonenumberj,number);j+;else numberi=c;c=fgetc(fp);+i;typedef struct addre int makr;char ch50;addre;addre*addr1,*addr2,*addr3;int shmid,*addr;精品.void server(char phonenumber520)char ch120;int shmid1,shmid2,shmid3,shmid4;int i;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);*addr=-1;while(*addr=-1);if(*addr=1)shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);printf(请输入您喜欢的手机号码:n);addr1-makr=-1;while(addr1-makr=-1);if(addr1-makr=1)for(i=0;ich)printf(手机号码已存在,请重新选择!n);return;printf(手机号码已选定,请缴费 100 元:n);addr1-makr=-1;while(addr1-makr=-1);if(addr1-makr=2)printf(交易完成,祝您愉快!n);shmctl(shmid1,IPC_RMID,0);if(*addr=2)shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);printf(请输入您的手机号码:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=1)printf(Input Your Payroll:n);addr2-makr=-1;精品.while(addr2-makr=-1);if(addr2-makr=2)printf(充值完成!n);shmctl(shmid2,IPC_RMID,0);if(*addr=3)shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);printf(请输入您的身份证号:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=1)printf(请输入您的手机号码:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=2)printf(办理完成,祝您愉快!n);shmctl(shmid3,IPC_RMID,0);shmctl(shmid,IPC_RMID,0);void client(int choice)int shmid1,shmid2,shmid3;int payroll;char ch120,ch250;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);while(*addr!=-1);if(choice=1)*addr=1;shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);while(addr1-makr!=-1);scanf(%s,addr1-ch);addr1-makr=1;while(addr1-makr!=-1);printf(已缴费 100 元!n);addr1-makr=2;if(choice=2)精品.*addr=2;shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);while(addr2-makr!=-1);scanf(%s,ch1);addr2-makr=1;while(addr2-makr!=-1);scanf(%d,&payroll);addr2-makr=2;if(choice=3)*addr=3;shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);while(addr3-makr!=-1);scanf(%s,ch1);addr3-makr=1;while(addr3-makr!=-1);scanf(%s,ch2);addr3-makr=2;exit(0);void display()printf(-n);int i;for(i=1;i=15;+i)if(i=3|i=6|i=9|i=12)if(i=3)printf(|1.购买手机卡:|n);if(i=6)printf(|2.手机充值:|n);if(i=9)printf(|3.办理网银:|n);if(i=12)printf(|4.退出本系统:|n);else printf(|n);精品.printf(-n);int main()int choice,i;char ch520;display();do printf(请选择一项功能项:n);scanf(%d,&choice);fflush(stdin);while(choice!=1&choice!=2&choice!=3&choice!=4)printf(输入有误,请重新输入:n);scanf(%d,&choice);fflush(stdin);if(choice=4)return 0;else while(i=fork()=-1);if(!i)server(ch);else while(i=fork()=-1);if(!i)client(choice);wait(0);wait(0);while(choice!=4);return 0;九、心得体会 此次课程设计要求设置一个内存共享区,供服务器端和客户端使用,然后利用通道使服务器和多个客户端应答式的进行通信,我们还在 linux 中建立了文件操作,用于保存客户端的信息数据,在通信的过程中,还要从文件中读写数据。精品.刚开始接触 linux 系统,我们感觉无从下手,还好实验前有一节专门的实验辅导,老师给我们指明了大致方向,还教授了一些试验中可能会遇到的问题,这样的突击扫盲对我们意义很大,从中一下子学到了不少东西,同时感觉到 linux 的强大,和它原始的非凡意义。现在很多人都习惯使用 windows 系统,相比较而言windows 的桌面操作更简单明了,实用性很强,但作为计算机专业的学生,我们要求全面理解操作系统的功能实现以及内部原理。通过对试验的操作,我们对课本上得知识得到了巩固和提高,对操作系统文件操作,进程通信,内存共享等功能有了较全面的理解。在 linux 环境中编译程序,建立共享区,建立文件,这些都是之前很陌生的东西,但是短短一周下来,我们把这些困难都克服了。通过网络、书本,请教老师、同学,当然团队合作很重要。通过这次课程设计,我感觉到了,编程还是很有趣的一件事情,这次设计充分锻炼了我的动手能力,思维能力,设计能力,更重要的是合作精神,大家基础都有点差,但可以主动找不足,主动查询资料,询问同学和请教老师,充分体现了新时代新青年的团结和探索精神。精品.十、参考文献 1、汤小丹,梁红兵编著 计算机操作系统(第三版)西安电子科技大学出版社,2007 2、严蔚敏,吴伟民编著 数据结构(C 语言版)清华大学出版社,2007 3、张尧学,史美林,张高编著 计算机操作系统教程(第 3 版)清华大学出版社,2006

    注意事项

    本文(操作系统进程通信共享内存课程设计.pdf)为本站会员(l***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开