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

时间:2017-04-06 16:23:22

标签: c multiprocessing semaphore shared-memory pseudocode

完全披露:虽然这不是一个课程,但它是一个简单的例子,与我之前的作业(现在通过)有关。

考虑使用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)

但这似乎很笨拙。我试图在某种程度上努力避免在等待其他过程时旋转,也许还有一些方法可以使用POSIX同步设备,这种方式我还没有理解。是否有类似于单独进程的条件变量?还是另一种直截了当的方法来实现这个目标?

1 个答案:

答案 0 :(得分:2)

你需要两个信号量。每个进程都使用信号量,并向合作伙伴发出信号:

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)