Chinaunix首页 | 论坛 | 博客
  • 博客访问: 297766
  • 博文数量: 71
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 217
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 15:43
文章分类

全部博文(71)

文章存档

2016年(4)

2015年(2)

2014年(2)

2013年(63)

分类: LINUX

2013-05-10 13:05:10

写给自己的:今天开始读《程序员的自我修养》,面临 着作者针对HelloWorld程序提出的九点问题的思考,扪心自问除了第一个问题“程序为什么要被编译器编译了之后才可以运行”尚可浅答外,其他的问题 要么是一团糊,要么是一片白——汗颜之至~~~~但也正印了作者随后“本书正是为你准备之言”,现在去后悔之前的荒废也好,低效也好毫无意义,唯有勤奋努 力以应之,这也才是真正我修养的一种提高吧

  • 现代PC简单的架构知识点:

1. 最初CPU、内存工作主频相当,I/O模块相对于这二者速度慢得多,因此PC中系统总线直接连接CPU和内存,I/O模块通过各自的I/O控制器模块连到系统总线

2. 稍后,CPU频率增长速度高于内存,故PC总线设计方案修改为:系统总线频率与内存一致,CPU采用倍频方式与系统总线通信。
/*自我扫盲:所谓的倍频简单理解为CPU的工作主频=外频(即系统总线频率)×倍频系数,这种工作方式可以使得系统总线工作在一个较低的频率上。*/

