您的位置:首页 > 职场人生

程序员的自我修养(1)

2015-08-18 01:09 645 查看
温故而知新

1.2万变不离其宗

1.计算机多如牛毛的硬件设备中,最为关键的三个部分:cpu,内存,I/O控制芯片,他们都直接连在同一个总线上

2.早期设备I/O设备如显示设备,键盘,磁盘速度与cpu和内存相比慢很多,为了能够让cpu和I/O设备进行通信,一般每个设备都会有一个相应的I/O控制器

3.90年代低速设备连接在南桥芯片,南桥将他们汇总后连接到北桥上,北桥芯片连接所有高速芯片,例如cpu,内存,PCI总线

4.除非cpu制造工艺有本质突破,否则cpu频率将会被4GHZ的天花板限制

1.3站得高,望得远

1.系统软件分为两大类:1.平台类:内核,驱动程序,运行库和系统工具2.程序开发类:编译器,汇编器,链接器等开发工具和开发库
2.计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

3.最上层的是应用程序,开发工具与应用程序是同一个层次的,因为他们都使用一个接口,那就是应用程序编程接口的提供者是运行库,什么样的运行库提供什么样的API,如windows的运行库提供windowsAPI,运行库使用操作系统提供的系统调用接口,系统调用接口在实现中往往以软件中断的方式提供。操作系统内核层对于硬件层来说是硬件接口的使用者,而硬件是接口的定义者,硬件的接口定义决定了操作系统的内核,具体讲就是驱动程序如何操作硬件

1.4

1.操作系统提供抽象的接口,另外的主要功能是管理硬件资源,一个计算机的资源主要分为cpu,存储器(内存和磁盘)和I/O设备

2.现代cpu的分配方式主要是抢占式分配

3.硬盘的基本存储单位为扇区,每个扇区一般为512字节,一个硬盘有多个盘片,每个盘片分两面,每个面按同心圆分为若干个磁道,每个磁道分为若干个扇区。硬盘使用LBA的方式,即整个硬盘中所有的扇区从0开始编号,一直到最后一个扇区,这个扇区编号叫做逻辑扇区号。

4.向硬件发送I/O命令方式,最常见的一种方式就是通过读写I/O端口寄存器来实现,在x86平台上有65000多个硬件端口寄存器,不同的硬件被分配到了不同的I/O端口地址,cpu提供了两条专门的指令"in"和"out"来实现对硬件端口的读和写,通过读写端口地址就能与硬件通信

1.5内存不够怎么办

1.程序每次需要装入运行时,我们都要给它从内存中分配一块足够的空闲区域,这个空闲区域的位置是不确定,它访问数据和指令跳转时的目标地址很多都是固定的,这就涉及重定位的问题

2.地址空间分为虚拟地址空间和物理地址空间,后者是实实在在的唯一的

3.所谓地址空间是个比较抽象的概念,可以想成一个数组,数组的每个元素是一个字节,大小是由地址空间的地址长度决定。

4.虚拟地址空间是虚拟出来的,其实并不存在,每个进程都有自己独立的虚拟空间,这样就实现了进程隔离

5.32位机器的地址线有32条,那么物理地址空间就有4GB

6.cpu把一个程序的所需要的内存空间映射到某个物理地址空间,虚拟地址到物理地址的映射,程序员只关注虚拟地址

7.分页提高内存的使用率,分页的基本方法是把地址空间等分成固定大小的页,操作系统决定每页的大小,页是固定大小的

8.虚拟地址空间按页分割,把常用的代码和数据放到内存中,不常用的代码保存到磁盘里

9.虚拟内存中的页叫虚拟页,物理内存的页叫物理页,磁盘中的页叫磁盘页

10.虚拟空间的一些页被映射到同一个物理页,这就实现了内存共享

11.虚拟存储的实现需要硬件的支持,几乎所有的硬件都采用MMU的部件来进行页映射

12.在页映射的模式下,cpu发出的是虚拟地址,经过MMU,转换成物理地址,一般MMU都集成在CPU内部,不会以独立的部件存在

1.6

1.寄存器是执行流的基本数据

2.线程的三种状态:运行,就绪(可以运行,但是cpu被占用),等待(I/O或同步,无法执行)

3.运行中的线程拥有一段可以执行的时间,称为时间片,当时间片用尽时,线程进入等待。当一个处于等待状态的线程所等待的事件发生后,该线程进入就绪状态

4.线程调度方式:优先级调度,轮转调度,前者会造成饿死现象

5.fork的子进程,并不复制父进程的内存空间,而是与父进程一起共享一个写时复制的内存空间,任意一个任务试图对内存修改时内存就会复制一份给修改方单独使用,以免影响到其他任务

6.clone可以产生一个新任务,实际效果是一个新的线程

7.所谓同步,是指一个线程访问数据未结束的时候,其他线程不得对同一个数据进行访问。如此对数据的访问原子化了

8.同步最常见的方法是使用锁。锁已经被占用时候试图获取锁时,线程会等待,直到锁重新可用

9.二元信号量是最简单的一种锁,他只有两种状态:占用与非占用,适合只能被唯一一个线程独占访问的资源。

10.允许多个线程并发访问的资源,多元信号量简称信号量,它是一个很好的选择,一个初始值为n的信号量允许n个线程并发访问,线程访问资源的时候首先获取信号量

11.互斥量和二元信号量很类似,资源仅允许一个线程的访问,但和信号量不同的是,信号量在整个系统可以被任意线程获取并释放,也就是说,同一个信号量可以被系统中的一个线程获取之后由另一个线程释放。而互斥量则要求同一个线程释放。

12.临界区是比互斥量更严格的同步手段,把临界区的锁的获取称为进入临界区,而释放锁称为离开临界区

13.互斥量和信号量在系统的任何进程里都是可见的,也就是说,一个进程创建了一个互斥量或信号量,另一个进程试图获取该锁匙合法的。然而临界区的作用范围仅限于本进程

14.条件变量也是一种同步手段。线程有两种操作,首先线程可以等待条件变量,一个条件变量可以被多个线程等待,其次线程可以被条件变量唤醒,所有线程一起恢复执行

15.一个函数被重入,表示这个函数并没有执行完,由于外部因素或内部调用,又一次进入该函数执行:一个函数要被重入,有两种情况:(1)多个线程同时执行这个函数(2)函数自身调用自身

16.可重入函数在多线程下可以放心使用

17.不同的线程的寄存器是独立的

18.volatile关键字试图阻止编译器的过度优化:(1)阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回(2)阻止编译器调整操作volatile变量的指令顺序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: