【问题标题】:Another process and thread question另一个进程和线程问题
【发布时间】:2011-06-04 04:02:12
【问题描述】:

这个问题与Many processes executed by one threadSocket server or file server implementation using multiple threads: concept not clear有关。

我仍然不清楚一些事情。现在套接字服务器或文件服务器的客户端和服务器不必在不同的机器上(当然也可以)。

服务器收到的请求来自不同的进程,但它们由线程处理(比如每个进程一个),并且这些任务线程属于不同的进程(服务器进程)。我感到困惑的是,来自不同进程的调用如何由单个进程的线程处理,并且这些线程使用“共享内存”架构进行通信,这种架构非常“线程”,与“进程”非常不同

谢谢

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

    一些简单的基础工作。您的服务器进程包含一个或多个线程来处理来自任意数量的客户端进程的请求。客户端和服务器可以在相同或不同的机器上。客户端和服务器通过套接字“连接”,这些套接字用于将请求从客户端发送到服务器。处理完请求后,将使用相同的套接字向客户端提供响应。每个客户端都将与服务器建立唯一的连接。

    如上所述,实现服务器的方法有很多种。一种可能性是服务器有一个线程使用 select() 处理套接字。让我们称之为主线程。服务器进程也将有几个线程负责处理请求和响应客户端。让我们调用这些工作线程。

    当主线程从其客户端的套接字之一接收到消息时,主线程将接受此请求并将其交给工作线程之一进行处理。工作线程将接受该请求并对其进行处理,然后使用原始套接字进行响应。

    此服务器模型使用生产者/消费者模型,其中主线程是生产者(因为它从套接字接收请求并产生需要处理的工作),消费者是工作线程。

    实现这种类型的服务器存在一些挑战,所有这些都在各种数据结构和算法文本中记录和讨论,其中最重要的是:

    • 主线程和工作线程如何通信?
    • 如何保护不同线程共享的数据不被同时修改?
    • 如何选择应由哪个 Worker 线程处理请求?

    我希望这会有所帮助。

    【讨论】:

    • @Lou...谢谢。这绝对有帮助。如果您能帮助我解决以下问题,将不胜感激:假设我有一个主线程 A 监听来自应用程序进程(如 open()、read()、write() 等)的文件系统调用。A 检查调用进程 ID 并分配处理对其中一个工作线程的系统调用的任务。现在我已经对原始 glibc 系统调用进行了包装,还添加了一些我自己的。现在,主线程 A 应该在哪里监听系统调用?
    • @Juggler... 听起来你在谈论内核线程。我这么说的原因是服务器处理来自它的客户端的通过套接字进入的请求不知道(也不关心)客户端的 pid 是什么。请澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多