《程序员的自我修养》第一章 温故而知新(温故而之心)
(看到许多师傅都推荐这本书,所以决定把这本书买下来去阅读,在这分类中记录我对每一章节的的笔记和自己的一些理解,以便于以后的复习,也希望可以对别的师傅们有所帮助)
一个计算机最重要的是 cpu io设备 内存,
1 cpu:
早期的cpu是连接在一条总线上面,因为当时的io设备的速度是不如cpu和内存的速度的,所以为了协调io设备的低速会在io设备和总线中间加上io控制器

但是由于cpu的快速发展,内存又跟不上cpu的速度了,所以在总线型的基础上做了改进变成了如下这种结构
  
中间这个是链接所有高速芯片的北桥(被称作北桥的cpu芯片),而处理低速的设备的被称为南桥芯片
而因为cpu的快速发展,cpu达到了当时4Ghz的物理极限(因为材料和制造工艺的限制),所以当时的人们为了提高计算机的反应速度,就加了好几个cup去处理同一件事情,这就是多核的形成,但是cup的数量就不一定和计算速度成正比,就如同有些事情不是人多就能加快解决的,所以在当时计算器发展的早期,cpu的资源是十分昂贵的,于是人们就想着榨干cpu的性能,比如当一个程序运行结束后,监控cpu的程序就会给他另一个程序去运行,保证cpu在每时每刻都有任务完成(cpu真苦啊!),这种就被称为多道程序,但是这种方式又太原始了,因为有的事情需要立即完成,比如你游戏的时候放技能,按了技能后10分钟电脑才响应,想想就会令人崩溃。
所以,经过改进,程序的运行就变成了一种协作的模式,也就是一个程序运行一段时间后就会主动退出位置,让别的程序去运行,这种程序的协作模式就被称为分时系统,但是如果一个程序就是要占着cpu的资源不放,那么系统就会看上去死机了一样,比如一个while(1)的死循环,所以这种操作系统是十分脆弱的,于是人们就又升级了一下,研究了更高级的操作系统模式,让操作系统当大哥,接管了所以的硬件资源,并且是被硬件保护的级别,而所有的应用程序都以进程的形式运行在比操作系统更低级的权限下面,而且每个进程都有自己独立的地址空间,让这些程序相互隔离,cpu的归属让操作系统去分配,操作系统会根据优先级去分配cpu的使用,当运行超过了一定的时间,cpu会暂停进程的运行,将cpu非陪给其它的等待的进程,这样所有的进程都可以获得cpu的资源去运行,这种方式就被称为抢占式,而且操作系统可以强制的剥夺cpu的资源去分配给它认为的最需要的进程,如果操作系统分配给每个进程的时间都很短,就会造成很多进程在同时运行的假象,几乎现代操作系统都是采用这种方式的,比如linux,unix,windows nt,mac os x
2 系统软件:
计算机体系结构的整个体系结构从上到下都是按照严格的层次结构设计的,而且不止计算机系统软件,操作系统本身,很多应用程序都是按照这种层次结构去设计的

而每个层次之间都需要相互的通信,通信就必须需要一个通信的协议,这个协议被称为接口,接口下面那层是接口的提供者,它来定义接口,接口的上面是接口的使用者,它使用接口来实现所需要的功能(就像一个圆形的壳子,下层提供给上层,上层只能在圆形的基础上来实现,而不能给了圆形变成方形)在最上层中是应用程序,比如浏览器,应用程序,而从整个层次结构上看,开发工具和应用程序是同一个层次,因为它们使用的是同一个接口(操作系统应用程序编程接口),运行库使用的操作系统提供的系统调用接口,系统调用往往是以软件中断的方式提供的,比如linux的0x80接口,windows的0x2e为系统调用接口(终于到自己知道的一点东西了)
3 驱动程序:
因为操作系统是对硬件的管理和抽象,它们希望一个统一的硬件方位模式,而且做完应用程序的开发者的我们,也不希望我们编写一个程序需要去考虑计算机使用的什么显卡,什么显示器等各种硬件差别,我们编写的程序在硬件的实现应该由操作系统来完成,这种情况下诞生了驱动程序,驱动程序也可以看作操作系统的一部分,但是它又和操作系统内核有着一定的独立性,
比如我们对文件的读取,文件系统保存这些文件的存储结构,而且负责维护这些数据结构并保证磁盘中的扇区能有效的组织和利用,假设我们在linux系统,我们会通过read的系统调用去读取文件的前多少个字节,文件系统收到read的请求后,会判断这部分字节在逻辑扇区的位置,磁盘驱动程序就会向硬盘发出硬件命令(最常见的也是通过读写io端口的寄存器去实现),硬盘收到者个命令后,就会去执行相应的操作,并且会将数据读取到实现设置好的内存地址中,当然这是最最最简单的情况,实际情况肯定更复杂
4内存:
在上面我们说到的操作系统使cpu可以再多个进程之间共享,但是在早期的计算机,程序是直接运行在物理内存上面的,那么当运行多个程序时,如何才能将计算机上面有限的内存空间分配给多个程序去使用(还是榨干cpu的资源),那如果按最简单的分配,就是让程序刚好把内存填满,这样又会出现很多的问题
地址空间不隔离:所有的程序都是直接运行在物理内存上面的,也就是说是直接访问物理地址的,那么恶意的程序很容易去修改其它程序的内存数据,达到破坏的目的,会出现安全问题
内存使用效率低:因为没有有效的内存管理机制,当一个程序需要执行时,操作系统就将整个程序装入内存中开始执行,那如果有一个非常紧急的程序急需要运行,但是内存又是被装满的情况下,那么只能将其它的程序暂定,然后写到磁盘里面,等到用的时候在读回来,但是这样的整个过程中有大量的数据在换入换出,导致效率十分的低下
程序运行的地址不确定:因为程序是在物理内存上面运行,所有当程序每次需要装入运行的时候,都需要去到内存处分配一个足够打的空闲空间,但是这个空闲空间是不能保证每次都是一样的位置,这样就给程序的编写造成了一定的麻烦,因为程序在编写时,它访问数据和指令跳转时的目标很多都是固定的,这就要涉及程序的重定位问题了(重定位现在不说)
而解决这几个问题的思路就是前面提到过的层次结构,我们可以增加一个中间层,让程序间接的访问地址,思路是我们把程序给的地址看作一个虚拟地址,然后通过某些映射的方法,把这个虚拟地址转换成实际的物理地址,这样只要我们能妥善的控制这个虚拟地址到物理地址的映射过程,就可以保证任意一个程序所能访问的物理内存区域跟另一个内存相互不重叠,这样就可以达到地址空间隔离的效果
最开始人们采用的是叫做分段的方法,基本思路是把一段与程序所需要的内存空间大小的虚拟空间映射到某个地址空间。,假设我们有一个10mb大小的假想的空间,那么我们会在实际的物理内存中分配一个相同大小的物理地址,然后将这俩块相同大小的地址空间一一映射,它们的虚拟空间和物理空间映射关系可能如下图所示

