糖果Autosar
AutoSAR架构专家,分享AutoSAR学习笔记和心得体会,提供咨询和答疑。粉丝们尽量在博文评论区留言你们咨询的问题,有空我会统一回答
展开
-
【linux软件基础知识】等待队列
prepare_to_wait() 和 prepare_to_wait_exclusive() 函数将进程状态设置为作为第三个参数传递的值,然后分别将等待队列元素中的独占标志设置为 0(非独占)或 1(独占),最后将等待队列元素 wait 插入到等待队列头 q 的列表中。一旦进程被唤醒,它就会执行 finish_wait() 函数,该函数再次将进程状态设置TASK_RUNNING(以防唤醒条件在调用 schedule() 之前变为真),并从等待队列列表中删除等待队列元素(除非唤醒函数已经完成此操作)。原创 2024-08-13 00:01:06 · 115 阅读 · 0 评论 -
怎么确定编译器使用的c++版本
【代码】怎么确定编译器使用的c++版本。原创 2024-06-22 22:53:44 · 37 阅读 · 0 评论 -
vruntime
是由系统定时器周期性调用的,无论是在进程处于可运行态,还是被堵塞处于不可运行态。根据这种方式,vruntime 可以准确地测量给定进程的运行时间,而且可知道谁应该是下一个被运行的进程。进行加权计算,最终将上述的权重值与与当前运行进程的 vruntime 相加。计算了当前进程的执行时间,并且将其存放在变量。然后它又将运行时间传递给了。原创 2024-06-03 00:31:56 · 85 阅读 · 0 评论 -
【linux软件基础知识】执行进程切换和switch_to
进程切换可能只发生在精心定义的点: schedule()函数。这里,我们仅关注内核如何执行一个进程切换,从本质上说,每个进程切换由两步组成,原创 2024-06-02 15:27:57 · 91 阅读 · 0 评论 -
【linux软件基础知识】与调度相关的进程描述符
如果进程的优先权等于k(其取值范围是0到139),run_list字段把该进程链入优先级为k的可运行进程的链表中。80x86 体系结构包括了一个特殊的段类型,叫任务状态段 (Task State Segment,TSS来存放硬件上下文。尽管Linux 并不使用硬件上下文(参见下文)切换,但是强制它为系统中每个不同的 CPU 创建一个TSS。在每次进程切换时,被替换进程的硬件上下文必须保存在别处。原创 2024-06-01 18:28:29 · 97 阅读 · 0 评论 -
【linux软件基础知识】链表数据结构
新链表是用LIST_HEAD(list_name)宏创建的。如上图中的(b)空链表所示,它申明类型为 list head的变量name,该变量作为新链表头的占位符。LIST_HEAD(list_name)宏还初始化 list head数据结构的 prev和next 字段,让它们指向list_name 变量本身。代码如下把 n指向的元素插入 P 所指向的特定元素之后 (为了把n插人在链表的开始, set p to the address of the list head.)原创 2024-06-01 16:08:42 · 132 阅读 · 0 评论 -
【linux软件基础知识】数据结构 runqueue
每个数据结构都表示一个可运行进程的集合,并包括 140个双向链表头(每个链表对应一个可能的进程优先级,0-99 for real time,100-139 for normal process)、一个优先级位图(通过一个bitmask 去记录对应的优先级下的queue 是否为空)和当前集合中所包含的进程数量的计数器。系统中的每个 CPU都有它自己的运行队列,所有的runqueue结构存放在 the runqueues per-CPU variable。数据结构之一:对应于包含活动进程的可运行进程的集合。原创 2024-06-01 16:08:25 · 142 阅读 · 0 评论 -
【linux软件基础知识】linux进程的状态和转移
最终状态:由于父进程刚发出 wait4)或waitpid()系统调用,因而进程由系统删除。为了防止其他执行线程在同一个进程上也执行wait()类系统调用(这是种竞争条件),而把进程的状态由僵死 (EXIT ZOMBIE) 状态改为僵死撤消状态(EXIT DEAD)。还有两个进程状态是既可以存放在进程描述符的state字段中,也可以存放在exit state字段中。原创 2024-05-26 11:40:43 · 70 阅读 · 0 评论 -
【linux软件基础知识】完全公平调度(2)
假设一个进程具有默认的 Nice 值(零),而另一个进程的 Nice 值为 5。这种分配可确保具有较高 Nice 值的进程与具有较低 Nice 值的进程相比,获得较小比例的 CPU 时间。如果两个可运行进程的Nice 值分别为 10 和 15,则分配的时间片仍将分别为 15 毫秒和 5 毫秒。在两个可运行进程具有不同的好值的情况下,完全公平调度程序 (CFS) 根据权重为每个进程分配不同比例的处理器时间。CFS根据进程的权重动态调整时间片,旨在根据进程的相对优先级提供公平和比例的资源分配。原创 2024-05-13 00:29:24 · 61 阅读 · 0 评论 -
【linux软件基础知识】完全公平调度
CFS根据每个进程相对于所有可运行线程总权重的权重为每个进程分配一个“时间片”。CFS 的目标是近似“无限小”的调度持续时间,称为目标延迟。较小的目标延迟可以提高交互性并接近完美的多任务处理,但其代价是更高的切换开销和可能更低的总体吞吐量。假设目标延迟设置为 20 毫秒,并且有两个具有相同优先级的可运行任务,则每个任务将运行 10 毫秒,然后被另一个任务抢占。这种时间片的平等分配确保了任务之间的公平性,无论其各自的优先级如何。如果有四个相同优先级的任务,则每个任务的时间片将减少到5毫秒。原创 2024-05-13 00:20:44 · 70 阅读 · 0 评论 -
【linux软件基础知识】调度场景
nicenice。原创 2024-05-12 13:43:23 · 54 阅读 · 0 评论 -
【linux软件基础知识】如何使用 run_list 字段将任务放入就绪队列中
是一个特殊的任务结构,代表Linux内核中的初始进程(也称为进程号0或空闲进程)。它是任务组的领导者,并作为任务管理子系统的起点。struct list_head是Linux内核中为了方便链表操作而定义的一个数据结构。字段在Linux内核中常用来表示任务在调度队列中的位置,例如就绪队列或各种优先级队列。表示内核中任务或进程的进程控制块 (PCB)。,分别指向链表中的上一个和下一个元素。,这表明它是链表实现的一部分。在给定的代码片段中,原创 2024-05-11 23:56:26 · 184 阅读 · 0 评论 -
【linux软件基础知识】内核代码中的就绪队列简化示例
在内核代码中,就绪队列通常使用允许高效插入和删除进程的数据结构来表示。用于表示就绪队列的一种常见数据结构是链表。它更新ready_queue_head指针以指向队列中的下一个任务。函数通过遍历链表直至到达末尾并将任务追加到就绪队列中来添加任务。如果就绪队列为空,则该任务成为队列的头。在这个例子中,每个进程都由一个task_struct结构表示,其中包含进程控制所需的字段。的next指针指向NULL,表明它是队列中的最后一个任务。的下一个指针,确保加入到就绪队列的。字段是指向就绪队列中下一个。原创 2024-05-11 23:35:55 · 107 阅读 · 1 评论 -
【linux软件基础知识】Linux 中的实时进程
Linux 中的实时进程与实时优先级相关联,实时优先级的值范围为 1(最高优先级)到 99(最低优先级)。Linux 调度程序对待实时进程的方式与传统进程不同。值得注意的是,实时进程由于其高优先级和抢占低优先级进程的能力,需要谨慎使用,以避免对系统上其他关键任务的执行产生负面影响。原创 2024-05-11 00:12:22 · 122 阅读 · 0 评论 -
【linux软件基础知识】Linux 中的普通进程的调度机制
为了实现静态优先级较低的进程没有完全锁定并有机会运行,Linux 调度程序维护两个不相交的可运行进程集:活动集和过期集。此机制是完全公平调度程序 (CFS) 算法的一部分。:活动集包含当前正在运行的一个或多个进程。这些进程仍在其时间量内,并且尚未消耗全部分配的 CPU 时间。:过期集由已耗尽其时间量的进程组成。这些进程已用完为其分配的 CPU 时间片,需要重新评估以进行调度。当活动集中的进程完成其时间量时,它将被移至过期集中。然后,Linux 调度程序根据优先级和公平标准从中选择下一个要运行的进程。原创 2024-05-10 23:05:26 · 147 阅读 · 0 评论 -
【linux软件基础知识】文件的概念:文件控制块(FCB)
在文件系统中,文件控制块(FCB)或文件头是与每个文件关联的数据结构。它包含有关文件的各种属性和元数据,允许操作系统和文件系统管理和检索有关文件的信息。FCB 中存储的具体属性可能会根据文件系统实现的不同而有所不同,但通常包括:文件名:文件的名称,在文件系统中唯一标识该文件。文件类型:文件的类型或格式,例如文本文件、二进制文件、目录、符号链接等。此信息帮助操作系统确定如何处理和解释文件的内容。文件大小:文件的大小(以字节为单位)。该属性表示文件数据占用的存储空间量。原创 2024-05-10 01:04:50 · 578 阅读 · 0 评论 -
【linux软件基础知识】- 文件的概念:Linux 中的文件
在 Linux 中,文件是存储在存储设备(例如硬盘驱动器或固态驱动器)上的数据项的集合。文件被组织为字节序列,并由文件系统中的唯一名称来标识。:Linux 中的文件被视为字节序列。每个字节可以表示一个字符、数值或任何其他类型的数据。:文件具有在文件系统中唯一标识它们的符号名称。这些名称可以包含字母数字字符和某些特殊字符,例如点和下划线。文件名用于引用文件并对其执行操作。:Linux 支持不同类型的文件,包括常规文件、目录、符号链接、设备文件、命名管道等。每种文件类型都有其自己的特征和用途。原创 2024-05-10 00:36:28 · 122 阅读 · 0 评论 -
【linux软件基础知识】std::lock_guard 和 std::unique_lock的区别
总之,std::lock_guard 是一个更简单的锁包装器,它自动获取和释放作用域区域内的锁,而 std::unique_lock 提供了额外的灵活性和功能,例如所有权转移、延迟锁定、定时锁定和条件变量支持。std::lock_guard 是一个简单的包装类,它提供互斥体上的作用域锁。std::lock_guard 和 std::unique_lock 是两个 C++ 标准库类,它们为锁定和管理互斥体提供不同级别的灵活性和功能。另一方面,std::unique_lock 是一个更灵活的锁包装类。原创 2024-05-10 00:01:36 · 68 阅读 · 0 评论 -
【linux软件基础知识】-线程安全实例
unique_lock 类是通用互斥锁所有权包装器,允许延迟锁定、时间受限的锁定尝试、递归锁定、锁所有权转移以及与条件变量一起使用。类 unique_lock 是可移动的,但不可复制——它满足 MoveConstructible 和 MoveAssignable 的要求,但不满足 CopyConstructible 或 CopyAssignable 的要求。unique_lock 类满足 BasicLockable 要求。原创 2024-05-09 23:44:46 · 30 阅读 · 0 评论 -
【linux软件基础知识】哲学家就餐问题
每个哲学家都遵循资源层次结构方法,首先获取左叉 (mutex forks[leftFork]),然后获取右叉 (mutex forks[rightFork])。问题就出现了,每个哲学家都需要两把叉子来吃饭,但如果他们各自拿起自己右边的叉子,他们就会陷入无人能继续下去的僵局。哲学家就餐问题是一个经典的同步问题,涉及一群哲学家围坐在桌子旁,每个哲学家轮流思考和吃饭。哲学家们共用放置在他们之间的有限数量的叉子,每对相邻的哲学家之间有一个叉子。每个哲学家都由唯一的哲学家 ID 来标识。原创 2024-05-09 01:00:09 · 53 阅读 · 0 评论 -
macOS 如何使用Visual Studio Code 编译C++
在 macOS,则默认系统 C++ 编译器是 Clang。请确保根据您所需的 C++ 标准调整 C++ 版本标志。此外,请确保您的 macOS 系统上安装了 Clang,并且编译器路径 /usr/bin/clang++ 正确。原创 2024-05-09 00:52:30 · 182 阅读 · 0 评论 -
【linux软件基础知识】-死锁问题
当两个或多个线程由于每个线程都在等待另一个线程持有的资源而无法继续时,就会发生死锁如下图所示,在线程 1 中,代码持有了 L1 上的锁,然后尝试获取 L2 上的锁。在线程 2 中,代码持有了 L2 上的锁,然后尝试获取 L1 上的锁。在这种情况下,线程 1 已获取 L1 上的锁,并正在等待获取 L2 上的锁,而线程 2 已获取 L2 上的锁,并正在等待获取 L1 上的锁。由于两个线程都在等待对方持有的资源,因此它们将无限期地卡住,从而导致死锁。为了避免此类死锁,确保锁的顺序一致非常重要。原创 2024-05-08 22:17:51 · 64 阅读 · 0 评论 -
【linux软件基础知识】-kobject结构
kobject结构是Linux内核设备驱动模型中的一个基本结构。设备驱动模型中的各种对象其内部都会包含一个kobject ,地位相当于面向对象思想中的总基类, 它充当设备驱动程序模型中各种对象的公共基础,并为这些对象提供基本功能。对象抽象:kobject 结构表示设备驱动程序模型中对象的基本抽象。它提供了不同对象所需的一组通用字段和服务。引用计数:kobject 结构包括引用计数机制来跟踪对象的引用数量。这有助于管理对象的生命周期并确保它在仍在使用时不会过早释放。对象链表。原创 2024-05-07 00:52:12 · 63 阅读 · 0 评论 -
【linux软件基础知识】-cdev_alloc
对象分配内存,初始化其成员(包括链表和内核对象),并返回指向分配对象的指针。该函数通常在向内核注册新的字符设备时使用。参数指定内核对象的类型,在本例中为 ktype_cdev_dynamic。最后,该函数返回指向已分配和初始化的 struct cdev 对象的指针。kobj 代表一个内核对象,用于内部管理目的。标志指定内存分配是在内核的正常上下文中执行的。类似,但它另外将分配的内存初始化为零。对象分配内存并初始化其成员。代码是 Linux 内核中。如果内存分配成功并且返回非。原创 2024-05-07 00:39:15 · 121 阅读 · 0 评论 -
【linux软件基础知识】- alloc_chrdev_region
提供的代码片段摘自 Linux 内核中的 alloc_chrdev_region 函数。该函数用于分配一定范围的字符设备号。被调用,参数为 0(表示内核应该自动分配一个主设备号)、并检索相应的设备号以供驱动程序或模块中进一步使用。最后将分配的设备号赋给dev指针,函数返回。变量的指针,该变量将存储分配的设备号。并包含有关主设备号和次设备号的信息。:要分配的连续次设备号的数量。,表示字符设备区域分配成功。:设备范围的起始次设备号。:驱动程序或模块的名称。返回相应的错误代码。一定范围的字符设备号。原创 2024-05-07 00:33:02 · 98 阅读 · 0 评论 -
【linux软件基础知识】字符设备与struct cdev
cdev”是操作系统和设备驱动程序上下文中“字符设备”的缩写。在类 Unix 操作系统(例如 Linux)中,设备表示为称为设备文件的特殊文件。设备文件有两种类型:字符设备和块设备。字符设备是一种一次传输一个字符的数据的设备。它通常用于以连续流方式生成或消耗数据的设备,例如键盘、鼠标、串行端口和终端。字符设备是通过/dev 目录中的设备文件访问的。原创 2024-05-07 00:26:09 · 157 阅读 · 0 评论 -
【linux软件基础知识】- struct gendisk
不同的块设备驱动程序使用 struct gendisk 及其关联的结构和函数为各自的设备实现特定的功能和行为。struct gendisk 包含各种字段和指针,提供与块设备相关的信息和操作。struct block_device_operations *fops:指向包含块设备操作(例如读、写、打开和释放)的结构的指针。struct block_device *private_data:指向与块设备关联的私有数据。struct device *dev:指向表示块设备的设备结构。块设备关联的请求队列。原创 2024-05-06 21:30:57 · 149 阅读 · 0 评论 -
【linux软件基础知识】-文件系统与设备驱动
它允许用户和应用程序以统一的方式访问和管理存储设备上的数据,无论这些数据是存储在硬盘、光盘、闪存驱动器还是其他存储介质上。设备驱动的主要目的是将硬件设备的特定功能和操作抽象为操作系统可以理解和管理的接口,从而使应用程序可以通过操作系统来访问和操作硬件设备,就像操作普通文件一样方便有效。usbfs(USB文件系统):usbfs是Linux中的一个文件系统,提供对连接到系统的USB设备的访问。文件系统定义了数据的组织结构、访问方法和元数据信息,使得对设备的操作更加方便、有效、有组织,并且更接近人类的思维方式。原创 2024-05-07 00:12:28 · 42 阅读 · 0 评论 -
【linux软件基础知识】文件系统中的文件块
在文件系统上下文中,“文件块”和“文件系统块”指的是不同的概念:文件块:文件块是文件内数据的逻辑单元。它们代表文件内容的特定部分,通常使用块号或相对于文件的偏移量来引用。文件块的大小由文件系统确定,并且可以根据实现而变化。文件块用于组织和寻址文件内的数据。文件系统块:文件系统块,也称为磁盘块或分配单元,是文件系统内的最小分配单元。它们代表底层存储设备(例如硬盘驱动器或固态驱动器)上的存储块。文件系统块的大小由文件系统确定,并且通常是固定值。常见的块大小包括 4 KB、8 KB 或 16 KB。原创 2024-05-05 13:21:52 · 189 阅读 · 0 评论 -
【Linux 内核的块 I/O 子系统】struct bio_vec
struct bio_vec 常用于 Linux 内核的块 I/O 子系统,例如块设备驱动程序和文件系统的实现。它允许在 I/O 操作期间高效、灵活地表示数据段。通过使用struct bio_vec,Linux内核可以对分散在多个内存页上的数据执行I/O操作,提供了一种在存储设备和系统内存之间高效传输数据的机制。:该字段表示数据缓冲区开始的页内的偏移量。是一个数据结构,用于表示 Linux 内核的块 I/O 子系统中的。在 Linux 内核中的 I/O 操作上下文中,之间传输的数据的一部分。原创 2024-05-05 12:59:11 · 112 阅读 · 0 评论 -
【linux硬件基础知识】分散/集中 DMA
分散/集中 DMA 是一种用于数据传输操作的技术,其中数据直接在外围设备(例如硬盘)和系统内存之间传输,而不涉及 CPU。通过将数据划分为段,分散/聚集 DMA 操作可以有效地传输非连续内存区域中的数据。DMA 控制器可以独立访问每个段,从存储介质中的适当物理页获取数据或将数据存储到存储介质中的适当物理页。在分散/集中 DMA 操作中使用段可以优化数据传输,特别是在处理碎片数据或数据位于不同内存位置时。在 DMA 操作期间,DMA 控制器迭代分散/聚集列表中的条目,根据提供的信息执行每个段的数据传输。原创 2024-05-05 12:51:55 · 168 阅读 · 0 评论 -
【linux硬件基础知识】ATA 接口LBA(逻辑块寻址)
与旧的 CHS 寻址方法相比,它允许更高容量的驱动器和更高效的数据访问。然而,随着硬盘驱动器容量的增长,CHS 寻址变得效率低下,并且寻址整个磁盘空间的能力受到限制。LBA 是作为一种替代寻址方法引入的,它提供了一种更有效、更直接的方式来访问磁盘上的数据。通过LBA,操作系统或磁盘控制器可以直接指定从磁盘上的特定扇区读取或写入的LBA值,而无需计算物理CHS值。LBA(逻辑块寻址)是 ATA(高级技术附件)存储设备(例如硬盘驱动器 (HDD))中使用的一种方法,用于对设备上存储的数据进行寻址和访问。原创 2024-05-05 12:36:56 · 150 阅读 · 0 评论 -
【linux硬件基础知识】SATA vs ATA
ATA,也称为 IDE(集成驱动电子设备)或 PATA(并行 ATA),是早期用于将存储设备连接到计算机的标准。热插拔:SATA 支持热插拔,这意味着您可以在计算机开机时连接或断开 SATA 设备,而无需重新启动系统。设备限制:由于信号衰减,ATA 的最大电缆长度限制为 18 英寸(46 厘米)左右,而 SATA 电缆最长可达 1 米(3.3 英尺)而不丢失信号。总之,SATA 是用于连接存储设备的更现代、更广泛使用的接口,与 ATA 相比,它提供更快的速度、更小的电缆、热插拔支持以及更高的整体性能。原创 2024-05-05 12:31:54 · 110 阅读 · 0 评论 -
【linux基础】05-linux文件系统
在Linux中,文件系统是一种分层结构,它将文件和目录组织成树状结构。文件系统从“根”目录开始,该目录由单个正斜杠(“/”)表示。如下图所示:Linux 支持多种类型的文件系统,包括:Ext4:这是大多数 Linux 发行版的默认文件系统。它是一个日志文件系统,提供良好的性能和可靠性。XFS:一种高性能文件系统,常用于大规模存储系统。Btrfs:一种较新的文件系统,提供快照和数据压缩等高级功能。ZFS:一种流行的文件系统,提供重复数据删除、快照和数据压缩等高级功能。原创 2023-07-23 09:55:39 · 93 阅读 · 0 评论 -
构建 Linux 内核
先决条件。原创 2023-02-07 00:16:58 · 1019 阅读 · 0 评论 -
事件处理Reactor模式
传送门 ==>> AutoSAR入门和实战系列总目录。原创 2022-08-24 11:28:51 · 154 阅读 · 0 评论 -
Linux scp命令
Linux scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。语法scp [ 可选参数 ] file_source file_target参数说明:-1: 强制scp命令使用协议ssh1-2: 强制scp命令使用协议ssh2-4: 强制scp命令只使用IPv4寻址-6: 强制scp命令只使用IPv6寻址。原创 2022-08-23 15:43:32 · 253 阅读 · 0 评论 -
【Linux进程间通信】基于共享内存的进程间的通信
顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc()分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。原创 2022-08-24 11:39:25 · 171 阅读 · 0 评论 -
什么是 Linux 进程、线程、轻量级进程和进程状态
Linux 自诞生以来已经发展了很多。在服务器和关键任务工作方面,它已成为使用最广泛的操作系统。尽管从整体上理解 Linux 并不容易,但有一些方面是 Linux 的基础,值得理解。在本文中,我们将讨论 Linux 进程、线程和轻量级进程,并了解它们之间的区别。最后,我们还将讨论 Linux 进程的各种状态。...原创 2022-08-31 14:41:09 · 545 阅读 · 0 评论