曾经有位老师问过:在 Linux 的 Shell 中运行程序时,操作系统是怎样对程序进行处理的吗?
我当时回复是这样的:操作系统对 Shell 的执行,是靠 Shell 解释器完成的。在操作系统运行后,Shell 解释器本身就加载并运行了。其中如 pwd,cd 这些是内部命令,本质是函数调用,可以直接使用。ls 这些是外部命令,需要 fork 一个新进程执行当前命令。一个 Shell 脚本,有很多个这些内外部命令组成,通过 Shell 解释器逐行解释完毕后执行。Shell 解释器也是一个应用程序,本质是一个 C 程序,不过在该程序中,手动模拟了函数调用栈,和 JVM 有相似之处。所以 Shell 解释器,也有静态库/动态库/静态链接/动态链接这些,为 Shell 命令的执行保障护航。
现在看起来,当时的回复虽然没有大的问题,但还是不够。只是浅表的认知了 Shell 解释器的用途,但是对 Shell 并没有深刻的理解。
最近看到子 Shell(SubShell),发现 Shell 和进程之间的关系非常密切。可以从进程的角度来理解操作系统是怎么运行 Shell 的
这篇文章的目的,是让你只关心 Shell 脚本的语法,而其他细节,都变成顺理成章。其实各个高级语言也都是这样,语言本身其实并不难,像工具一样使用而已。

一年前写了“段页内存管理”的部分章节,后面一直搁置在草稿箱中。最近发现内存相关的知识非常重要,最近几十年科技文明的巅峰,硬件侧就是 CPU,软件侧就围绕着操作系统对内存的控制了。就又整理补齐,形成内存分段分页较完整说明。
硬件 CPU 的不断革新,从 X86 和 ARM 架构的铺天盖地,到 RISC-V 新星崛起和 MIPS 的消退。还有各种流水线优化、APU-ZPU 的推成出新,以及 Apple M1 的展露头脚。虽然 CPU 本身短时间内看不到跨越式的提升,但 CPU 周边是玩出了花。
而已经趋于稳定的操作系统,最近好多年都没有啥惊世骇俗的壮举出现。依托着 CPU 侧的大腿,操作系统躺着进行升级。但换一个角度,也可以认为操作系统已经设计的足够完备,在商业化的时代,有需求就一定会有满足,或许对于当前操作系统来说,目前的设计应对有余。
操作系统的很多设计,都摆脱不了内存这尊大神。首先,操作系统本身和上层应用,就是放在内存里运行的。其次,操作系统的基石进程和线程,就贴着内存进行设计。多核心后的 L0-2 级缓存同步也是为内存定制,当然这个算 CPU 对内存的依赖。IO/文件系统/网络也都离不开内存的影子。
内存本身的制作工艺门槛不高,有 N 多厂商做这个事情。但内存在科技长河中的位置,绝对举足轻重。整个计算机的发展史,内存表现不多,但是中流砥柱。
本文可以顺带解决如下几个问题:

  • 地址总线、数据总线、控制总线是什么?CPU 如何通过地址总线找到内存地址?
  • CPU 和内存之间的高速缓存引发的缓存一致性问题是怎么回事?锁 - 共享数据安全指↑
  • 16 位 CPU 是如何操作 1M 内存空间的(2^16=64kb)?32 位 CPU 是如何操作 64G 内存空间的(2^32=4G)?他们的原理一样吗?
  • 分段内存管理,里面的段指的是什么?
  • 除了虚拟地址、物理地址,还有线性地址和逻辑地址,它们是什么?
  • 两个进程的虚拟地址相同,是如何指向不同的物理地址的?虚拟地址的页目录&页偏移均一致,如何通过 m = f(n) 函数,以相同的 n 输入,返回不同的 m 输出。

推荐书:《汇编语言》-王爽、《程序员的自我修养-链接装载与库》-俞甲子
推荐网文:《深入浅出计算机组成原理》-徐文浩、《操作系统实战》-LMOS、
一定要读的另一篇内存文章:锁 - 共享数据安全指↑
内存相关的知识非常重要,需要很大篇幅和示例图来阐述。在锁 - 共享数据安全指↑中文字数超过了 4W,本文的文字数也超过了 1W,均需要多张配图。重要性和难理解程度,都很高。

又一年中秋过去了,时间过的真快!中秋节的几天假,我是算着日子过的。准确来说,近几个月的节假日,我都是计算着过去了几个小时又过去了几天。我艰难的珍惜着时间,算计着时间的流逝,心里压力很大,劳累无穷。
因为有件事情需要落地,只有节假日这些非工作的时间才能够静下心来忙碌。最近又拖延症犯了,心里总想着那件没落地的事情,大山越压越重,就非常疲惫。
这次的中长期计划和预期差距较大,我也做了复盘,发现有很多需要注意的点值得记录。可以为大大小小的耗时耗力又重要的计划摆正方向。

