蜗窝科技

蜗窝科技

蜗窝科技 —— 嵌入式 Linux 内核技术笔记与讨论存档

共 373 篇技术笔记(2014–2026)· 讨论区存档(163 个主题) · 数据下载

Linux内核的自旋锁

作者:沙漠之狐 · 发布于 2019-05-17 19:11 · 内核同步机制

自旋锁用于处理器之间的互斥,适合保护很短的临界区,并且不允许在临界区睡眠。申请自旋锁的时候,如果自旋锁被其他处理器占有,本处理器自旋等待(也称为忙等待)。 进程、软中断和硬中断都可以使用自旋锁。 自旋锁的实现经历了 3 个阶段: (1) 最早的自旋锁是无序竞争的,不保证先申请的进程先获得锁。 (2) 第 2 个阶段是入场券自旋锁,进程按照申请锁的顺序排队,先申请的进程先获得锁。 (3) 第 3 个

阅读全文 » · 标签 Linux自旋锁锁 · 评论 13 · 浏览 28165

浅谈Cache Memory

作者:smcdef · 发布于 2019-05-02 21:14 · 内存管理

今天探究的主题是cache。我们围绕几个问题展开。为什么需要cache?如何判断一个数据在cache中是否命中?cache的种类有哪些,区别是什么?

阅读全文 » · 评论 54 · 浏览 62609

内存一致性模型

作者:passerby · 发布于 2019-03-24 14:22 · 内存管理

早期的 CPU 是通过提高主频来提升 CPU 的性能,但是随着频率“红利”越来越困难的情况下,厂商开始用多核来提高 CPU 的计算能力。多核是指一个 CPU 里有多个核心,在同一时间一个 CPU 能够同时运行多个线程,通过这样提高 CPU 的并发能力。 内存一致性模型( memory consistency model )就是用来描述多线程对共享存储器的访问行为,在不同的内存一致性模型里,多线程对

阅读全文 » · 标签 内存一致性模型 · 评论 12 · 浏览 26905

copy_{to,from}_user()的思考

作者:smcdef · 发布于 2019-01-27 19:03 · 内存管理

我们对copy_{to,from}_user()接口的使用应该是再熟悉不过吧。基本Linux书籍都会介绍它的作用。毕竟它是kernel space和user space沟通的桥梁。所有的数据交互都应该使用类似这种接口。所以,今天我们一起探究下 copy_{to,from}_user() 接口的作用。通过本文可以解答以下问题。 为什么需要copy_{to,from}_user(),它究竟在背后为我们

阅读全文 » · 标签 copy_to_user · 评论 15 · 浏览 26546

编译乱序(Compiler Reordering)

作者:smcdef · 发布于 2019-01-23 22:59 · 内核同步机制

编译乱序(Compiler Reordering) 编译器(compiler)的工作就是优化我们的代码以提高性能。这包括在不改变程序行为的情况下重新排列指令。因为compiler不知道什么样的代码需要线程安全(thread-safe),所以compiler假设我们的代码都是单线程执行(single-threaded),并且进行指令重排优化并保证是单线程安全的。因此,当你不需要compiler重新排

阅读全文 » · 标签 barrier · 评论 17 · 浏览 19635

CFS调度器(6)-总结

作者:smcdef · 发布于 2019-01-01 12:37 · 进程管理

CFS调度器-总结 经过前面一系列的文章描述,我们已经对CFS调度器有了一定的认识。那么本篇文章就作为一篇总结和思考。我们就回忆一下CFS调度器的那些事。我们就以问题的形式重新回顾一遍CFS调度器设计的原理。现在开始,我们问题来了。

阅读全文 » · 标签 CFS · 评论 7 · 浏览 19437

CFS调度器(5)-带宽控制

作者:smcdef · 发布于 2018-12-22 15:07 · 进程管理

前言 什么是带宽控制?简而言之就是控制一个用户组在给定周期时间内可以消耗CPU的时间,如果在给定的周期内消耗CPU时间超额,就限制该用户组内任务调度,直到下一个周期。限制某个进程的最大CPU使用率是否真的有必要呢?如果一个系统中仅存在一个进程,限制该进程使用CPU使用率最大50%,当进程使用率达到50%的时候,就限制该进程运行,CPU进入idle状态。看起来好像没有任何意义。但是,有时候,这正是系

阅读全文 » · 标签 CFSbandwidth · 评论 13 · 浏览 30977

CFS调度器(4)-PELT(per entity load tracking)

作者:smcdef · 发布于 2018-12-02 15:40 · 进程管理

为什么需要PELT? 为了让调度器更加的聪明,我们总是希望系统满足最大吞吐量同时又最大限度的降低功耗。虽然可能有些矛盾,但是现实总是这样。PELT算法是Linux 3.8合入的,那么在此之前,我们存在什么问题才引入PELT算法呢?在Linux 3.8之前,CFS以每个运行队列(runqueue,简称rq)为基础跟踪负载。但是这种方法,我们无法确定当前负载的来源。同时,即使工作负载相对稳定的情况下,

阅读全文 » · 标签 PELT · 评论 15 · 浏览 30737

CFS调度器(3)-组调度

作者:smcdef · 发布于 2018-11-10 20:43 · 进程管理

前言 现在的计算机基本都支持多用户登陆。如果一台计算机被两个用户A和B使用。假设用户A运行9个进程,用户B只运行1个进程。按照之前文章对CFS调度器的讲解,我们认为用户A获得90% CPU时间,用户B只获得10% CPU时间。随着用户A不停的增加运行进程,用户B可使用的CPU时间越来越少。这显然是不公平的。因此,我们引入组调度(Group Scheduling )的概念。我们以用户组作为调度的单位

阅读全文 » · 评论 24 · 浏览 35307

CFS调度器(2)-源码解析

作者:smcdef · 发布于 2018-10-21 20:55 · 进程管理

前言 经通过上一篇文章《CFS调度器-基本原理》,我们可以了解到CFS调度器基本工作原理。本篇文章主要集中在Linux CFS调度器源码解析。 注:文章代码分析基于Linux-4.18.0。

阅读全文 » · 标签 CFS · 评论 43 · 浏览 38482