使用 POSIX 共享内存和信号量分块传输文件
Transfering a file in chunks using POSIX shared memory and semaphores
完全披露:虽然这不是 class,但它是一个简化的示例,涉及我在较早的作业(现已通过)中遇到的问题。
考虑使用 POSIX 共享内存在两个进程之间传输文件。生产者进程共享从文件中读取数据并将其按块写入共享内存区域;消费者进程从该区域读取一大块字节并将其写出(例如写入文件)。起初我尝试了一种简单的同步方法——只是在信号量中锁定对共享内存的访问——当然这允许多个 reads/writes 用于单个 write/read.
我想我已经找到了一种方法,通过使用第二个共享内存区域来阻止对 reader 或 writer 的访问,具体取决于其当前值。然后,在伪代码中:
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)
完全披露:虽然这不是 class,但它是一个简化的示例,涉及我在较早的作业(现已通过)中遇到的问题。
考虑使用 POSIX 共享内存在两个进程之间传输文件。生产者进程共享从文件中读取数据并将其按块写入共享内存区域;消费者进程从该区域读取一大块字节并将其写出(例如写入文件)。起初我尝试了一种简单的同步方法——只是在信号量中锁定对共享内存的访问——当然这允许多个 reads/writes 用于单个 write/read.
我想我已经找到了一种方法,通过使用第二个共享内存区域来阻止对 reader 或 writer 的访问,具体取决于其当前值。然后,在伪代码中:
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)