健康 / 心情 / 拖延症 / 拥抱变化 / 分轻重 / 专心做好一件事 / 拆解计划 / 被计划推着前进

健康

健康非常重要,感觉身体跟不上了,那锻炼的时间就是立刻马上,就不要管那些还没有完成的事项了。
因为身体非常重要,而锻炼事项通常耗时较短,这就是第一优先级。那些未完成的事项可能动不动就是几小时或者几天,相比来说可以拖一拖。
睡眠时间,一定要分配好。靠脑子吃饭的人,不要吝啬自己的睡眠时间。这里不是说不要熬夜晚睡,是要保障睡眠时间。
睡眠不足大脑不在状态,绝对非常耽误事。思考能力下降会带来各种问题,扣着点时间不值得。

时间,永远不会成为你的朋友。它会从前面拉着你,从后面推着你,有时候温文尔雅的放任你像个君子,有时候拿着皮鞭抽打下来像个魔鬼,最后把你拖到年老与色暮,拖到离别和死亡。在生命的最后一刻,有不甘,有妥协,但是时间何曾念及你是它的盟友或者朋友?

我最近几年,真的是怕了时间了。也不是贪生怕死之类的情绪,真遇到突发性的死亡谁都得尿下裤子。更多的是纯粹的对时间的恐惧。
时间它有时候像个女人一样慢慢推着我,有时候像个男人一样粗鲁的拉着我,它一直在逼着我做点什么。当我停下来单纯就在休息的时候,我就感觉到它在我面前盯着我,让我做点什么。
你还记得失恋后,你是怎么释怀的吗?即使当时多么的撕心裂肺。以及很严重的手术后,身体怎么恢复的吗?失恋和手术,都不会一两天好转,可就是不知道什么时候开始,就恢复了。

这些年,发生了很多意想不到的变化。比如之前上厕所一定要用蹲坑,现在也习惯马桶了。还有进屋穿鞋,之前我是想着以后有房子了,进屋也要穿鞋才不硌脚,现在是自觉的脱鞋进屋了。还有游戏,我几波起伏,从小学痛恨到中学迷恋到后来的无感,现在又给孩子买了 Switch。对游戏有很多次认知上的翻转。
总体下来,自以为的底线被不断翻篇。不知道这些年发生了什么,可就是实打实的变化着。变化的方向说不上好也说不上坏,谁知道过几年会不会再次变化呢。

前两天,我和同事需要做一个功能,是把 js 前端保存到 app 本地的图片给读取出来。桥接层只有一个 saveFile 函数可供使用,定义如下:

1
2
3
saveFile(string name, string content) {
// xxx
}

