浙江大学城市学院实验报告
课程名称 操作系统原理实验
实验项目名称 实验六 进程通信——共享内存 学生姓名 周健 专业班级 计算0907 学号 30901338 实验成绩 指导老师(签名 ) 日期
注意: ? ?
务请保存好各自的源代码,已备后用。
完成本实验后,将实验项目文件和实验报告,压缩为rar文件,上传ftp。如没有个人文件夹,请按学号_姓名格式建立。
ftp://huommupload:123456@10.66.28.222:2007/upload ?
文件名为:学号_日期_实验XX,如30801001_20100305_实验01
一. 实验目的和要求
1. 了解Linux系统的进程间通信机构(IPC); 2. 理解Linux关于共享内存的概念;
3. 掌握Linux支持进程间内存共享的系统调用; 4. 巩固进程同步概念。 二、实验内容
实现利用共享内存机制的生产者/消费者问题的解决方案。生产者将数据写入共享内存。消费者从共享内存取出数据,在屏幕输出。 三、实验步骤
1、运行实验指导书给出的代码,回答问题。
1) 编译连接通过后,运行程序并查看运行结果。(用截图方式说明)
2) 请说明Syetem V使用共享内存的步骤,并分别说明系统调用shmget(),shmat(),shmdt()和shmctl()的功能和使用方法。
System V要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget()
2.允许本进程使用某块共享内存 shmat() 3.数据写入/读出
4.禁止本进程使用这块共享内存 shmdt()
5.删除这块共享内存 shmctl()或者命令行下ipcrm。
使用方法:int shmget( key_t shmkey , int shmsiz , int flag ),key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。如不是,可用fork()算出来一个标识符使用。 int shmsiz 是这块内存的大小.
int flag 是这块内存的模式(mode)以及权限标识。
作用:shmget()是用来开辟/指向一块共享内存的函数。
使用方法:void *shmat( int shmid , char *shmaddr , int shmflag );int shmid是那块共享内
存的ID。
char *shmaddr是共享内存的起始地址
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
作用:shmat( )是用来允许本进程访问一块共享内存的函数。
使用方法:int shmdt( char *shmaddr );char *shmaddr是那块共享内存的起始地址。 作用:shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。
使用方法:int shmctl( int shmid , int cmd , struct shmid_ds *buf );int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:IPC_STAT 得到共享内存的状态,IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存。
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。 作用:shmctl实现对共享内存区域的控制操作。
3) 阐述共享内存相对于其他进程间通信方法(信号,消息队列,管道)的优缺点。
优点:共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,
所以是最快的一种进程间通信机制。(对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。)采用共享内存的通信方式效率是非常高的。
缺点:进程间需要共享的数据被放在一个叫做IPC共享内存区域的地方,所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去。 由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以(进程使用临界资源需要同步)。
2、编写程序:试编写程序,实现父进程和子进程通过共享内存实现信息的交换。例如:子进程先将子进程号写入共享内存,父进程将内容读出并显示。随后,父进程将父进程号写入同一块共享内存,要求子进程读出并显示。
四、讨论、心得
记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。