我的(码农)的知识体系结构

我就一码农,学名程序员。农民伯伯靠种地为生,我靠种代码为生;土地里长出了庄稼,键盘中敲出了程序。毕业,进一游戏公司,从业六年半,干了五年服务器,一年半客户端。主要在PC上折腾,服务器弄弄FreeBSD,客户端还得跟着M$老大的Windows混。敲了这么多代码,也尝试总结下知识,斗胆称之为体系结构。

计算机体系结构/硬件(PC/PS3/Wii/iPhone/Google Glass)

几十年前,冯·诺依曼与图灵哥哥弄了点理论体系,种下来计算机的种子。如今,计算机中总有个CPU,用来计算的;还有内存、硬盘,用来存储的;还得加上个显卡,否则无法玩游戏;把前面几个东东都插到主板上,再接个显示器、鼠标、键盘,最最标准的 IBM PC 就出来了。后来有了 USB 接口,U盘诞生了;再后来弄个RJ45接口,就可以上网了;上网还要接网线,好麻烦,于是有了wifi。

CPU自己有一些寄存器(register),访问起来最快。CPU和内存间的交互总觉得还不够快,所以弄了L1/L2 cache。

反正访问速度是 register > L1 > L2 > memory > harddisk/usedisk。

CPU就是一吃货,只负责吃数据(处理数据),每次先找 L1 cache 拿数据,不在 L1 cache 的,再找 L2 cache 要,又不在 L2 cache 的,才找内存要。找数据找不到这事,叫 cache-miss。要是内存中也找不到咋办?那不是CPU管的事,操作系统同学负责揽这活儿。

除了标准的IBM PC,其实还有大型机(这哥们有好多好多cpu,好多好多内存)、单片机(51单片机,要写汇编的哦)。不过这年头,原来是单片机的地方,现在都是台嵌入式PC了,硬件太tm便宜了。

还有就是各种游戏主机,啥PS2/PS2/GameCube/Wii,都是标准IBM PC的变种,为了更好的运算、图形能力而设计的计算机。不过这些哥们最近都不好混了,因为iPhone出来了,普通PC的运算、图形能力也越来越强大了,写游戏的码农们根本用不完这么多硬件资源,不需要再专门设计游戏主机了。最近PS4的发布会,就发现其已经长得很像PC了。Valve马上就要出Steam Box,丫就一PC。

还有现在智能手机、平板满天飞,PC的结构在以各种形式渗透到生活的每一个角落。Google Glass马上就要开买了,《七龙珠》里面贝吉塔带的、测量战斗力的眼镜,很快就要变成现实了。

操作系统(Windows/Linux/MacOSX/iOS/Android)

有了硬件就要有软件,计算机需要一个大管家,才能把上篇那一堆CPU、显卡、内存啥的都管理起来,让它们工作。

其实早期的操作系统都没那么复杂,最简单的就是 51单片机,可能就直接写汇编控制下CPU就好了,我没玩过。

后来硬件复杂了点,嵌入式里就出了 ucOS。作者写了个抢占式多线程调度系统,然后写了本书,再买书送代码,火了~

而 IBM PC 配上了 MS-DOS,不如千万家,把 Microsoft 养肥了。

之后 PC 越来越复杂,我要看界面的,不要命令行、我要玩游戏,要有显卡、我要U盘、我要上网,各种需求。操作系统也就随之越来越复杂。

大管家先要管理 CPU,而且 CPU 速度还贼快,一次只干一个事情,有些浪费。所以要有进程调度子系统(process schedule subsystem),进程A从磁盘读数据的时候,可以让进程B干活,不浪费 CPU 运算资源。有了一堆进程,进程间就得通讯啊,通讯就需要 memory copy,有时候数据量大了,通讯成本太高咋办?那就在进程中再搞个线程(thread),线程可以共享进程的数据,直接访问,不需要通讯了。

管了 CPU 还得管内存,于是有了虚拟内存子系统(virtual memory subsystem)。从进程的角度来看,要简化内存操作,进程A和进程B都访问相同虚拟地址(virtual address),实际它们访问的物理地址(physic address),是不同的。现代 CPU 都把虚拟地址到物理地址的映射做到硬件上了,所以操作系统必须的有虚拟内存子系统。

光管内存还不够,电源断了,数据就没了,所以还得把数据写到磁盘上,于是有了文件子系统(file management subsystem)。硬盘/U盘,只是张白纸,如何规划数据的格式呢?那就要提供文件系统格式,比如 Windows 的 FAT32/NTFS、Mac OSX 的 HFS+,这些也属于文件子系统管。

数据能存储了,还得将其显示出来,那就得用显卡。而显卡品牌多多,操作系统也不知道会有哪些牌子,那就设计个 PnP 系统,把 PCI、USB 等插槽管理好,然后让显卡厂商去写驱动(driver),自己管理自己的显卡硬件。网卡也类似。键盘、鼠标就标准得多,通用驱动即可,不需要生产厂家写。

这年头没有网络不行,所以还得有网络子系统(network subsystem),俗称协议栈(network stack)。负责实现 TCP/IP 那一坨东西。

编程语言(C/C++/Java/C#/Python/Lua/Erlang/Go)

?

数据结构(Array/LinkedList/HashTable/Stack/Tree)

?

领域知识(游戏开发/ERP/web)

?

to be continue …


你可能感兴趣的:(我的(码农)的知识体系结构)