感悟篇: 阅读 Unix 分时系统的进化

论文名: The Evolution of the Unix Time-sharing System -- Dannis M. Ritchie

丹尼斯-里奇 回顾了与 肯-汤普森 等在贝尔实验室创造 Unix 的历程, 然后介绍了一下 Unix 中最重要的几个部分, 包括:

文件系统

  1. i-list: 一个由 i-nodes 组成的数组, 每个 i-node 描述一个文件. i-node 里包含文件的元数据: 例如保护模式, 类型和大小, 以及内容所在的物理位置.
  2. 目录: 一种特殊的文件, 包含了一系列的文件名以及相关的 i-number.(我觉得 i-number 应该就是 i-node 的 ID 吧)
  3. 特殊的文件用于描述设备. 特定的 i-number 对应特定的设备.

进程控制机制

shell 执行命令的大概的步骤是这样:

  1. shell 从终端读取命令
  2. 新建一个进程
  3. 子进程执行命令
  4. 同时, shell 开始等待直到子进程执行完毕
  5. shell 回到第一步

感觉挺有趣的, 我用 elixir 模拟了一下:

defmodule MF.PC do
  def loop do
    cmd = IO.read(:line)
    pid = self()

    spawn(fn ->
      exec(cmd, pid)
    end)

    wait()
  end

  defp exec(cmd, pid) do
    send(pid, {:done, String.upcase(cmd)})
  end

  defp wait do
    receive do
      {:done, msg} ->
        IO.puts(msg)
        loop()
    end
  end
end

无论输入什么, 都返回大写的输入.

iex(2)> MF.PC.loop
hello
HELLO

how are u
HOW ARE U

fine
FINE

good bye
GOOD BYE

好吧, 挺无聊的, 只是理解一下Unix 里进程消息传递的模式.

论文里提到很好玩的一个 bug, 就是一开始 chdir 命令, 也就是 cd, 也是像上面那样执行的, 结果, 只有子进程的工作目录变更了, 对 shell 本身完全不起作用. 所以他们把 cd 变为特殊命令, 只在当前进程里执行.

论文里还提到一个有趣的 bug, 如果在一个脚本文件 "comfile" 里有如下命令:

ls
who

然后我们在 shell 里执行:

sh comfile >output

预想的结果是 lswho 的执行结果被依次写入到 output 文件中. 但实际上, 由于最初 unix 将文件的 io指针保存在了执行 "打开文件" 的进程里, 也就是主 shell 进程, 而执行写入操作的, 是我们用 sh 命令开启的子 shell, 所以文件的 io指针始终没有变化, 导致who的输出把 ls的输出覆盖了. 为了修复这个问题, 他们在系统中添加了一个表, 保存了全部的打开状态的文件的 io 指针.

说个题外话, 我突然想到在 elixir 里好像不能指定文件的写入位置, 查了一下是可以的:

iex(4)> :file.read_file "comfile"
{:ok, "ls\nwho\n"}
iex(5)> {:ok, device} = :file.open "comfile", [:raw, :write]
{:ok,
 {:file_descriptor, :prim_file,
  %{
    handle: #Reference<0.1011150086.1394212882.243351>,
    owner: #PID<0.110.0>,
    r_ahead_size: 0,
    r_buffer: #Reference<0.1011150086.1394212865.243949>
  }}}
iex(6)> :file.pwrite(device, 1, 'hello')                  
:ok
iex(7)> :file.read_file "comfile"                           
{:ok, <<0, 104, 101, 108, 108, 111>>}
iex(8)> <<104, 101, 108, 108, 111>>
"hello"

最后是还提到了一下管道操作符 | 和 C 语言的来历.


log of think
Thinking , writing, hair losing.

周一到周五,每天一篇老停更

286 声望
97 粉丝
0 条评论
推荐阅读
不完美的现实,计算机的妥协----关于电子现金系统的一些论断
完全的不可撤回的系统是不可能实现的。因为金额过大的交易会需要 AML(反洗钱)的监管,无论上从实际出发,还是从法律角度,都需要金融机构和其他代理人记录必要的信息。需要被调解的纠纷是始终存在的。

Ljzn阅读 377

2022风云变幻的一年,我开始思考生活的意义
2022 年对所有人来说,是束缚的一年、也是艰难的一年。这一年疫情起起伏伏,商场歇业,饭店关门,在工作之余吃一碗热乎的刀削面也成了奢侈。对一个北漂来说,“回家”和“进京”从未如此艰难。假期好不容易回趟家,结...

杨成功9阅读 1.3k评论 1

封面图
技术社区的朋友们,让我们在 2050 团聚吧!
提到 2050 你会想到什么? ——第一批 00 后步入 50 岁,刚刚出生的孩子们成为这个世界的中流砥柱;如科幻般的世界:上天下地、无尽探索、发达的医疗、先进的交通;

SegmentFault思否5阅读 12.9k评论 1

百度搜索首届技术创新挑战赛有奖征文|分享百度搜索大赛
有人举手发问:海克斯科技是什么梗?还有人举手发问:KFC🍗打工可以偷吃几块不? 爱美的人问:怎么去除很早一以前的痘印,那块有点黑。北方的朋友也会向南方的朋友发问:大蟑螂🪳是什么呀?南方的朋友也会对奇北方...

SegmentFault思否5阅读 15.7k

封面图
工作 7 年的老程序员,现在怎么样了
我考上大学(2010年)之前也是这么过的。第一年哥哥给买了个一台华硕笔记本电脑。那个年代买华硕的应该不少,我周边就好几个。有了电脑之后,室友就拉着我一起 cs,四个人组队玩,那会觉得很嗨,上头。

六七十三4阅读 1.1k评论 5

世界杯火热进行中, 用一个div画个足球场助助兴
四年一度的世界杯正在火热进行中,有没有熬夜看你喜欢的队伍比赛呢。在这欢庆的氛围中,我决定用代码参与一把世界杯,擦边参与,那就是用CSS画一个足球场,正常的用CSS布局肯定是非常easy的,所以决定只用一个div...

南城FE6阅读 1.1k评论 2

封面图
送走跌宕起伏的2022,迎接拨云睹日的2023
岁至年末,是时候为即将过去的2022做一个总结了。在即将过去的这一年,想必大家的经历应该都不平凡,毕竟不平凡的2022就不会让大家平凡的度过,我也是不平凡度过的其中一位。已经写了好几年的年终总结,虽然这几...

三掌柜4阅读 1.1k

封面图

周一到周五,每天一篇老停更

286 声望
97 粉丝
宣传栏