【问题标题】:Using shared memory and semaphores with multiple clients对多个客户端使用共享内存和信号量
【发布时间】:2023-03-03 11:27:01
【问题描述】:

我在 Linux 上使用 C。我需要构建两个使用共享内存和信号量进行通信的程序。

其中一个程序必须用作服务器(一次只能一个),另一个程序必须用作客户端(一次任意数量)。通信应遵循以下模式:

 Client1 -> Server (Client1 writes to ShM, Server reads it)  
 Client1 <- Server  
 Client2 -> Server  
 Client2 <- Server  

我知道如何在两个进程之间使用共享内存和信号量,但如果有未定义数量的进程想要通信,我不知道如何使用它们。 我曾考虑为每个客户端使用共享内存块,但我必须交换密钥并通知服务器有新客户端。所以这并不能解决问题。

【问题讨论】:

    标签: c client-server semaphore shared-memory


    【解决方案1】:

    如果您只想为所有客户端使用一个共享内存块,这意味着在任何给定时间,只有一个客户端可以与服务器通信,这可能是一个性能/安全问题。如果一个客户端获取了信号量并且从不释放它会怎样。

    如果所有客户端都受信任并且性能不是问题,那么您的客户端需要获取信号量,如果不能,它们可以阻止或旋转信号量。假设您将信号量初始化为 1,然后每个客户端将尝试使用类似 test_and_set() 之类的东西来原子化 down()。如果 test_and_set() 返回 1,则表示操作成功,客户端可以与服务器通信。如果失败,则客户端可以旋转该值,直到它再次变为 1,然后重试。

    此解决方案是您可以使用的最低要求。它存在我上面提到的问题,并且还会导致客户端旋转(浪费 cpu),不能保证公平、饥饿等。您最好使用可以实际进入睡眠状态的互斥锁。

    【讨论】:

    • 好的,我正在使用一个共享内存和 3 个信号量(clsem 1、sersem 0、anssem 0)来实现请求-应答协议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多