簡體   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