读书笔记 Week7 2018-4-24
《程序员的自我修养》
首先来大致说一下读这本书的感觉,可以说对于我自己而言,是第一次对于编程有了个纯粹的认识,或者说的更明确一点,是对整个操作系统有了一个大致的感觉。虽然自己这一年也算是写了一些代码,你让我去写个什么小程序也没什么问题,debug也算是用的熟练。但是,每次如果让我换一台新的电脑去编程,心里真的是发怵。一旦什么编译环境,编码之类的出了问题,整个人就可怜又无助了。究其原因,是对于编程一事仅仅掌握了最表层的东西,也就是说,所有都编程都是在照葫芦画瓢而已。而这本书算是解决了一些我在这方面的迷惑。
操作系统的重要性
实际上,这学期的另外两门课在这方面给予我了很明显的感受。一个是微机原理,另一个是电设实践。这两门课都有编程,一是最简单的汇编语言,另一个虽然是我熟悉的c语言,但是对于单片机的功能使用方面,尤其是有关中断的,也让我花费了大量的是时间去了解。
在用惯了高级语言以后,再一次的返回来去写这些最底层的语言,真的是让我倍感难受。尤其是在汇编的编程中,频繁的从存储器和寄存器中存取数据,让人不胜其扰。同时开始无限怀念高级语言,只要设定一个变量,就啥都不用我管了hhh
而在电设里面,单片机的代码编写让我第一次对于优先级有了一个较为明确的概念,虽然只是一个简单的中断优先级,但根据实际功能的实现,却要谨慎再谨慎的去设定。
同样,这两方面,一是内存的管理,一是优先级的管理,都被操作系统一个人给解决了。这里插一句题外话,就是曾听说过 linux 系统的源码就是用c写了1w多行,虽然一直没有去读过,但这种操作真的是惊为天人。实际上的实现,采用了线程的方式,就我个人简单的理解,cpu的确每一时间只能解决一件事情,但如果以一个较快的频率去在几件事情之间切换执行,从外部看起来呢,就和同时执行好几件事无异了。如同书中所说“并发实际上是一种模拟出来的情形”
紧接着,书中提出了一个经典的例子:
直观来说,执行结束后的 i 毫无疑问是0。但是,计算机在执行这些指令的时候,并不像我们看起来这么直观,因为一切的运算,都要在寄存器里执行,而不能在存储器里面,毕竟他没这个功能。那么,如果两个线程都被巧妙地割裂开来,就会导致问题的出现。
实际的处理中,很容易想到,就是先强迫线程1中的++i完成,再去执行--i,也就是说,i是一个不可分割的线程,被定义为原子操作。