当两个或多个进程(应用程序)等待将数据放入同一个缓冲区时,是不是保证顺序?

Posted

技术标签:

【中文标题】当两个或多个进程(应用程序)等待将数据放入同一个缓冲区时,是不是保证顺序?【英文标题】:Is order guaranteed when two or more processes (apps) are waiting to put data in the same buffer?当两个或多个进程(应用程序)等待将数据放入同一个缓冲区时,是否保证顺序? 【发布时间】:2021-12-27 00:59:59 【问题描述】:

我的项目包含 2 个不同的客户端,它们都在同一台机器上向服务器发送消息。

所有组件都有 GUI。当我们点击客户端 GUI 中的按钮时,它们开始发送消息。

服务器接收到这些消息并向缓冲区发送一条消息,告诉客户端他们不能在缓冲区中写入的缓冲区,因此客户端进入睡眠状态。

当两个客户端都在等待服务器发送“available”消息时,是否可以保证顺序?我所说的顺序是指我们首先点击发送的那个是第一个实际发送消息的那个。

客户端每次检查缓冲区时都会休眠 1 毫秒,这是一条不可用的消息。

【问题讨论】:

您应该包含一些代码。为什么要睡1ms?很多套接字/客户端 io 阻塞。你期望同步有多好?假设 A 比 B 稍早点击,但 B 的点击被服务器稍早收到。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

我在这个答案中假设客户端是不同的进程而不是 1 个多线程 Java 程序。

您需要在进程之间进行一些通信以保证顺序。您有几个因素会影响时间:客户端检查缓冲区的时间、用户单击的时间以及 O/S 碰巧安排客户端将其消息添加到缓冲区的顺序(大概是 FIFO 队列的结构)。

实现此目的的一种(相对繁重的)方法是使用互斥信号量(即由操作系统或其他应用程序维护的信号量,而不是在 JVM 中)。当用户单击时,客户端将获取一个互斥信号量,并且在将相关消息添加到队列之前不会释放它。这将保证消息按照用户点击的顺序结束。

有各种第三方库以相对可移植的方式包装 O/S 信号量。

【讨论】:

是的,它们都是不同的过程。感谢您的回复,它实际上会起作用,但这是我大学的一个项目,他们不允许我们使用线程或信号量。客户发送由我们学生定义的结构化消息。我们可以根据需要添加任意数量的标志。我只是想不出任何可以保证秩序的东西。我尝试了一些方法,但它不允许我连续从同一个客户端发送 2 条消息,我必须先从另一个客户端发送一条消息,然后再发送其他客户端的消息 您是否考虑过在消息中添加时间戳?然后服务器可以使用优先队列按时间顺序而不是到达顺序进行处理。它不能保证顺序,因为服务器可以在将较早的消息添加到队列之前处理消息。但稍有延迟,您就不太可能出现乱序处理。 @MiguelLeitão 如果您的三个进程都是单线程的,那么听起来您不需要任何同步。客户端 A 联系服务器,他们开始通信。客户端 B 只是等待客户端 A 完成,服务器可以接受另一个连接。 @matt 客户端 B 如何知道客户端 A 正在与服务器通信?你的意思是等到缓冲区为空?这似乎违背了拥有消息队列的目的。 @sprinter 什么消息队列?如果他们是单线程的并且他们需要维护秩序,那么在客户端 A 完成之前,客户端 B 的连接不会被接受。我在这里发表评论,不是因为你的想法,而是因为他们对你的想法的回应。

以上是关于当两个或多个进程(应用程序)等待将数据放入同一个缓冲区时,是不是保证顺序?的主要内容,如果未能解决你的问题,请参考以下文章

linux进程D状态_转

进程通过内核缓存区请求设备I/O的一些事情

51单片机做串口通信接收缓存区没反应

操作系统第五篇死锁

怎么用C语言实现多级反馈队列调度算法?

查看哪个进程占用buffer cache 多