进程同步与通信:共享存储系统调用详解

需积分: 25 0 下载量 79 浏览量 更新于2024-08-25 收藏 11.83MB PPT 举报
"这篇文档主要讨论了在操作系统中与共享存储相关的系统调用以及进程同步的概念,通过举例说明了不正确同步可能导致的问题。" 在操作系统中,进程间通信(IPC,Inter-Process Communication)和进程同步是确保多进程协同工作的重要机制。共享存储是一种常见的IPC方式,它允许多个进程访问同一块内存区域。本篇文档提到了三个关键的系统调用来管理和操作共享存储: 1. `shmget(key,size,permflags)`:这个系统调用用于创建或者获取一个共享内存段。`key`是一个键值用于标识共享内存,`size`指定内存段的大小,`permflags`设置权限标志。 2. `shmat(shm-id,daddr,shmflags)`:此调用将共享内存段映射到调用进程的地址空间。`shm-id`是共享内存段的ID,`daddr`是可选的内存地址,`shmflags`指定了附加选项。 3. `shmdt(memptr)`:当不再需要共享内存时,使用`shmdt`来解除内存段的映射。`memptr`是共享内存段的指针。 4. `shmctl(shm-id,command,&shm-stat)`:这个系统调用提供了更高级的控制功能,如删除共享内存、修改其属性等。`command`参数可以指定不同的控制命令,`&shm-stat`是一个结构体,用于传递或接收关于共享内存的状态信息。 进程同步是为了避免上述例子中出现的与时间有关的错误,例如: - **结果不唯一**:在机票售卖问题中,两个并发的售票进程(T1和T2)可能会同时销售同一张票,导致数据一致性问题。这可以通过使用同步原语(如互斥锁、信号量)来避免,确保在任何时候只有一个进程可以修改票务库存。 - **永远等待**:在主存管理问题中,如果进程在申请主存时没有正确同步,可能会陷入永远等待的状态。例如,一个进程在检查主存容量后被中断,而此时另一个进程释放了主存,但第一个进程未能及时感知到。为了避免这种情况,需要使用条件变量或者其他的同步机制来确保申请主存的进程在等待时能被正确唤醒。 进程同步的目标是在并发环境下保证程序的正确性,同时尽可能减少同步开销。常见的同步机制包括互斥锁、信号量、条件变量、事件标志等。它们可以用来控制对共享资源的访问,防止竞态条件(race condition)和死锁(deadlock),确保并发执行的结果是确定且无误的。操作系统提供了这些工具,使得程序员能够编写出安全的多线程和多进程应用程序。