我同事说可以让前端把 jpg 图片直接保存,我们直接去拿图片就好了。看这个接口的入参是 string 类型,我说这可能不行,得依靠 base64。同事想了一下,说图片也是二进制存储的,和文本形式上是一样的,应该有一种方式把 jpg 图片转一下,然后就可以通过这个接口保存到本地并且还是 jpg 的图片。
然后呢,我就想到了很多年前,我向另一个同事说需要一张 png 图片,这种 jpg 的不行。然后同事给了我 png 图片后,我这边问题还是无法解决。查了很久的 bug,发现同事是把 .jpg 的后缀改成了 .png 然后给我的 :(
所以呢,这次还是继续聊下编码。之前有聊过一次,也比较深入了,详见 计算机 Unicode 编码终结,那片对文本编码做了详解。这次我要聊聊二进制文件和文本文件的存储差异。二进制文件有常见的图片文件和应用程序的可执行文件。

最近我的职场上发生了很多事,想痛快的表达出来。鉴于时间真的不多,就算草草的一篇水文当作备忘吧。

大老板这两年换了几波,越高层的变动对我们这些底层的影响越小。这次换的是我大部门的老板,这影响就有些大了。最近这两天邮件时不时的在夜里 20 - 24 点之间收到月报提醒,原来只有小部门老板才发月报,现在是 team leader 也需要发了,有些团队看样子是全员发。我自然不反对月报这种总结的形式,我自身每周都有2-3次的日回顾。但是这种大部门内部上百人公晒的形式,就有些上纲上线的形式了。这已经变成了一种形式,虽然大家月报的内容没有变化,但性质发生了变化,更多的是一种对高层的委屈妥协。虽然变化总所难免,但很多不舒服的变化一起扑面而来,就让人心情很沉重了。

这都到年中了,公司的毕业还在继续,火还在继续烧。这两天轮到我这边了,团队内部做业务分工的调整,我被划到了另一个团队。后面我和老板说了自己的想法,老板也很尊重我,同意我横向保留现有的工作内容,过了两天说维持我的组织架构不做调整,我也避免了换岗。我接触了两天另外团队的老板,发现管理方式还是有些大的,PUA、高度卷都有发生。工作群里鼓励周末上线需求的同学说是战斗力、运营配置的资源文件要识别有没有cdn加速说这是基操等等。联系到最近上班不断提前,下班不断推迟,开始注重工时代码量,以及部门渲染出来的压抑气氛,这肯定有一场大风要吹来啊,只是会有人起,也会有人落。

最近偶然看到人生的痛苦在于追求确定性这句话,感应非常强烈。我一直想用一个词或者一个简短的话,来描述和表达我两年来观察到的一个现象,可一直找不到,这下找到了,也就记录下来。我认为不确定性这个词,将影响我的余生。

几个月前的一个夜晚,我深度思考过这个问题,就是当发生了一些不在预期内的事情的时候,不同人的处理态度是完全不一样的。
当不可预期的事情发生后,需要做决策,有人是立刻选一个,效率非常高,不管利弊都依照这个选择继续走下去。有人呢,是立刻停下来,花费很长的时间开始思考该怎么办,在经过长时间的权衡利弊之后痛苦的做一个选择,还有的人就不知所措,因为事发突然就破罐子破摔的宣泄郁闷脾气,然后故意把这件事往后面拖,拖到不能拖的时候再处理。
已经规划好的事情,做到一半,突然就面临抉择,这是很让人不爽的。就像旅游的路线图设计了好几天,真在旅游的时候,发现旅途中计划乘坐的公交车临时取消运营了。类似这样的抉择,每时每刻都在面临。

昨天,看一个知识点的时候,看到了概率论知识。发现概率的符号不认识了。就网上想着查一下,不查不要紧,一查发现没有认识的符号了。当年初中高中也都学习过的知识,工作这些年忘的杂七杂八了。抱着复习一下的态度,断断续续的看了近 8 个小时,才捡回来一些。

这 8 个小时,我把初中、高中的人教版数学教材都下载了,跟着目录找自己需要的知识点。看目录的时候,没有有印象的记忆了。啥 n 元 n 次方程式和函数这些基本的概念都忘记了。更别说开方、指数、对数、导数这些运算了,还有那些解析几何,看的云里雾里的。不得不说,真不知道那些年都是怎么过来的。

数学这门课是非常重要的,我认为应该放在学生的 Top1 位置。现在很多人的脑子像浆糊一样,连基本的认知都没有,就是因为数学不好。基本见到这样的人,大概率判断数学成渣。这样的杠精,思维已经固化,只能躲开。
因为数学和逻辑思维能力是正相比强相关的,数学学深肯定难,但学会并不难。
只要有初步的逻辑思维能力,能够根据已有的基础来推导现有的知识,那么逻辑能力就满足了。比如导数和曲线面积,能够在求曲线面积的过程中,对导数和原函数做公式的代入,理解导数可以解决不规则面积问题,这就是逻辑推导能力。再比如 n 元 n 次方程式的解法,可以通过公式笔算和画坐标图求解来做,就能做到思维活跃了。

这里是工作中的软件清单,可以使得工作愉悦和提效。
还有一份生活清单可以点这里

终端命令工具

  • brew 神器,mac 必备。90% 的软件都靠它。
  • zsh & autojump & zsh-autosuggestions & zsh-syntax-highlighting
  • vim & neovim & SpaceVim
  • tree 快速查看目录和文件
  • TLDR to long donot reader,命令组合提示好工具
  • ranger 终端文件夹浏览器

做决定还是应该慎重的。
有些人很果断,遇到事情会立刻做出选择,不犹豫。这本身是好事,可如果对选择过程不加以分析,那就是概率性问题嘛,选择的恰当性五五分。我老婆就是这样的人,所以我理解的很深刻。
每年的开年,朋友圈也都能看到一些 Flag,我认为能列出 3-4 个就已经相当不错了,何况 10+。时间是很可怕的妖魔,一年时间很快就过去了。不求多,但求精吧。

我对改变的总结是,人在每个年龄段,都会有不同的想法和认知。改变,应该是在自知的前提下作出的决定,千万不能贸然行动。改变不一定说朝着好的方向走,人各不同,已有的行为习惯不一定是坏的,只是说在当前的自我认知下,可以做出更符合当前的自身情况也会带来更大收益的改变。

鉴于我目前对自己的认知,想列一些 Flag,作为对自己中长期的约束。
考虑到一个月或者一年后,可能还会有一些改变。所以本文作为只新增不删除修改的迭代文,每次更新加上时间标记。

0%