这文章记录一些关于计算机的知识,我觉得程序员应该可以看看,大部分都是抽象,我们在写代码或者在做程序的时候,不用在乎底层知识,我们只需要写,编译器会帮我们处理成想要的样子,我觉得硬件底层是很复杂的一个东西,它不仅仅是编程的逻辑判断,还有物理知识,电的知识,这篇文章是一个个抽象来理解计算机,所以我们不用关心底层什么 ALU,或者 计算等等。

视频

这篇文章不只是记录,也写包括我的理解,可能不是很对,有错误请给提 issues。

感谢CrashCourse 字幕组 以及 Crash Course 你们很棒

操作系统

   1940,1950年代的电脑,每次只能运行一个程序,程序员在打孔纸卡上写程序,然后拿到一个计算机房间,交给操作员,等计算机空下来了,操作员会把程序放入,然后运行,输出结果,停机,以前计算机慢,这种手动做法可以接受,运行一个程序通常要几小时,几天甚至几周,接上集计算机越来越快,越来越快,指数级增长!很快,放程序的时间 比程序运行时间还长,我们需要一种方式,让计算机自动运作,于是操作系统诞生了


操作系统,简称 OS ,其实也是程序,但它有操作硬件的特殊权限,可以运行和管理其他程序。

操作系统一般是开机第一个启动的程序,其他所有程序都由操作系统启动

   第一个操作系统,加强了程序加载方式,之前只能一次给一个程序,现在可以一次多个,当计算机运行完一个程序,会自动运行下一个程序,这样就不会浪费时间,找下一个程序的纸卡 。 这叫 批处理

   电脑变得越来越便宜,开始出现在世界各地,特别是大学和政府办公室,很快,人们开始分享软件,但有一个问题,在 哈佛一号 和 ENIAC 那个时代,计算都是一次性的。程序员只需要给那 “一台” 机器写代码。处理器,读卡器,打印机都是已知的。但随着电脑越来越普遍,计算机配置并不总是相同的,比如计算机可能有相同 CPU ,但不同的打印机,这对程序员很痛苦,不仅要担心写程序,还要担心程序怎么和不同型号打印机交互,以及计算机连着的其他设备,这些统称 “外部设备”

和早期的外部设备交互,是非常底层的,程序员要了解设备的硬件细节,问题是:程序员很少能拿到所有型号的设备来测代码,所以一般是阅读手册来写代码,祈祷能正常运行,现在是 即插即用,以前是 “祈祷能用” 。

这很糟糕,所以为了程序员写软件更容易,操作系统充当软件和硬件之间的媒介,更具体地说,操作系统提供 API  来抽象硬件,叫 “设备驱动程序”

程序员可以用标准化机制 和 输入输出硬件(I/O)交互 比如,程序员调用 print(hi) 操作系统会处理 输到纸上的具体细节。

操作系统(多任务处理)

   随着发展,电脑已经非常快了,处理器经常闲着,等待慢的机械设备(比如打印机和读卡器)程序阻塞在 I/O 上,而昂贵的处理器则在度假,就是放松啥也不做。(世界上第一台超级计算机)Atlas 他们知道机器会超级快,所以需要一种方式来最大限度的利用它。 他们的解决方案是一个程序叫 Atlas Supervisor 于 1962年完成。


   这个操作系统不仅像更早期的批处理系统那样,能自动加载程序,还能在单个 CPU 上同时运行几个程序,它通过 调度 来做到这一点。

假设程序员运行 print 函数需要一点时间,大概上千个时钟周期,但因为打印机比 CPU 慢,于其等着它完成操作, Atlas 会把程序休眠,运行另一个程序。

最终,打印机会告诉 Atlas,打印已完成,Atlas 会把程序标记可继续运行,之后在某时刻会安排给 CPU 运行,并继续 print 语句之后的下一行代码,这样, Atlas 可以在 CPU 上运行一个程序,同时另一个程序在打印数据,同时另一个程序读数据。


这种方式使多个程序可以同时运行,在单个 CPU 上共享时间,操作系统的这种能力叫 “多任务处理”

同时运行多个程序有个问题,每个程序都会占一些内存,当切换到另一个程序时,我们不能丢失数据,解决办法是 给每一个程序分配专属内存块

真正的程序可能会分配到内存中数十个地方,如果存在一堆不连续的内存块里,为了隐藏这种复杂性,操作系统会把内存地址进行 “虚拟化”

这叫虚拟内存,程序可以假定内存总是从地址 0 开始,简单又一致,而实际的物理位置 被操作系统隐藏和抽象了


用程序 B 来举例,它被分配内存地址 1000 到 1999,这种机制使程序的内存大小可以灵活增减叫 “动态内存分配” 对程序来说,内存看起来是连续的。

它简化了一切,为操作系统同时运行多个程序提供了极大的灵活性,给程序分配专用的内存范围。

另一个好处是 这样隔离起来会更好,如果一个程序出错,开始写乱七八糟的数据。它只能捣乱自己的内存,不会影响到其他程序。 这叫 “内存保护” 防止恶意软件(如病毒)也很有用。

(防止程序员使用指针等内存地址工具时误修改重要程序内容,造成电脑出错)

这让我想起了 CE,我当时用它只是改改游戏,有时间看看能不能搞搞操作系统。

计算机

计算机不仅能同时运行多个程序,还能让多用户能同时访问,多个用户用 “终端” 来访问计算机

终端只是键盘+屏幕,连到主计算机 终端本身没有处理能力,

  冰箱大小的计算机可能有 50 个终端,能让 50 个用户使用,这时操作系统不但要处理多个程序,还要处理多个用户,为了确保其中一个人 不会占满计算机资源,开发了 分时操作系统。意思是 每个用户只能用一小部分处理器,内存等。(因为电脑很快,即使拿到 1/50 的资源也足以完成许多任务)(我有一个问题,在我的电脑中,我 C 盘资源满了,为什么就变得很卡了?)

unix C语言之父 祖师爷

Dennis 和 Ken Thompson 联手打造新的操作系统 unix

他们想把操作系统分成两部分:

首先是操作系统的核心功能,如内存管理,多任务和输入/输出处理这叫 “内核”

第二部分是一堆有用的工具,但它们不是内核的一部分(比如程序和运行库)

蓝屏

缺乏内存保护,当程序运行不当时,就会蓝屏,代表程序崩溃的非常严重,把系统也带崩溃了。

现代操作系统

Mac OS X,Windows 11 ,Linux,IOS,和 Android,虽然大部分设备只有一个人使用,操作系统依然有 “多任务,虚拟内存,内存保护,” 因此可以同时运行多个程序;