3. 再后来,随着图形OS、3D游戏等的快速发展,作为I/O控制器之一的显卡需要与CPU和内存进行大量高速数据的交互,原先低速的系统总线(也是I/O总线)无法满足要求了,由此产生了现代PC中南北桥芯片、PCI总线、ISA总线互联的系统设计
/*自 我扫盲:北桥(PCI-Bridge)是高速芯片,连接CPU、内存和高速总线(例如最高133MHZ 的PCI Bus,以及后来更高速的PCI Express、AGP等总线),速度要求较高的I/O设备控制器(包括显卡、高速USB控制器、SCSI接口控制器)和南桥芯片连接到PCI总线上;
南桥(ISA-Bridge)是负责处理低速设备的芯片,但是其本身是连接到PCI总线上的。南桥芯片的另一端连接着ISA总线以及某些 相对低速的I/O控制器(例如IDE控制器),ISA总线上则连接着声卡、打印机设备等低速设备控制器。南桥芯片将低速设备的信号汇总后连接到北桥芯片上 进行处理。*/

  • 无论计算机系统硬件多么繁杂和变化,对于系统程序员来说,计算机系统仍然没有摆脱CPU、内存和I/O模块组成的简单模型。
  • 由 于制造工艺的极限限制,当前CPU工作主频到达4GHz之后无法再提高,于是多CPU系统出现了——最常见的对称多处理器SMP,对于PC而言使用完全独 立的两个完整的CPU过于奢侈,故而处理器制造商纷纷推出以但处理器形式出现的多核处理器,即CPU中的多个core共享昂贵的片内cache——对于程 序员而言,完全可以在逻辑上将多核处理器基本等同于SMP
  • 计算机科学领域的任何问题都可以通过增加一个中间层来解决——无论是计算系统硬件架构还是软件体系,还是系统下的各个软硬件组件,都是按照这样的多层次结构设计的
  • 计算机系统架构中任意两个层次之间要进行通信就需要有一套“通信协议”——这也就是Interface的概念,下层负责实现接口,上层则利用接口。接口应该尽可能地保持稳定,这样就可以任意修改和替换某个层次而不影响其他层次。
  • 计算机系统中最顶层是应用程序和开发工具(编译器、汇编器、链接器、调试工具等),它们使用的接口是由特定操作系统环境下的运行时库提供的API。
    /*自我扫盲:不同操作系统的不同运行时库提供不同的API,例如Linux下的Glibc运行时库提供POSIX API,而32位Windows下的运行时库提供Win32 API*/
       
    运行时库层使用的接口则是OS kernel提供的system call,很多OS kernel中使用某种特定的软件中断来实现系统调用接口。
        根据层次接口的定义,OS kernel使用系统硬件层定义和提供的接口,不同的硬件平台定义的接口将会决定不同的OS kernel。这种硬件提供的接口其实就是特定硬件生产商提供的datasheet和硬件编程标准等Hardware Specification资料,所谓OS使用这些接口就是指按照这些资料的规定编写kernel和驱动程序
  • 现代操作系统层像上面的运行时库和应用程序提供了下层物理设备的抽象,不同类别的物理设备可能会被抽象成不同的对象。
    /*自我扫盲:类UNIX操作系统将所有的物理设备都抽象为普通的文件,但是Windows系统则有所不同,其将图形硬件设备抽象为GDI对象,将声音和多媒体设备抽象为DirectX对象,将磁盘抽象为普通文件系统。*/
    同 时操作系统利用硬件层提供的而接口管理物理硬件,这就是设备驱动程序的工作。因为硬件设备多如牛毛,OS只能提供一套固定的设备驱动程序接口和框架,具体 的驱动程序则是由硬件提供商根据这些OS提供的规范编写特定OS下的设备驱动程序——所以同一物理设备往往有driver for linux和driver for Windows
  • 操作系统的文 件系统模块负责记录磁盘中文件的存储结构(包括磁盘中存放的方式、在磁盘中的位置等),当运行时库调用OS kernel提供的read/write系统调用时,OS kernel的文件系统模块找到需要进行读写的磁盘位置,然后文件系统模块向磁盘驱动程序发出I/O命令来操作磁盘——向硬件发送I/O命令最常用的方式 是通过读写硬件的I/O端口寄存器来实现
    /*自我扫盲:现代磁盘使用逻辑块地址LBA的方式来为所有的扇区统一编号,软件直接使用逻辑扇区号即可,逻辑扇区号到盘面、磁道、物理扇区的定位由磁盘设备自己内部电路来完成。*/
  • 线 程thread是最小的程序执行流单位,所谓的程序执行流就必须能够保证程序的执行,这也就意味着每个线程必须有自己的PC、stack和寄存器集,另外 线程还需要有自己的ID供OS使用。同一个进程中的多个线程共享的内容则包括code、data、进程空间(全局变量和heap)和打开的file。
        一个线程的私有存储空间包括:stack(其实理论上同进程的其他线程是可以访问到本线程的stack的),线程局部存储TLS空间(仅在某些OS中存在)、寄存器(PC等)
  • Windows操作系统kernel有明确的线程概念,针对线程和进程有不同的Windows API;
    Linux则没有明确的线程、进程概念,而是将所有的执行实体都称为task,一个task相当于一个单线程进程,但是多个task可以共享内存,此时多个task就类似于一个进程中的多个线程了,这些共享内存的task共同构成了一个进程。

  • 同 作为多线程同步机制,在整个系统中,信号量可以由所有的线程进行获取和释放,互斥量则与二元信号量不同,只能由获取该互斥量的线程才能释放该互斥量;信号 量、互斥量对于系统中所有的进程都是可见的,即任何进程都可以尝试来获取该信号量/互斥量,但是临界区则不同,其仅仅在当前进程内可见,其它进程无法获取 临界区锁。
  • 在考虑多线程并发的安全性问题时,需要考虑两个问题:
        编译器在进行代码优化的时候可能会颠倒两个相邻指令的执行顺序——这可以通过定义volatile变量来解决,volatile关键字首先可避免编译器为 提高速度将变量存入寄存器而不写回,其次可以防止编译器调整操作volatile变量指令的执行顺序。
        同时,CPU也具有动态调度换序的优化特性,要阻止CPU乱序执行没有通用可移植的方法,通常是由CPU指令集提供一条特殊的barrier指令——不同的CPU提供的这条指令名字可能不同。
  • 所 谓的多线程并发执行,要么是由多处理器来支持(真正的并行),要么是由OS通过线程调度机制支持(模拟的伪并行),现代操作系统内核里往往都提供对线程的 支持,这就是所谓的内核线程概念——用户使用的用户线程需要和某个(些)内核线程对应,包括一对一模式、一对多模式和多对多模式。
    /*自 我扫盲:用户线程与内核线程一对一是最常见的,通过系统调用或API创建的线程都是这样的模式,优点是一个线程不会因为其他线程被阻塞而无法继续执行,模 型简单,但是由于OS kernel限制了内核线程的数量,所以这种模式下用户线程数量也会受到限制,并且由于内核线程调度时上下文切换消耗大,导致用户线程执行效率较低;
        一对多模型下,可以降线程切换开销,但是对应于同一内核线程的多个用户线程之间会因为某个线程被阻塞而全部被阻塞;
        多对多模型则是上述二者优缺点的中和
    */
阅读(1576) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~