实验报告六..docVIP

  • 109
  • 0
  • 约5.29千字
  • 约 7页
  • 2017-01-12 发布于重庆
  • 举报
实验报告六.

实 验 报 告 课程名称: 计算机操作系统 实验名称: Linux进程间的通信实验 班 级: 姓 名: 学 号: 实验日期: 2013-06-13 实验目的: 掌握共享存储区的进程通信方法 实验要求: (1)使用shmget()函数创建共享存储区; (2)使用shmat()函数将一个共享区附接到进程虚地址空间; (3)使用shmctl()函数对共享区进行读写操作; (4)编制一长度为1k的共享存储区发送和接收的程序。 三、实验仪器及平台: 台式计算机,centos6.2 四、实验步骤、内容: 1) 步骤 通过两个程序建立存储区,在两个程序之间实现类似聊天程序的聊天过程。 关于共享存储区 共享存储区(Share Memory)是UNIX系统中通信速度最高的一种通信机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个进程的虚地址空间中。 一个进程的虚地址空间中又可连接多个共享存储区,每个共享存储区都有自己的名字 当进程间欲利用共享存储区进行通信时,必须先在主存中建立一共享存储区,然后将它附接到自己的虚地址空间上 此后,进程对该区的访问操作,与对其虚地址空间的其它部分的操作完全相同。 进程之间可通过对共享存储区中数据的读、写来进行直接通信 2) 程序说明 共享存储区机制只为进程提供了用于实现通信的共享存储区和对共享存储区进行操作的手段,然而并未提供对该区进行互斥访问及进程同步的措施 当用户需要使用该机制时,必须自己设置同步和互斥措施才能保证实现正确的通信 为了便于操作和观察结果,用一个程序作为“引子“,先后fork()两个子进程,server和client,进行通信。 server端建立一个key为75的共享区,并将第一个字节置为-1,作为数据空的标志。等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,进行处理。然后再次把它的值设为-1,如果遇到的值为0,则视为为结束信号,取消该队列,并退出server。server每接收到一次数据后显示“(server)received”。 client端建立一个key为75的共享区,当共享取得第一个字节为-1时,server端空闲,可发送请求。client随即填入9到0。期间等待 server 端的再次空闲。进行完这些操作后,client退出。client每发送一次数据后显示“(client)sent”。 父进程在server和client均退出后结束。 3) 运行和显示 五、实验结果: 对于课件中说明的延迟,是程序设计的问题。当client端发送了数据后,并没有任何措施通知server端数据已经发出,需要由client的查询才能感知。此时,client端并没有放弃系统的控制权,仍然占用CPU的时间片。只有当系统进行调度时,切换到了server进程,再进行应答。这个问题,也同样存在于server端到client的应答过程中。 六、实验心得: 在程序执行结束之后需要删除共享区,可以用shmctl函数实现。 shmat返回的地址是可变的,没有标准规定它返回固定地址;不同的进程地址空间分布不同,所以shmat返回地址一般是不同的。 七、程序附录: /*实现创建共享内存,并写入消息*/ #includestdlib.h #includestdio.h #includestring.h #includeerrno.h #includeunistd.h #includesys/types.h #includesys/ipc.h #includesys/msg.h #define MAX_TEXT 512 struct mform{ long int mtype; char mtext[MAX_TEXT]; }; /*定义了消息的结构*/ int main() { int running1=1; /*running为消息发送结束标志*/ struct mform msg1; int msgid1; char buffer1[BUFSIZ]; msgid1=msgget((key_t)1234,0666|IPC_CREAT); /*建立消息队列

文档评论(0)

1亿VIP精品文档

相关文档