作者 | 陆小风
来源 | 码农的荒岛求生
现在的程序员对操作系统已经习以为常了,但是你有没有想过,如果没有操作系统的话我们可以让程序运行起来吗?
先说答案,当然是可以的,而且必须是可以的。
你可以从这个角度来思考,操作系统本身就是一个程序,这个程序的运行没有依赖任何其它“操作系统”,注意,这不是套娃。
实际上在计算机历史早期,或者说上古时期,计算机上根本就没有什么操作系统之说,这一时期的程序的确是在没有操作系统的情况下编写和运行的。
要想写个能直接在计算机上运行的程序可不简单,想一想这种不依赖操作系统系统的程序该怎样运行起来?
启动是个问题
我们面临的第一个问题就是:此时计算机上没有任何程序,你该怎样让计算机启动起来呢?换句话说加电后CPU该干啥?
啊哈,没想到吧,第一个问题就不好解决,要想让计算机运行你的程序至少要把计算机启动起来吧。
所谓的计算机启动起来无非就是让CPU加电后开始执行一段初始化代码,为你真正的程序运行铺路,这一大段代码就是所谓的内核,kernel,实际上你可以让计算机加电后执行任何代码,也就是实现你自己的内核,当然你也可以没有这样的内核,直接运行你的程序。
但这依然会有问题。
运行时问题
第一个要面临的是内存问题,你的程序要被加载到内存的哪个位置呢?显然这就是涉及到内存管理问题。
第二个问题是你没有办法充分利用计算机。想一想,在这种情况下,你只有启动的时候才可以开始执行一个全新的程序,想执行第二个程序就需要关机,在存储设备中刷入新的程序然后再开机,这是不是让人抓狂。
这还不算完,如果你的程序有bug,那么不好意思,你可能需要重启计算机了,你能想象程序出点问题就要重启计算机吗?
想一边运行文本编辑程序一边运行音乐程序?门都没有,要想实现,自己写个多任务(Multitask)管理系统吧,你至少要把运行的程序管理起来吧,想一想是不是就必须用到进程这样的抽象啦,还觉得这些概念没有用吗?
就算你有多任务系统,如果一个程序有问题把另一个程序的内存刷掉了,这是不是就一石二鸟了,一个bug导致两个程序崩溃,你是不是得有进程隔离机制?
此外,如果你的程序需要使用I/O设备那就更有酸爽啦,没有驱动你怎样控制这些设备、怎样使用鼠标键盘显示器,你的程序是不是要链接一大堆驱动,想想是不是就已经头痛了。
而且你还要高效的利用计算机资源,当搞定这一切后你会发现自己实际上已经写出了一个操作系统。
还觉得操作系统没有用吗?操作系统把这些脏活累活统统揽下,程序员只需要专注写bug就可以了。
说了这么多缺点,但没有操作系统的还是有一个有趣的优点的,那就是你可以独掌大权。
程序员也是独裁者
说来有趣,尽管现在你可以花上几千块钱买一台计算机,但是你(程序员)几乎没有办法绕开操作系统随意读写你的内存、让CPU执行任何指令,因为你的Windows/Linux/MacOS会直接将你kill掉。
有意思的是明明是你自己花钱买的计算机硬件、花钱买的操作系统,理论上这是个人财产,但是你花钱买来的操作系统竟然不受你控制(大神除外),反而禁止你干这干那,就好比你买来一头牛,结果这头牛不受控,自己想干啥干啥,如果真的买了这样一头牛相信你早就忍不了了,但是你花大价钱买来的计算机、智能手机根本不受你的掌控,大家竟然对此没什么感觉,认为这很正常,想想也是有够魔幻的。
扯远了,在早期的计算机上普通程序员(应用程序)可以彻底控制计算机,可谓独掌大权,实际上在现代计算机系统上你也可以在没有操作系统的支持下写程序,这就是所谓的Bare-Metal Programming,嵌入式同学对此应该不陌生。
好啦,关于操作系统与程序运行这个话题就到这里,总之操作系统并不是计算机执行程序的一个必须组件,没有操作系统我们一样可以让程序运行起来。
往期推荐
如果让你来设计网络
Docker:从入门到实战过程全记录
浅述 Docker 的容器编排
如何在 Kubernetes Pod 内进行网络抓包
点分享
点收藏
点点赞
点在看