操作系统
文章平均质量分 96
李兆龙的博客
Distributed Systems & NoSQL & Linux Kernel / eBPF & Chaos Engineering
展开
-
关于跑满指定CPU时间片的一些细节问题
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言记得两年以前就和实验室的朋友们讨论过如何使得指定CPU跑到指定特定百分比,但可惜当时并没有令我信服的答案出现,两年以后再学习了Chaosblade,Chaos-mesh,stress-ng的部分源码以后终于可以说我知道这个问题该如何优雅的解决了。问题抽象一下,其实就是保证每秒某个CPU只跑到目前频率(不考虑变频)的百分比,其实满足此需求原创 2022-05-22 15:18:16 · 1551 阅读 · 0 评论 -
__attribute__((weak)) 妙用
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言__attribute__的官方描述是这样的:The keyword attribute allows you to specify special properties of variables, function parameters, or structure, union, and, in C++, class members原创 2021-06-11 18:04:54 · 722 阅读 · 0 评论 -
一个关于信号处理函数的小trick
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言最近闲来无事,开始回想大学两年半想玩而又没玩过的小玩意,一个有意思的念头几乎是瞬间浮现在脑海中,即用户态抢占式调度如何实现。这个问题其实就是前一阵某个比赛的一个题目,其实就是实现一个抢占式的用户态线程,这个玩意本身就属于一个比较Hack的东西,一般人闲的没事不会碰这个玩意。但是从某个角度来讲现在我并不能严格的算是一个一般人,毕竟一般人谁原创 2021-03-27 13:15:47 · 488 阅读 · 0 评论 -
对于 Direct IO 写放大现象的探究
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言这个问题出现在阿里一面中,说实话这问题一问就知道是电话那头是个高手了。不出所料,这个问题我没答出来,其实要是有提醒的话可能还有点机会,这种看着没见过名词猜意思确实有点麻烦。经过一些资料的查询,面试官所谓的写放大现象应该说的就是OS实际进行的IO次数大于用户态执行的IO次数。这其实是由于文件系统在磁盘中的组织结构造成的。使用df -T可以原创 2021-03-24 14:07:11 · 979 阅读 · 6 评论 -
条件判断语句与分支预测
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言写下这篇文章的原因是看到了[1]这个问题,虽然以前分支预测,但没想到在极端条件下对性能的影响如此之大。本来想就着自己的理解详细的描述下这个问题以及其答案,但是发现其实很多文章都已经完成了这个目标了,所以这篇文章就简单的聊一聊。问题描述首先就是看一段十分经典的代码:#include <algorithm>#include原创 2021-02-12 23:12:31 · 667 阅读 · 1 评论 -
浅谈内存屏障,C++内存序与内存模型
引言这个问题在我的计划中至少已经搁置十个月了,中间有多次下定决心想写一篇文章仔细的梳理一下其中的知识点,但是总是没有勇气动笔,究其原因就是因为对于这里的知识掌还是握度不够,怕写出来的东西成了流水账,贻笑大方。这段时间又仔细的重新思考了这个问题,终于是可以鼓起勇气简单的聊一聊这个问题了。首先参考欢神的理解,其实内存屏障很类似于CPU给用户提供的接口,因为其作用就是在保证缓存一致性效率的同时防止store buffer和Invaildate queue异步执行带来的一致性问题,这个问题在用户的角度来说通常原创 2021-01-19 16:05:43 · 2632 阅读 · 10 评论 -
操作系统学习笔记(全)
主要是北京交通大学操作系统课程视屏每一章后面问题的解答https://www.icourse163.org/learn/NJTU-10032450011.1 操作系统基础概念操作系统是最基本的系统软件,因为是软件,所以是程序的集合,这个程序的基本功能是管控计算机的软件和硬件资源的,进一步说,是有效的管理,体现在资源、利用率和系统吞吐量上,同时通过对各种任务作业进行合理的调度,来组织和控制系统的工作流程,这也是操作系统的内部实现机制。通过操作系统,用户可以更加方便地使用计算机。操作系1.5 操作系统的原创 2020-05-27 17:12:30 · 1665 阅读 · 0 评论 -
为什么目录不支持硬链接?
引言在大概去年十二月中旬的时候刘裕基学弟问了我这个问题,很遗憾当时并没有给出一个令人信服的解释,实在是愧疚不已。在鸟哥那本书上给出的原因说实话是有些让人迷惑的,因为书在实验室,我依稀记着书上给出的原因是如果目录要创建硬连接的话就需要在目录中的每一项上进行硬链接(可能记错了,等到学校再作修改)。说实话在我大一时看到这个书上的这个解释的时候非常疑惑,因为如果我们创建了一个指向目录的硬连接,事实上这个时候它们指向的文件控制块(FCB),也就是我们所说的inode(其实也就是盘块号)是相同的,意味着目录下的修改肯原创 2020-05-27 12:17:16 · 2864 阅读 · 3 评论 -
读写锁中写锁的饥饿问题
引言原创 2020-02-07 17:58:07 · 7401 阅读 · 3 评论 -
读者写者问题的优先级与读写锁的实际解决方案
文章目录引言问题描述读者优先读者-写者公平引言题目起来其实可以说清楚这个问题,但是确实是有点长。在看到读者写者问题的各种优先级解决方案(读者优先,写者优先,读者写者公平)以后联想到以前思考过的一个问题,即写锁饥饿问题(传送门),那个问题的本质就是读者写者的优先级问题,且当时找到的对应解法是比较优秀的解法,那篇文章描述的两种解法其实都是写者读者公平的方法。那么有所偏重的优先级解法该如何做呢?其实也很简单,这篇文章使用伪代码来做解释,注意使用信号量作为同步工具。这篇文章算是对这个问题的一个小总结,因为原来的原创 2020-05-19 18:55:17 · 2667 阅读 · 1 评论 -
进程的挂起状态解析
文章目录引言挂起状态是什么?挂起状态和阻塞状态有什么区别?如何主动挂起程序总结引言以前对于这个概念始终比较模糊,遂在解决后记录博客,希望帮助到有同样问题的朋友。挂起状态是什么?我们一般认为进程有五个状态,即新建态,就绪态,阻塞态,运行态,终止态。而在这些状态之外还存在着一个状态,我们称之为挂起状态,它既可以是我们客户主动使得进程挂起,也可以是操作系统因为某些原因使得进程挂起。总而言之引入挂起状态的原因有以下几种:用户的请求:可能是在程序运行期间发现了可疑的问题,需要暂停进程。父进程的请求:原创 2020-05-16 19:53:48 · 30675 阅读 · 9 评论 -
进程与程序
引言这两个概念确实很容易让人混淆,但其实是不太一样的。区别进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因原创 2020-05-16 17:37:32 · 1831 阅读 · 0 评论 -
编写安全的信号处理函数
引言我们都知道signal函数可以对我们设置的特定信号进行特定的操作,但这不意味着我们可以随心所欲的设置处理函数,信号处理函数通常很麻烦,因为它不但与主程序之间是并发的,而且与其他的信号处理函数并发,这就意味着会出现一个问题,如果他们访问了同一个全局变量,上一个程序已经把这些信息存入程序的上下文中,与之并发的程序又修改了这个信息,这显然会产生不可预料的结果,所以程序员有义务编写一个安全的信号处理...原创 2019-08-03 13:40:44 · 857 阅读 · 0 评论 -
my_shell中的信号处理函数
引言shell这个程序完成已有三周了 但是今天又对shell中的一些部分有了新的理解 遂进行记录 也给后面写这个程序的朋友提供一些新的思路信号处理函数是一个说容易容易 说麻烦麻烦的点 在shell中的基础要求是对 SIGINT 信号进行屏蔽 其中的坑点我已经在另外一篇博客进行分析编写安全的信号处理函数今天来说说另外一个值得注意的地方 进程执行完之后的处理 其实说白了就是处理僵尸进程 但是我...原创 2019-08-18 21:56:34 · 554 阅读 · 0 评论 -
为什么会发生段错误(核心已转储)
引言无论你是一个刚接触计算机的小白,还是一个久经沙场的大牛,相信你一定曾被段错误这个问题困扰过,这些问题有些是有低级的错误引发,当然也很好修改,通常动动手指头就OK了,但有些错误则是十分隐晦,通常难已发现。如果让我来说段错误 其实大多数时候出现它并不是坏事,相同情况如果不出现段错误,那才是坏事。为什么会出现段错误系统发送 SIGSEGV 信号给出现段错误的程序,信号本质上是一种软件形式的异常...原创 2019-08-19 13:27:44 · 37447 阅读 · 8 评论 -
程序计数器是什么(PC)
引言在学习操作系统的时候很多时候都可以看到程序计数器的身影,但是对于程序计数器的概念一直是模模糊糊,今天算是弄懂了何为PC,遂记录一篇博客。程序计数器是什么 PC(program counter)在百度中找到的解释是这样的:在CPU控制部件中的程序计数器(PC)的功能是用于存放指令的地址。程序执行时,PC的初值为程序第一条指令的地址,在顺序执行程序时,控制器首先按程序计数器所指出的指令地址...原创 2019-08-19 19:45:45 · 25521 阅读 · 3 评论 -
为什么未初始化数据段不储存在磁盘中
引言第一次接触到这个问题是在刚刚接触进程时 看到这条概念不禁非常迷惑 虽然当时查了些资料有了一些了解 但还是马马虎虎,知道学习了操作系统才对这条概念有了更深的认识 遂记录一篇博客我们知道我们所写的代码在进过编译器和汇编器以后已经成了一个二进制文件,术语叫做可重定位目标文件ELF(Executable and Linkable Format),它的组成包括一个ELF头与很多的节像图片中的 ....原创 2019-08-21 17:58:32 · 863 阅读 · 0 评论 -
内存分配器详解及C语言实现
引子在有些特殊的情况下我们没有办法确定我们程序中要使用的数据大小 但我们又不想一次将数组这种数据结构开的过大 因为我们的内存毕竟是有限的 那该怎么办呢 没错 就是动态内存分配,C语言中是malloc 与 free C++中是new 与 delete ,我们还知道动态内存是在堆上分配的,而且是一条链表(怎么样的链表呢 我们后面会说),底子更好的同学还知道malloc实际上就是调用了mmap函数与s...原创 2019-08-27 17:23:58 · 4562 阅读 · 3 评论 -
浅析链接
引言我们都知道一个程序从我们的一个文本文件转化成一个可执行目标文件要经历预处理,编译,汇编和链接四个过程,理解这其中的过程有不仅利于我们写出一个更加健壮,高效的程序 ,而且能在错误时快速定位,成为一个大牛程序员(向之奋斗)首先我们要清楚链接这个过程究竟干了些什么,我们知道到链接这一步时链接器拿到的是一组可重定向的目标文件,注意是一组,因为我们的程序不仅仅是一个文件,大多数情况下包含多个文件,而...原创 2019-08-31 20:08:53 · 277 阅读 · 0 评论 -
静态链接库与动态链接库
引言想要了解链接的过程就不得不了解什么是静态链接库与动态链接库 它们都在其自身角度解决了一些困难的问题 接下来我们就来看看究竟什么是静态链接库与动态链接库以及其作用浅析链接静态链接库我们知道在链接的过程中并不是只有我们的代码而已 在绝大多数情况下要用到安全稳定的标准库(大多数情况),那我们就要把库的代码拿到我们的的代码中来 我们知道在链接阶段已经得到了一张符号表 所以我们要做的就是把引用与...原创 2019-08-31 21:47:05 · 351 阅读 · 0 评论 -
SIO包是什么
SIO包是什么首先SIO包并不是一个标准库中的函数集合,这是CSAPP中为了方便样例讲解而创建的一个代码库中的一些函数的集合,我们的linux中默认肯定是没有的 需要我们自己去导入,怎么导入呢,其实很简单,就是把代码拉下来放到/usr/include这个目录当中,然后当我们需要使用时就可以当做一般的函数库来使用了这是csapp.h的源码这是csapp.c的源码SIO包中的函数平时能用的上...原创 2019-08-03 13:39:32 · 2002 阅读 · 0 评论