重学操作系统(一)
前言
我准备写一篇文章,记录下我学习操作系统的过程和一些关键知识点。题目是借用了拉钩教育上某个课程的题目[1],感觉很贴切。之所以想学习操作系统,是因为某个面试问了很多jvm,mysql,redis调优以及操作系统相关的问题(Linux为主),我之前只是知道皮毛,因此惨败。借此补充下欠缺的知识,然后顺手记录下,留给自己看,也能促使自己记得更牢固。
目前,全文所有知识点均来源于参考一那个教程中,未来会遇到问题,再补充。
为什么要学习操作系统?
- 有很多操作系统相关的高频面试题。
- 学好操作系统能更好理解很多问题,即使你编程中遇不到,或者你压根不了解,比如多线程,比如容器等。
- 任何研发工具接触到底层,都会涉及到操作系统,比如MySQL的InnoDB,比如Hbase学习会接触到Hadoop(HDFS),Redis会碰到Linux I/O模型,Spring会接触到线程池和调度算法等 。
备注
因为教程是分模块的,所以后面文章也会分模块。具体一篇包含多少模块,我会按照长度来决定。在最后会有补充模块,未来我遇到相关问题,会添加进去。
计算机组成原理
贯穿模块一的一个问题:可不可以计算一个人的程序写的好不好?
芯片和计算能源
芯片对于计算机的重要性不言而喻,并且广发应用于各种行业,小到点灯微波炉,大到航天器,宇宙飞船,都需要。“计算能量”是参考一中教程提到的一个议题,我自己看了后,有一种茅塞顿开的感觉。和第一,第二次工业革命对比,确实在过去的第三次科技革命,除了革新的产物外,总觉得少了什么,那就应该是,一种新发现的能源。而参考一的作者将计算比作一种能源,现在看来非常合适。而芯片,就是产生这种能量的源头。芯片中的晶体通过震荡产生稳定的脉冲信号,我们发放信号形成方波,最后我们转换信号为我们需要的信号,就形成了时钟信号。这点其实和人类很像,心脏跳动,脉搏跳动,会影响到身体各处的供血,中医可以通过脉搏的跳动,简单判断出你身体的大致情况。而芯片就是这个“心脏”,它也是通过不同“跳动”来传递信号。
公理化体系和不完备性定理
公理化体系:可以建立起一套完善的公理体系,由少数几个公理推导出所有定理和推论,将万事万物统一到一个体系。
不完备性定理(哥德尔不完备性定理):即使在完善的公理体系中,也可以找到不能证明也不能证伪的命题。
上面两个定理,目前看来应该是第二个是更贴近现实,正如很多科学无法解释的灵异事件,让我们意识到,公理化体系是很难实现的。也让我们看到了,现代科学(计算)是不可能算出所有东西。
可计算理论
哪些问题可以被计算,哪些问题不能
可计算问题可被图灵机处理,不可计算问题不能被图灵机处理。停机问题:不能用一个程序判断另一个程序是否会停止。停机问题是经典的不可计算问题。
P问题和NP问题
- P问题:多项式时间问题,我们有能力或者未来有能力解决的问题,例如O(N1000)的问题,是P问题,即使现在算不出来,未来也能算出来。
- NP问题:指数形式问题,如:O(2N)问题,随着N增大,人类的计算能力增长速度是线性增长的,问题的增长速度会一直和计算能力增长速度持平或者更快。
- 因此,不是所有可计算问题,都能被解决,不是多项式时间的可计算问题,都是NP问题。
- 部分NP问题能转成P问题,需要通过一些算法,如动态规划等。如斐波那契数列求第N项。
人工智能
在参考一中,作者定义人工智能为:一些NP问题,虽然不能解决,但是努力让计算机的解决方案超过人类水平。说实话,这个定义还是很新颖的,也很贴近实际应用。
最早的人工智能的应用应该就是图灵测试,就是一段人机对话,抽出部分对话交给实验者去判断,如果大部分对话判断为人和人之间的对话,则机器通过了图灵测试。
总结
回到开头的问题,“可不可以计算一个人的程序写的好不好?”,我认为是无法计算的,这是一个不可计算问题。因此在目前来说,我们只能做到设立相应的规则,来规范程序写法,但是并不能提供一个有绝对答案的解法。未来计算机也许会有办法解决,将这个不可计算问题转换成可计算问题。
参考
[1] https://kaiwu.lagou.com/course/courseInfo.htm?courseId=478#/detail/pc?id=4604