繁体   English   中英

使用POSIX共享内存和信号量分块传输文件

[英]Transfering a file in chunks using POSIX shared memory and semaphores

全面披露:尽管这不是针对某个班级的,但它是一个简化的示例,与我之前的作业(现已通过)存在的问题有关。

考虑使用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同步功能。 是否有类似条件变量的单独过程? 还是实现这一目标的另一种简单方法?

您需要两个信号灯。 每个过程都有信号量,并向伙伴发出信号:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM