[英]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.