TCP receive_queue prequeue backlog

本文详细探讨了在TCP协议栈中数据包接收时structsock*sk被不同上下文占用的情况,包括进程上下文和软中断上下文,并分析了后备队列(backlog)、receive_queue及prequeue的作用和设计原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接收到数据包时struct sock *sk 可能被进程下上文或者中断上下文占用:

1、如果被进程上下文使占用时,软中断暂时拿不到锁,所以数据只能暂存在后备队列中(backlog),当进程上下文逻辑处理完成后会回调tcp_v4_do_rcv处理backlog队列作为补偿,具体看tcp_sendmsg 函数 release_sock的实现。

2、如果sk被软中断占用时,那么数据可能被放置到receive_queue或者prequeue,数据优先放置到prequeue中,如果prequeue满了则会放置到receive_queue中,理论上这里有一个队列就行了,但是TCP协议栈为什么要设计两个呢?其实是为了快点结束软中断数据处理流程,软中断处理函数中禁止了进程抢占和其他软中断发生,效率应该是很低下的,如果数据被放置到prequeue中,那么软中断流程很快就结束了,如果放置到receive_queue那么会有很复杂的逻辑需要处理。receive_queue队列的处理在软中断中,prequeue队列的处理则是在进程上下文中。

要实现Spring整合IBM MQ的JMS异步消息发送和同步消息接收,可以按照以下步骤来操作: 1. 在Spring配置文件中配置JmsTemplate和ConnectionFactory,并指定IBM MQ的相关连接信息。 2. 配置一个消息队列发送器和一个消息队列接收器,分别用于异步发送和同步接收消息。 3. 在消息队列发送器中,通过JmsTemplate异步发送消息到指定的队列。 4. 在消息队列接收器中,通过JmsTemplate同步接收消息,并将消息内容返回。 具体代码实现可以参考以下示例: 1. 配置JmsTemplate和ConnectionFactory ```xml <bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory"> <property name="transportType" value="1" /> <property name="hostName" value="localhost" /> <property name="port" value="1414" /> <property name="queueManager" value="QUEUE.MANAGER" /> <property name="channel" value="SYSTEM.DEF.SVRCONN" /> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jmsConnectionFactory" /> <property name="defaultDestinationName" value="SEND.QUEUE" /> <property name="pubSubDomain" value="false" /> <property name="sessionTransacted" value="true" /> </bean> ``` 2. 配置消息队列发送器和接收器 ```xml <bean id="messageSender" class="com.example.MessageSender"> <property name="jmsTemplate" ref="jmsTemplate" /> </bean> <bean id="messageReceiver" class="com.example.MessageReceiver"> <property name="jmsTemplate" ref="jmsTemplate" /> <property name="destinationName" value="RECEIVE.QUEUE" /> </bean> ``` 3. 实现消息队列发送器和接收器 ```java public class MessageSender { private JmsTemplate jmsTemplate; public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void sendMessage(final String message) { jmsTemplate.send(new MessageCreator() { public Message createMessage(Session session) throws JMSException { return session.createTextMessage(message); } }); } } public class MessageReceiver { private JmsTemplate jmsTemplate; private String destinationName; public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void setDestinationName(String destinationName) { this.destinationName = destinationName; } public String receiveMessage() { Message message = jmsTemplate.receive(destinationName); if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; try { return textMessage.getText(); } catch (JMSException e) { e.printStackTrace(); } } return null; } } ``` 通过以上步骤,就可以实现Spring整合IBM MQ的JMS异步消息发送和同步消息接收。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值