但是这种分段的方法只能解决三个问题的第一个和第三个,却没有解决第二个问题,因为分段对内存区域的映射还是按照程序为单位,内存不足,被换入换出到磁盘的还是整个程序,后来人们根据程序的局部性原理,当一个程序在运行的时候,在某个时间段内,它知识平凡的用到了一小部分数据,也就是说,程序的很多的数据其实在一个时间段内都是不会被用到的,所以人们自然的想到了内存分割和映射方法,使得程序的局部性原理得到充分的利用,大大提高了内存的使用率,这种方法就是分页
分页 :分页的基本方法是把地址空间认为的分成固定大小的页,每一页的大小由硬件决定或硬件支持多种大小的页,那么当我们把进程的虚拟地址空间按页分割,把常用的数据和代码页装在到内存中,把不常用的代码和数据保存在磁盘里,当需要用到的时候再把它从磁盘里取出来即可,如下图所示
  

我们把虚拟空间的页就叫虚拟页,把物理内存中的页叫做物理页,把磁盘中的页叫做磁盘页,我们可以看到第二个图vp2和vp3不在内存中,当如果需要用到这俩个页的时候,硬件就会捕获到这个消息,这就是所谓的页错误,然后操作系统就会接管进程,复杂将vp2和vp3从磁盘中读出来并且装入内存,然后将这俩个页与vp2和vp3之间建立映射关系
5,线程基础
线程,是实现程序并发执行的一个重要方法,有时又被称为轻量级进程,是程序执行流的最小单元,我们可以将线程理解为程序中的一个子类,线程与进程的关系如图下所示

多线程的优点我就不论述了,线程的方位非常自由,它可以方位进程内存里的所有数据,甚至包括其它线程的堆栈(如果它知道其它线程的堆栈地址,那么这就是很少见的情况),但实际运用中线程也有自己的私有存储空间
1栈
2线程局部存储
3寄存器
在单处理器对应多线程的情况下,并发是模拟出来的状态,操作系统会让这些多线程程序轮流执行,每次仅执行一小段时间,这种不断在处理器上切换不同线程的行为就被称为线程调度,在线程调度中,线程至少有三种状态
运行:此时线程正在执行
就绪:此时线程可以立即执行,但cpu被占用
等待:此时线程正在等待某一事件发生,无法执行
处于运行中的线程拥有一段可以执行的时间,这段时间被称为时间片,当时间片用尽的时候,进程就会进入就绪状态,如果在时间片用间前进程就开始等待某事件,那么它将进入等待状态如下图所示

线程调度目前的主流调度方式尽管各不相同,但是都带有优先级调度和轮转法的痕迹,在优先级调度中,线程都拥有自己的线程优先级,高优先级会先运行,低优先级会等高优先级运行后才运行,在cpu中,我们一般把频繁等待的线程称之为io密集型线程,而把很少等待的线程称为cpu密集型线程,io密集型线程总是比cpu密集型线程容易收到优先级的提升,所以在优先级调度的环境下,线程的优先级改变一般有三种方式:
1用户指定优先级
2根据进入等待状态的频繁程度提升火降低优先级
3长时间得不到执行而被提升优先级
注:后面的线程安全已经同步与锁的知识我就不放在这里了


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号