AUTOSAR_EXP_ARAComAPI的5章笔记(11)
5.4.5 轮询和事件驱动处理模式
接下来,我们探讨服务提供方同时支持事件驱动和轮询行为的情况。从服务实例(此处指骨架子类实例)的角度来看,服务消费者的请求(包括服务方法或字段的 getter/setter 调用)可能在任意时间点到来。
在纯事件驱动的设置中,通信管理会生成相应的调用事件,并将这些事件转换为对服务实现提供的服务方法的具体方法调用。
这种设置的后果显而易见:
- 对服务方法调用的响应通常会很快,因为延迟仅受一般机器负载和内在 IPC 机制延迟的限制。
- 包含服务实例的操作系统进程的上下文切换率可能会很高且不确定,从而降低整体吞吐量。
正如您所见,服务提供方的事件驱动处理模式既有优点,也有缺点。然而,我们确实通过 ara::com
支持这种处理模式。我们支持的另一种极端情况是纯轮询风格的方法。在这里,服务提供方的应用程序开发人员明确调用 ara::com
提供的 API 来明确处理一个调用事件。
通过这种方式,我们再次支持典型的 RT(实时操作系统)应用程序开发人员。他们的应用程序通常由于低抖动周期性警报而被激活。当应用程序处于活动状态时,它以非阻塞方式检查事件队列,并明确决定愿意处理自上次激活时间以来积累的哪些事件。再次强调:应用程序进程的上下文切换 / 激活仅由特定的(RT)定时器接受,异步通信事件不应导致应用程序进程激活。
那么,ara::com
如何允许应用程序开发人员区分这些处理模式呢?骨架实例的行为由其构造函数的第二个参数控制,该参数的类型为 ara::com::MethodCallProcessingMode
。
/*** 服务实现方(骨架)的请求处理模式。* * \note 平台供应商应完全按照此方式提供。*/
enum class MethodCallProcessingMode { kPoll, kEvent, kEventSingleThread };
这意味着处理模式是为整个服务实例设置的(即其所有提供的方法都将受到影响),并且在骨架实例的整个生命周期内保持固定。构造函数中的默认值设置为 kEvent
,下面将对此进行解释。
5.4.5.1 轮询模式
如果将其设置为 kPoll
,ara::com
实现将不会异步调用任何提供的服务方法!如果您想要处理下一个(假设后台有一个队列,用于存储传入的服务方法调用)挂起的服务调用,则必须在服务实例上调用以下方法:
/*** 从通信管理中获取下一个调用并执行它。* * 仅在轮询模式下可用。*/
ara::core::Future<bool> ProcessNextMethodCall();
我们使用 ara::core::Future
的机制来返回一个在未来完成的结果。这个返回的 ara::core::Future
有什么作用呢?它允许您在 “下一个请求” 被处理时得到通知。这有助于将服务方法调用一个接一个地连接起来,可能会非常有帮助。一个典型的 RT 应用程序的简单用例可能是:
- RT 应用程序被调度。
- 它调用
ProcessNextMethodCall
并使用ara::core::Future::then()
注册一个回调。 - 在与未完成请求相对应的中间件调用的服务方法完成后,回调被调用。
- 在回调中,RT 应用程序决定是否有足够的时间来处理后续的服务方法。如果是这样,它会调用另一个
ProcessNextMethodCall
。
当然,这个简单的例子假设 RT 应用程序知道其服务方法的最坏情况运行时间(及其总体时间片),但这并非不可能!如果队列中确实存在未完成的请求并且已被分派,则通信管理会将返回的 ara::core::Future
的 bool
值设置为 true
,否则将其设置为 false
。
这对于应用程序开发人员来说是一个比较舒适的指示器,即使请求队列为空,也不会重复调用 ProcessNextMethodCall
。因此,在前一个调用返回的 ara::core::Future
的结果设置为 false
后直接调用 ProcessNextMethodCall
很可能不会执行任何操作(除非在这个最小的时间框架内偶然有一个新的请求进来)。
请注意,对于基于典型操作系统的 AP 产品,轮询模式会产生影响。除了排除由通信管理事件(传入的服务方法调用)导致的进程(包含服务实现)的上下文切换外,队列的位置也存在限制,它必须收集服务方法调用请求,直到轮询服务实现消耗它们为止。
队列必须在服务提供应用程序的地址空间之外实现,或者必须位于共享内存之类的位置,以便发送方能够直接写入队列。与共享内存解决方案相比,轮询服务提供程序对下面队列位置的访问可能会带来更高的成本 / 延迟。将队列放置在服务提供程序地址空间之外的典型解决方案是:
- 内核空间:如果绑定实现使用套接字或管道机制,则写入调用的目标内核缓冲区类似于队列。在典型的操作系统中,调整 / 配置这些缓冲区的最大大小可能意味着需要重新编译内核。
- 不同绑定 / 通信管理守护应用程序的用户地址空间:在用户空间内分配的队列的缓冲区空间分配通常可以更动态 / 灵活地完成。
5.4.5.2 事件驱动模式
如果将处理模式设置为 kEvent
或 kEventSingleThread
,当服务消费者的服务调用到来时,ara::com
实现将异步将事件分派给服务方法实现。
与 kPoll
模式相反,在这里服务消费者隐式地控制 / 触发服务提供程序进程的激活及其方法调用!
那么 kEvent
和 kEventSingleThread
之间的区别是什么呢?kEvent
意味着 ara::com
实现可以同时调用服务方法实现。
这意味着对于我们的示例:如果 —— 在同一时间点 —— 来自不同服务消费者的一个对方法 Calibrate
的调用和两个对方法 Adjust
的调用到达,ara::com
实现允许从其内部线程池中获取三个线程,并同时为这两个服务方法执行这三个调用。
相反,kEventSingleThread
模式确保在服务实例上,ara::com
实现每次只调用一个服务方法。
这意味着 ara::com
实现必须为同一服务实例的传入服务方法调用事件排队,并一个接一个地分派它们。
为什么我们提供这两个变体呢?从功能的角度来看,只有 kEvent
就足够了!对于某些由于共享数据 / 一致性需求而无法同时运行的服务方法的服务实现,它可以简单地自己进行同步(例如通过 std::mutex
)!
原因是 “效率”。如果您有一个服务实例实现,它具有广泛的同步需求,即无论如何几乎会同步所有服务方法调用,那么如果通信管理从其线程池资源中 “花费”N
个线程,而这些线程在直接获得硬同步后,将 N - 1
个线程发送到睡眠状态,这将是一种完全的资源浪费。
相关文章:
AUTOSAR_EXP_ARAComAPI的5章笔记(11)
5.4.5 轮询和事件驱动处理模式 接下来,我们探讨服务提供方同时支持事件驱动和轮询行为的情况。从服务实例(此处指骨架子类实例)的角度来看,服务消费者的请求(包括服务方法或字段的 getter/setter 调用)可能…...
面经3——中和农信
今天参加了中和农信的面试,先进行60分钟的笔试,笔试完参加面试,面试官有两个人,面试了大概四十多分钟,因为没有亮点的项目,简历看起来十分单薄。现在来复盘一下。 笔试 事务ACID、事务隔离级别、乐观锁的…...

线程1(重点知识)
线程 1.线程的概念: 线程是进程中的⼀个执行单元,负责当前进程中程序的执行,⼀个进程中至少有⼀个线程 ⼀个进程中是可以有多个线程 多个线程共享同一个进程的资源,每个线程参与操作系统的统一调度 可以简单理解: 进程 进程资源…...

Python中requests模块(爬虫)基本使用
Python的requests模块是一个非常流行的HTTP库,用于发送HTTP/1.1请求。 一、模块导入 1、requests模块的下载: 使用包管理器下载,在cmd窗口,或者在项目的虚拟环境目录下: pip3 install -i https://pypi.tuna.tsingh…...
快递上门取件API接口代码
官网:快递鸟 API列表 功能功能描述应用场景超区校验接口校验该地区是否支持上门取件,以及3天内可支持的上门取件时间段。场景一:寄件人老七,选择从深圳向北极村寄快递,通过超区检验接口,提前了解到深圳寄…...
sklearn特征选取之RFE
sklearn.feature_selection.RFE 是一种递归特征消除(Recursive Feature Elimination, RFE)方法,用于通过反复训练模型和消除不重要的特征,逐步减少特征数量,最终选择最重要的特征。它是一种用于特征选择的算法…...

vue.js 展示树状结构数据,动态生成 HTML 内容
展示树状结构数据: 从 jsonData 读取树状结构的 JSON 数据,将其解析并生成 HTML 列表来展示。树状结构数据根据 id 和 label 属性组织,节点可以包含子节点 children。 展示评级信息: 从预定义的表单字段 form 中读取 arRateFlag 和…...

科技赋能安全,财谷通助力抖音小店腾飞!
在数字经济的浪潮中,短视频与直播带货已成为新时代的商业风口,抖音小店作为这一领域的佼佼者,正引领着无数小微商家踏上创业与转型的快车道。然而,随着市场的日益繁荣,如何有效管理店铺、提升运营效率、保障交易安全成…...

Redis安装教程
Redis安装详细教程 📖1.单机安装Redis✅安装Redis依赖✅上传安装包并解压✅启动🧊默认启动🧊指定配置启动🧊开机自启 📖2.Redis客户端✅Redis命令行客户端✅图形化桌面客户端🧊安装🧊建立连接 大…...
Idea集成docker实现镜像打包一键部署
1.Docker开启远程访问 #修改该Docker服务文件 vi /lib/systemd/system/docker.service#修改ExecStart这行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock将文件内的 ExecStart注释。 新增如上行。 ExecStart/usr/bin/dockerd -H fd:/…...
spring 注解 - @NotNull - 确保字段或参数值不为 null
NotNull 是 Bean Validation API(JSR 303/JSR 349)中的一个注解,用于确保一个字段或参数值不为 null。这个注解可以用于 Java 类的字段、方法的参数或者方法的返回值上,以确保在运行时这些值不为空。 使用场景 字段验证…...
408算法题leetcode--第13天
61. 旋转链表 61. 旋转链表思路:注释时间:O(n);空间:O(1) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x…...

【MySQL】表的基本查询
目录 🌈前言🌈 📁 创建Creator 📂 插入数据 📂 插入否则更新 📂 替换 📁 读取Retrieve 📂 select列 📂 where条件 📂 结果排序 📂 筛选分页结果…...

李宏毅2023机器学习HW15-Few-shot Classification
文章目录 LinkTask: Few-shot ClassificationBaselineSimple—transfer learningMedium — FO-MAMLStrong — MAML Link Kaggle Task: Few-shot Classification The Omniglot dataset background set: 30 alphabetsevaluation set: 20 alphabetsProblem setup: 5-way 1-sho…...

API安全推荐厂商瑞数信息入选IDC《中国数据安全技术发展路线图》
近日,全球领先的IT研究与咨询公司IDC发布报告《IDC TechScape:中国数据安全技术发展路线图,2024》。瑞数信息凭借其卓越的技术实力和广泛的行业应用,被IDC评选为“增量型”技术曲线API安全的推荐厂商。 IDC指出,数据安…...

1.5 计算机网络的性能指标
参考:📕深入浅出计算机网络 目录 速率 带宽 吞吐量 时延 时延带宽积 往返时间 利用率 丢包率 速率 速率是指数据的传送速率(即每秒传送多少个比特),也称为数据率(Data Rate)或比特率&am…...

【已解决】IDEA鼠标光标与黑块切换问题,亲测有效
前言 前两天我妹妹说她室友的idea光标变成黑块状了,解决不了跑来问我,这是刚入门开发者经常遇到的问题,这篇文章介绍一下这两种方式,方便刚入门的小伙伴儿们更清楚地了解idea,使用idea。 希望这篇文章能够帮助到遇到…...

记一次sql查询优化
记一次sql查询优化 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 今天测试环境发现一个问题,就是测试同事在测试的时候,发现cpu一直居高不下,然…...
str函数的模拟(包括strn函数的模拟)
首先先说这些函数引用的头文件是<string.h> 1.strlen函数 int my_strlen(char* s1) { //这里只用最难的方法 if (*s1) { return my_strlen(s1 1) 1; } else return 0; } 这里使用了递归的方法(不创建新的变量࿰…...

畅阅读微信小程序
畅阅读微信小程序 weixin051畅阅读微信小程序ssm 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用j…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...