使用 POSIX 共享内存和信号量以块的形式传输文件

Jam*_*ham 2 c semaphore pseudocode shared-memory multiprocessing

全面披露:虽然这不是针对课程的,但它是一个简化的示例,涉及我之前的作业(现已通过)中遇到的问题。

考虑使用 POSIX 共享内存在两个进程之间传输文件。生产者进程共享从文件中读取的内容,并将其按块写入共享内存区域;消费者进程从该区域读取一大块字节并将其写出(例如写入文件)。起初,我尝试了一种简单的同步方法 - 只是锁定对信号量中共享内存的访问 - 但当然,这允许单个写入/读取的多个读取/写入。

我想我已经找到了一种方法来做到这一点,即使用第二个共享内存区域,根据其当前值阻止对读取器或写入器的访问。然后,用伪代码:

before request begins:
    initialize shared memory region SHM
    initialize synchronization region SHM2 = "0"
    initialize sem

consumer:
    loop until total bytes read = file length:
        while (SHM2 == "0" [lock access to SHM2 while checking]):
            wait

        read N bytes from SHM
        write N bytes to file

        sem_wait(sem)
        set SHM2 = "0"
        sem_post(sem)

producer:
    loop until total bytes written = file length:
        while (SHM2 == "1" [lock access to SHM2 while checking]):
            wait

        read N bytes from file         
        send N bytes to shared memory

        sem_wait(sem)
        set SHM2 = "1"
        sem_post(sem)
Run Code Online (Sandbox Code Playgroud)

但这似乎不太方便。我正在尝试采取某种方法来避免在等待其他进程时旋转,也许有某种方法可以以一种我还没有理解的方式使用 POSIX 同步设施。是否有类似单独进程的条件变量之类的东西?或者另一种直接的方法来实现这一点?

use*_*697 5

您需要两个信号量。每个进程都获取信号量,并向伙伴发出信号量:

initialize sem EMPTY to 1
initialize sem FULL to 0

consumer:
    loop:
        sem_wait(FULL)
        consume data
        sem_post(EMPTY)

producer:
    loop:
        sem_wait(EMPTY)
        produce data
        sem_post(FULL)
Run Code Online (Sandbox Code Playgroud)