漫谈QNX(架构/进程,线程,同步,进程间通信IPC)

2023-05-16

(1)架构

说起Blackberry的QNX操作系统, 想必大家都听说过,但到底为什么QNX能如此有名?难道微软的Windows和Linux都不能与之抗衡?

美国NASA的太空接驳飞船也使用QNX操作系统

QNX采用微内核结构,也就是说,内核非常非常非常小。这样一方面启动速度非常快,另一方面安全性稳定性大大提高。

QNX构架是有一个微型内核,然后又包含许多相关进程。这样的好处是,即使有一个进程出错,也不会影响内核。

各个服务进程以及应用进程之间通过内部进程通信IPC的方式进行沟通,如下图:

QNX构架

那什么是进程(pid)呢?如下图:

Process的结构

进程包含自己的一些资源,比如说ID, 内存(代码和数据),计时器,等等..., 并且这些资源是被保护的,也就是说其他进程不能访问。

线程是什么?

一个线程就是一个执行流或者控制流。

它也有一些属性,比如: 优先级, 调度算法,寄存器集合,CPU掩码(用于多核应用),等......

而所有的这些属性都会作用在正在运行的代码上。

  1. Kernel

顾名思义,核心模块。因为它,系统的各个模块可以协作

其他程序可以通过kernel call的方式来调用核心模块,来执行kernel的代码

大部分的子系统,包括用户应用软件,互相通信都是通过kernel call的方式

kernel是系统的核心

kernel call是采用抢占的方式(pre-emptable)被调用的。好处是,响应新的事件速度会很快,不好是要花更多的时间去恢复到原来被打断的kernel call。

内核可以提供不同的服务,比如: 同步,时钟,进程间通信,调度等等

内核可以提供不同的服务

kernel提供的进程之间的通信种类有三种:

a. Messages, 进程间交换信息

b. Pulses,传递通知给进程

c. Signals, 中断进程,并让它做点别的事情

Messages

Pulses

Signals

事实上,kernel可以被想象成一个library, 并没有一直不停运行的循环进程(no while(1)). 只有在被调用的时候才运行。

2. Process Manager

procnto = Process manager + Micarokernel

Communication with the Process Manager

Process Manager提供服务包括:

a. 捆绑一组threads一起进入process

b. 内存保护,内存空间管理,QNX使用虚拟内存地址

c. 路径名管理

d. process创建和结束

e. 一个idle线程在cpu上运行,当cpu空闲的时候

虚拟地址,物理地址,共享内之间的关系

3. Scheduling

Thread都有两个状态: blocked和runnable.

Thread都有优先级(0-255),kernel总是选择优先级最高的thread来执行

Thread都有属于自己的调度算法,(Round-robin, FIFO等等)

Round-robin 该术语来源于含义为“ 带子”的 法语词 ruban,久而被 讹用并成为 惯用语。在17、18世纪时 法国 农民希望以请愿的方式抗议国王时,通常 君主的反应是将请愿书中最前面的两至三人逮捕并处决,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在请愿书底部把名字签成一个圈(如同一条环状的带子),这样就找不出打头的人,于是只能对所有参与者进行同样的惩罚。

4. Resource manager

资源管理,顾名思义,就是提供POSIX规范的接口来管理资源。比如open文件,read文件,写文件...

稍微总结一下:

---QNX是一个微核架构

---进程拥有自己的资源,线程以及代码

---QNX采用抢占式调度策略

2漫谈QNX进程,线程,同步

进程包含一个以上的线程和许多资源

举个形象的例子:

组装线

Process来控制所有的设备(钻孔机,传送带等),每一种设备就可以想象成一个个thread。

当然还有一些更多的层级关系:

接下来两个多线程的进程的例子(multithreaded processes):

1. 一个实时性要求很高的进程和硬件进行通信,其他的线程可以慢条斯理的和其他process进行通信

2. Pool of worker threads. 很多线程准备着,当其他线程都忙的时候,新的请求依旧可以有线程来满足

一个process里的threads都有属于自己的内存地址(虚拟地址),其他的资源都是共享的。

一个process的虚拟地址

每一个thread都有一个最大的体积,也不是每一个都需要分配物理内存。


1 进程process

fork(), exec*(), spawn(), spawn*(), posix_spawn()

举个例子fork():

fork() will create a copy of your process

fork 这个英文单词在英文里是"分叉"意思, fork() 这个函数作用也很符合这个意思. 它的作用是复制当前进程(包括进程在内存里的堆栈数据)为1个新的镜像. 然后这个新的镜像和旧的进程同时执行下去. 相当于本来1个进程, 遇到fork() 函数后就分叉成两个进程同时执行了. 而且这两个进程是互不影响.

fork

实际应用中, 单纯让程序分叉意义不大, 我们新增一个子程序, 很可能是为了让子进程单独执行一段代码. 实现与主进程不同的功能. 要实现上面所说的功能, 实际上就是让子进程和主进程执行不同的代码啊. 所以fork() 实际上有返回值, 而且在两条进程中的返回值是不同的, 在主进程里 fork()函数会返回主进程的pid, 而在子进程里会返回0! 所以我们可以根据fork() 的返回值来判断进程到底是哪个进程, 就可以利用if 语句来执行不同的代码了!

2 线程Thread

pthread_create()可以用来创建线程。

每个线程其实就是执行一个fun(). 每一个fun()就是一个thread。

pthread_create()会返回tid(thread ID).

pthread_attr_init()可以设置一个线程的default值。

如果你想设置thread优先级和调度算法:

param.sched_priority = 15; %优先级值为15
pthread_attr_setschedparam (&attr, &param); %给该thread设定优先级
pthread_attr_setschedpolicy (&attr, SCHED_RR); %设定调度算法为 Round- Robin

Process里面,第一个thread就是main thread, 因为它调用了整个process的main()函数. 如果exit()被调用,那么整个process就结束死亡了。

同样的道理,如果在一个thread里, 如果pthread_exit()被调用了,那么thread也就会结束死亡。

如果一个process里面,所有的threads都死亡了,那么这个process就会死亡。

无论process如何死亡的,所有的相应的资源(内存,channels等)都会被释放或清理。

3. 同步Synchronization

多threads却引入了新的问题,比如公用内存空间,多个writers可能会互相覆盖对方的值, readers也不知道什么时候数据是稳定有效地。

所以我们需要同步机制来协调管理。

3.1 Mutual exclusion

Mutual exclusion意味着只有一个thread在某一时间里可以执行某段重要的代码段,或者读写一些特别的数据。一个形象的例子:

把厕所空间比喻成内存空间,每次只能进去一个人,里面有人的时候,其他人就不能进去了。这代表一个thread使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存. 问题是如何防止别人也同时进去呢?

一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

Mutex

其实我的理解就是Mutex就是一个process内的对于所有threads来说的全局01变量,你要锁的时候就把这个全局变量Mutex设置为1,其他的thread读到这个Mutex的时候就知道你在使用,就停下来等,知道你用完了把Mutex设置回0,然后别的进程才可以进去用。

当然这样又会产生新的问题,死锁问题(Dead lock). 对此,我们可以设计一些特殊的执行顺序来避免死锁,这里就不打算展开了。

当然一旦锁定了Mutex,该thread的优先级就会上升。因为系统当然希望这个thread赶紧运行完毕,毕竟不能占着茅坑不拉屎。

拥有Mutex的thread的优先级就会上升

3.2 条件锁Condvars

光有互斥锁还是不够,最好有一把聪明的互斥锁。比如说,只有满足了某种条件(收到某种信号)的情况下,才能解锁。这样就会更高效的执行程序功能。

其实总体看起来,线程的执行很像最近流行的宫廷剧里,一个皇上(CPU)拥有很多嫔妃(Threads),但是宗旨是雨露均沾。所以如何雨露均沾就是一件需要调度和协调的事情,最后还尽量要让嫔妃们都满意,苦了皇上了,哈哈。

(3)漫谈QNX进程间通信IPC

既然有了进程process,那么不同进程间通信就很有必要了。两个进程之间要交换数据,控制,以及事件通知。


Message passing ---比较传统的IPC方式是基于主从式构架(client-server),并且是双向通信。

再仔细来看的话,就是每一个process里面都有一个thread来负责通信。当一个线程在等待回信的时候,就会傻傻的等待,什么都不做了。直到收到回复信息。

傻等

Servers收到信息在通道上,Clients通过connection连接上channel,来发送信息。

一个进程可以有多个connections连接到另一个进程的channel上,是个多对一的关系。

多connections和多channels

Server创建Channel:

chid = ChannelCreate (flags);

Client连接上Server的channel:

coid = ConnectAttach(nd, pid, chid, _NTO_SIDE_CHANNEL, flags);

信息的发送:

status = MsgSend (coid, smsg, sbytes, rmsg, rbytes);

信息的接收:

rcvid = MsgReceive (chid, rmsg, rbytes, info);

接下来来点干货,看一个demo代码:

Massage之间的通信数据总是通过拷贝,而不是指针的传递。

那么如何设计消息传递策略呢?一个例子看一下:


Pulses脉冲

脉冲的通信方式很特别,就像喊命令,不需要回应,执行就好了。便宜还快速,也不会发生blocking的现象。

Pulse命令

一个例子:


Event Delivery

Event是一种notification。可是从thread到thread,也可以从kernel到thread。比如硬件打断kernel的通知,或者timer到期的通知。

Shared Memory

如果通过设置shared memory, 同样的物理内存可以被多个进程访问。

After setting up a shared memory region, the samephysical memory is accessible to multipleprocesses:

preocess进程间通过shared memory通信同步策略:

IPC for synchronization

IPC for synchronization

Client先准备好共享内存的内容,然后告诉Server一切准备好了。接着Server读取共享内存内容,并做处理。最后Server回复Client说搞定了。这样Client就可以继续准备下一个任务了。

IPC想想也是很重要的,如果你设计的系统功能需要几个process的相互协作,你就绕不开IPC这个概念,下次准备有机会在一个实际的例子里看看IPC到底有什么用,怎么用。

QNX是一个微内核的实时操作系统。2021年,QNX已经不再是旧时王谢堂前燕,广泛应用于各种量产智能座舱和自动驾驶的域控制器中,和Android/linux一样,早已飞入寻常百姓家了。

在QNX的系统定义中,包含着以下两个概念:

微内核(Micro Kernel):是提供操作系统核心功能的内核精简版本。

实时操作系统(RTOS):是指当外界事件和数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内,来控制生成过程或对处理系统做出快速响应,调度一切可以利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

QNX的核心提供4种服务:

  1. 进程调度
  2. 进程间通信
  3. 底层网络通信
  4. 中断处理

因此QNX内核非常的精致小巧,比传统的宏内核(Linux)系统可靠性更高。

QNX调度策略

QNX 提供POSⅨ.1b标准进程调度:

  1. 255个进程优先级
  2. 抢占式的、基于优先级的正文切换
  3. 可选调度策略:FIFO、轮转策略、适应性策略

QNX的微内核结构及其与外部的联系

为什么各大主机厂和Tier1在量产自动驾驶的时候,会选择QNX而非Linux或其他宏内核系统呢?

随着汽车行业“四化”的发展,域控制器等ECU所承载的功能和算法呈几何倍数的增加。软件定义汽车使得整个车载ECU的软件变得非常的复杂和庞大,一个域控制器的软件代码可能有几万个文件,几百万行代码。在这样的代码量下,要保证每个组件正常工作,就需要一整套的维护/运行策略。汽车厂商及其供应商们为了设计出安全可靠的软件系统也做了很多的努力:比如在研发流程上执行ASPICE,强调设计的溯源和变更追踪;在架构设计上启用AutoSAR, 维护框架和接口的一致性;同时,使用QNX等具有功能安全的操作系统也是目前业界所广泛认同的一个策略。

那么为什么说QNX系统更安全呢?QNX的开发者们如何通过系统组件来进行软件设计/开发呢?下面是一些QNX特性的例子:

  1. AP(Adaptive Partitioning)

有时候我们会遇到这样一种问题,某进程里有个bug,调试的时候发现该进程一起来整个一个核的CPU都满了,我们猜测系统内可能是出现了死循环

自适应分区是QNX的重要特性之一,也是一个在开发调试阶段很好用的一个工具。

在软件集成在QNX系统之后,开始优化整个系统之前,为了保护不同的应用群组/应用,独立运行而不被其他应用破坏或干扰,操作系统采用“虚拟墙(virtual walls)”将系统的共享资源(CPU执行时间/内存/存储空间等)以一定的比例划分,以确保每个分区都有一组经过工程设计的资源,每个分区内可以运行一个或多个线程。

ap分区概念

分区能够提供:

  • 内存保护:提供内存保护,即每个分区是离散的,由内存管理单元控制(MMU);
  • 过载保护:提供过载保护,即根据系统设计人员的指定,每个分区都有一段执行时间。

自适应的含义是:在运行时可以改变配置。例如,空闲时间被重新分配给其他调度程序分区,系统会使用一种机制,使得CPU可以在一个时间分区之间临时移动线程。

2. HAM(High Availability Manager)

我们设计的软件系统,在很大的概率上是存在很多漏洞的,那么一旦发送故障,有没有什么办法能快速的使整个软件系统尽快恢复正常状态呢?

(上电重启不是一个系统持续运行的好办法)

QNX提供了一套高可靠性的软件框架,当系统内的部分进行或线程失效时,通过这一套框架来进行系统的处理。这一套框架被称为HAM。其基本思想是:

  • 系统隔离:隔离系统中的问题区域,确保系统组件的独立,每个组件(进程)享有完全基于MMU的内存保护;
  • 多级恢复:HAM在系统出现问题是可以执行多级恢复,按特定的顺序执行多个操作(这在系统的各个进程间存在各种严格依赖关系的时候非常有效,这样系统就可以把自己恢复到bug前的状态)

QNX的微内核结构

内核独立自处于一个被保护的地址空间;驱动程序、网络协议和应用程序处于程序空间中。

微内核结构的优点:
①驱动程序、网络协议、文件系统等操作系统模块和内核相互独立,任何模块的故障都不会导致内核的崩溃;
②驱动程序、网络协议、文件系统和应用程序都处于程序空间,都调用相同的内核API,开发与调试和应用程序没有区别;
③操作系统功能模块可以根据需要动态地加载或卸载,不需要编译内核。

在具有高可靠性内核的基础上,QNX的创新设计使它同样具有很高的效率。

QNX最为引人注目的地方是,它是UNⅨ的同胞异构体,保持了和UNⅨ的高度相似性,绝大多数UNⅨ或LINUX应用程序可以在QNX下直接编译生成。

这意味着为数众多的稳定成熟的UNⅨ、LINUX应用可以直接移植到QNX这个更加稳定高效的实时嵌入式平台上来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

漫谈QNX(架构/进程,线程,同步,进程间通信IPC) 的相关文章

  • 使用 SMJobBless() 编写特权帮助工具

    尽管该 API 自 Mac OS X Leopard 以来就已开放 但令人惊讶且不幸的是 关于如何正确使用的文档却很少SMJobBless 用于创建特权帮助工具 即使直接从 Apple 的示例项目复制代码 也存在很多问题 幸运的是 我找到了
  • 信号会通过哪些方式干扰管道通信?

    我对信号一无所知 对管道也只有一点了解 从评论来看zdim s在这里回答 https stackoverflow com questions 48558093看来信号可能会干扰父进程和子进程之间的管道通信 有人告诉我 如果你使用IO Sel
  • 从另一个进程访问 mmap 内存

    我开始玩 mmap 了 我正在尝试创建一个示例工作区 然后将其扩展到实际案例 这就是我想要实现的目标 流程1 mmap一个文件 实际上是一个设备 但是用文本文件生成一个例子是可以的 进程2 不是从进程1复制而来 只是一个独立的进程 读取进程
  • 在 C++ 中创建 Windows 命名管道

    我正在尝试在 C Windows 中创建两个进程之间的简单通信 就像 Linux 中的 FIFO 一样 这是我的服务器 int main HANDLE pipe CreateFile TEXT pipe Pipe GENERIC READ
  • contextBridge.exposeInMainWorld 和 IPC 在 Electron 应用程序中使用 Typescript:无法读取未定义的属性“发送”

    我定义了 contextBridge https www electronjs org docs all contextbridge https www electronjs org docs all contextbridge 在prel
  • 共享内存和IPC [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在阅读有关共享内存的教程 发现以下陈述 如果一个进程希望通知另一个进程新数据已插入共享内存 则必须使用信号 消息队列 管道 套接字
  • PHP - 访问用 C++ 创建的共享内存

    几天以来 我一直在努力让以下事情发挥作用 我有一个微型 C 程序 它从串行端口连续读取一些数据 该数据存储在共享内存中 如下所示 HANDLE hMapFile hMapFile CreateFileMapping INVALID HAND
  • make:安装:找不到命令

    当我尝试安装时git从它的源头开始qnx 我收到以下错误 请注意 pound 是 sudo 的提示qnx configure without iconv with perl usr pkg bin perl with python usr
  • 使用 Cromis IPC 进行双向通信

    我已经下载并玩了克罗米斯工控机 http www cromis net blog 2009 11 cromis ipc fast inter process communication named pipes 来自 Iztok Kacin
  • .NET 中 32 位进程如何与 64 位进程通信?

    Windows 不允许 32 位进程加载 64 位 dll 因此我尝试使用远程处理来允许 32 位进程与 64 位进程交互 问题是 虽然两个应用程序位于同一台计算机上 但一个是 32 位 另一个是 64 位 而且它们必须是这样的 同时使用
  • 将参数发送到驻留在另一个进程中的应用程序实例

    我有一个单实例应用程序 c WPF net3 51 检查应用程序是否已实例化是通过互斥体完成的 如果应用程序已在运行 我会从已打开的应用程序实例中打开一个新窗口 到目前为止效果很好 但是 由于应用程序扩展 我现在必须将 e Args 或至少
  • 将一个对象传递给默认 AppDomain,以从进程内创建的子 AppDomain 接收回调

    地点 我正在从我的进程创建一个子应用程序域来加载程序集 我能够调用此 AppDomain 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain 以接收从新 AppDomain 中加载的程序集到我的默认 A
  • Windows服务之间如何通信

    我有 2 个使用 C 创建的 Windows 服务 我希望其中一个服务调用第二个 Windows 服务中的函数 我该怎么做呢 EDIT 问题是我必须运行该应用程序 我不需要它们 相反服务进程也很好 但我need这2个应用程序进行通信 这2个
  • iOS 应用程序可以通过套接字进行通信吗?

    我将为 iOS 开发一些应用程序 他们可以通过套接字相互通信吗 假设一个应用程序作为服务器运行 即使在后台模式下 另一个应用程序作为客户端连接到服务器应用程序并执行一些通信 它是否违反了任何 App Store 规则 如果我的想法由于某种原
  • 在Python中与子进程多次通信

    这个问题不是重复的 与一个进程进行多次通信而不破坏管道 https stackoverflow com questions 3065060 communicate multiple times with a process without
  • 如何从单独的进程监控应用程序崩溃

    我有一个特定的 net 应用程序 偶尔会因以下 Windows 错误之一而崩溃 application name has encountered a problem and needs to close We are sorry for t
  • IPC 跨不同 Docker 容器中的 Python 脚本共享内存

    问题 我编写了一个神经网络分类器 它接收大量图像 每个图像约 1 3 GB 对它们进行修补 然后将修补程序单独通过网络传递 训练正在进行中really慢慢地 所以我对它进行了基准测试 发现将补丁从一张图像加载到内存中需要大约 50 秒 使用
  • 在 C# 中进行进程间通信 (IPC) 最简单的方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有两个 C 应用程序 我希望其中一个向另一个发送两个整数 这不必很快 因为它每隔几秒调用一次 做到这一点最简单的方法是什么 它不一定是最优雅的
  • 在 C# 进程之间共享对象的推荐方式

    我已经阅读了许多关于 2 个 C 应用程序之间的 IPC 及其优缺点的不同内容 但我觉得我还没有为我的用例找到令人满意的答案 我有一个已经存在的对象 该对象会经常更改 我正在尝试将我的工具附加到游戏并使用它来调试使用该工具创建的元素 因此
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似

随机推荐

  • i++在两个线程执行100次,最终的结果是

    i 43 43 语句只需要执行一条指令 但当有多个线程时 xff0c 并不能保证多个线程i 43 43 xff0c 操作同一个i 因为还有寄存器的因素 xff0c 多个cpu对应多个寄存器 每次要先把i从内存复制到寄存器 xff0c 然后
  • 一万字解读CP AUTOSAR

    导读 xff1a AUTOSAR旨在改善汽车电子系统软件的更新与交换 xff0c 同时更方便有效地管理日趋复杂的汽车电子软件系统 AUTOSAR规范的运用使得不同结构的电子控制单元的接口特征标准化 xff0c 应用软件具备更好的可扩展性以及
  • 关于SOME/IP的理解

    1 总体说明 如上图所示为标准的网络七层架构 xff0c SOME IP Scalable service Oriented MiddlewarE over IP xff0c 即 运行于IP之上的可伸缩的面向服务的中间件 他在系统中其实就是
  • 系统性思维是什么?

    像是魔方一个 xff0c 当你遇到一个问题时 xff0c 有系统性思维的人会告诉你为什么你会有这个问题 xff0c 这个问题的前因后果是什么 xff0c 怎么避免类似问题 xff0c 正确的方法是什么 xff0c 其他可能得错误路径是什么
  • 如何从普通员工成为一个领导者

    how to become a company leader from one employee 要想成为一个领导或者领导 xff08 影响别人 xff09 首先需要基本的领导基本功 这里分享一些我的心得体会 自我反省 xff1a 要不断自
  • 读书笔记1

    第七期主题词 xff1a 告别 1 我们最终都要远行 xff0c 最终都要与稚嫩的自己告别 xff0c 告别是通向成长的苦行之路 海子 2 我和谁都不争 xff0c 和谁争我都不屑 xff0c 我的双手烤着生命之火取暖 xff0c 火萎了
  • 武志红《为何爱会伤人》

    最近读武志红 为何爱会伤人 xff0c 让我们从另一个角度去理解爱情 xff0c 本书从全新的视角解读爱情 xff0c 提出从 认识自己内心 的角度来看待爱情 xff0c 什么是迷恋 xff1f 什么是一见钟情 xff1f 如何获得真爱等问
  • 关于如何去寻找自己的另一半和我的爱情观

    用这个题目 xff0c 我自己都没想到 xff0c 因为目前我还是单身 xff0c 虽然谈过几次恋爱 xff0c 但最后都成了白月光 下面我给出了自己的反思 xff0c 也找了我的领导谈心 xff0c 也看了一些书 xff0c 想找到为什么
  • 一篇文章完全讲解C语言指针

    指针对于C来说太重要 然而 xff0c 想要全面理解指针 xff0c 除了要对C语言有熟练的掌握外 xff0c 还要有计算机硬件以及操作系统等方方面面的基本知识 所以本文尽可能的通过一篇文章完全讲解指针 为什么需要指针 xff1f 指针解决
  • MySQL定时备份

    MySQL定时备份实例 xff1a 每周一晚上3 00 xff0c 备份数据库服务器上webdb库的所有数据到系统的 mysqlbak目录中 xff0c 使用系统日期做备份文件名 xff01 span class token operato
  • 一篇文章完全讲解C语言指针

    https mp weixin qq com s biz 61 MzU3NDU5NDczMw 61 61 amp mid 61 2247504309 amp idx 61 5 amp sn 61 5421ee86fb1be92b43d99f
  • 读懂Adaptive Autosar架构-基础应用篇

    对于Adaptive AUTOSAR xff0c 咱们经常会看到这句话 xff1a Write once Adopt everywhere 但实际上理想很丰满 xff0c 现实很骨感 毕竟Classic Platform xff08 后面简
  • 软件架构的定义

    一 软件架构的定义 我们先讨论一下什么是软件架构 xff1f 对于软件架构并没有一个标准的定义 xff0c 但是你和软件工程师谈到架构的时候 xff0c 他们会知道这些都会是架构的内容 是不是要分层 xff0c 如何处理事件 xff0c 如
  • 一文了解V2X技术栈及其产业链

    C V2X会给未来出行交通带来怎样的改变 xff1f 会在哪些场景下发挥作用 xff1f 这条产业链里面的公司又是哪些 xff1f 大厂们在V2X上的投入又是如何呢 xff1f 本文可以给你一个答案 1 为什么需要V2X 随着C V2X及5
  • 精力管理分享

    你是否长时间工作却没有时间休息 是否总是感到压力很大 xff0c 时间不够用 xff1f 是否经常觉得很疲惫 xff0c 怎么调整都找不到状态 xff1f 然而 xff0c 不论是工作还是生活 xff0c 我们每个人都需要进行自我能量的调节
  • 目标管理

    业务能力很突出 xff0c 管理能力跟不上 xff0c 怎么办 xff1f 这节课帮你补全管理必修模块 xff0c 掌握全面的管理视角 学了很多管理手段 xff0c 总是用不上怎么办 xff1f 用工具统一管理语言 xff0c 拿来就能用
  • 深入浅出理解SOME/IP

    详解SOME IP协议文档 1 知乎 知乎 xff0c 中文互联网高质量的问答社区和创作者聚集的原创内容平台 xff0c 于 2011 年 1 月正式上线 xff0c 以 让人们更好地分享知识 经验和见解 xff0c 找到自己的解答 为品牌
  • SOME/IP-SD 深入浅出

    文章中 xff0c 我们了解了一条完整的SOME IP报文应该长什么样子 xff0c 但这显然是不够的 xff0c 至少还有以下这几个问题并没有得到明确的解决 xff1a Client如何发现服务 当服务不可用时 xff0c 如何通知Cli
  • Segmentation Fault错误原因总结

    一 什么是 Segmentation fault in Linux 所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间 xff0c 通常这个值是由gdtr来保存的 xff0c 他是一个48位的寄存器 xff0c 其中的32位是保存
  • 漫谈QNX(架构/进程,线程,同步,进程间通信IPC)

    1 架构 说起Blackberry的QNX操作系统 想必大家都听说过 xff0c 但到底为什么QNX能如此有名 xff1f 难道微软的Windows和Linux都不能与之抗衡 xff1f 美国NASA的太空接驳飞船也使用QNX操作系统 QN