【问题标题】:Transfering a file in chunks using POSIX shared memory and semaphores使用 POSIX 共享内存和信号量以块的形式传输文件
【发布时间】:2017-09-01 19:27:45
【问题描述】:

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

考虑使用 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 同步工具。对于单独的进程,是否有类似条件变量的东西?还是另一种直接的方法?

【问题讨论】:

    标签: c multiprocessing semaphore shared-memory pseudocode


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 啊啊啊。我怎么可能没有看到呢?谢谢。
    • 好吧,稍微备份一下。使用这种设计,是什么导致(比如说)生产者等到消费者准备好?如果消费者从不尝试锁定 EMPTY 信号量,那么它不能不受阻碍地继续吗?
    • @JamesCunningham Consumer 将在 FULL 时被阻塞,直到生产者填满缓冲区。
    • 请原谅我吸收缓慢。假设消费者正在阻止 FULL。生产者有 EMPTY,产生数据,并发布 FULL。但是,由于没有其他人在等待 EMPTY,理论上生产者不能在消费者醒来和有机会消费之前再进行一次写入吗?
    • 回复我的上一条评论……不,制片人不能再写了。第一次等待后 EMPTY = 0;当它再次等待 EMPTY = -1 时,它会阻塞。所以一切都很好,感谢@user58697!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多