Computer Theory

想入门汇编语言可以看csapp第3章

想入门汇编语言可以看CSAPP(《深入理解计算机系统》)第二版第3章。 它一般先来一段C语言编译成目标代码,然后反汇编一下,再对照讲解C代码和反汇编出来的汇编代码,这样弄比较好理解。 附:UNIX环境中反汇编的命令是  objdump -d 可执行文件

磁盘格式化具体是什么?

格式化分两种:   1.物理格式化(低格):即把磁盘分成扇区。磁盘厂商一般会预先做好。   2.逻辑格式化: 操作系统把初始文件系统的数据结构存储到磁盘上。具体信息包括空闲空间、第一个初始目录等。 未经逻辑格式化、没有文件系统的磁盘称作Raw Disk.  由于没有文件系统存在,直接通过物理地址访问Raw Disk可以获得比较高的性能。有的数据库系统就喜欢使用Raw Disk.

磁盘的块大小(Block Size)和扇区大小(Sector Size)

Logical Block Size:A "block", a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driver ( 出处) 它一般是Sector Size的倍数 要明确的是,块是文件系统的抽象,不是磁盘本身的属性。 扇区大小则是磁盘的物理属性,它是磁盘设备寻址的最小单元。 Linux中, 1.查看某个分区的Block Size:  blockdev –getbsz /dev/sda7 2.查看硬盘的扇区大小(Sector Size):  通过fdisk -l可以看到 Linux内核还要求 Block_Size = Sector_Size  * (2的n次方),并且Block_Size <= 内存的Page_Size(页大小)

磁盘的引导控制块

引导控制块(boot control block) 一般是分区的第一个block, 里面包含了从这个分区引导操作系统所需要的信息。 1. 引导信息一般是二进制文件,读入内存后让CPU直接执行 2. 引导信息可以用来引导某个操作系统,也可以用来给出一个菜单,让用户在多个OS中选择一个 3. 如果分区上没有操作系统,那么这个block的内容为空

分层设计的文件系统

从上到下依次为: L4: 逻辑文件系统 — 对应用程序提供文件的元数据,比如文件名、目录结构,以及它们跟逻辑块地址的关系. 其中用到的一个重要数据结构是FCB, File Control Block.  L3: File-Organization Module — 把逻辑块地址(0,1,2…)转换成物理块地址(柱面号+磁道号+扇区号) L2: 基本文件系统 — 根据物理块地址调用设备驱动程序 L1: I/O控制 — 即设备驱动程序和中断处理服务程序 Linux在文件系统之上还加了一个VFS(Virtual File System)层,使得系统内可以有多个文件系统共存,并且可以使用单一的API来操纵。早期的DOS没有VFS,所以就没有让多文件系统共存的能力。

磁盘调度

当磁盘I/O队列中有多个请求时,它应该先处理哪些请求? 从队列选择请求的过程和策略就叫 磁盘调度 最直接的做法是先来先服务( FCFS), 它看起来公平,但效率可能很低。因为几个连续的请求的目标磁盘位置可能相隔很远,顺序处理这些请求会导致磁头做很多次长距离移动,导致总的寻道时间很长。 SSTF(最短寻道时间优先算法)则总是选择离自己最近的先处理,但公平性很差,甚至可能造成有的请求饿死。 另有SCAN/C-SCAN(电梯算法及其变种), LOOK等。

程序的加载和动态加载

程序的加载(loading)的意思是 把指令和数据装入到内存中。 其中一件重要的事情是把程序里用到的 虚拟地址(virtual address)映射到物理地址上(physical address)。每个进程的virtual address可能都从0开始,所以在执行时要把它们映射到不同的physical address上,以免内存空间出现交叠。 简单的做法是利用重定位寄存器为进程存放一个基准地址(base address),然后让 physical address =  base address + virtual address. 如果程序比较大,那么整个加载到内存里会消耗太多内存。 所以可以延迟加载子程序,即直到需要用时再加载子程序,这就是 动态加载 (Dynamic Loading) 还有一个节省内存的方案是覆盖(overlay). 举例来说就是:程序第1部分占用第1段内存,第2部分占用第2段内存, 第3部分发现第1部分程序已经不需要再占用第1段内存,就自己把这段内存占了。

进程状态:Ready V.S. Blocked

进程Ready或Blocked时,都没有在运行。 不过,Ready指的是已经可以运行了,只不过时间片还没有轮到;而Blocked代表真不能运行(比如I/O阻塞)。 下面的转换图也可以帮助解释下:

程序的链接和动态链接

我们都知道,编译器生成的目标文件中(如C编译后生成的.o文件)中会有一堆符号(symbol)。 有的符号可能并没有在本文件中定义,而是定义在其他目标文件中。 为了能使程序跑起来, 你需要把本目标文件和其他目标文件链接(link)起来,解析相关的符号(resolve the symbols),并合并生成一个可执行的文件。 这就是“链接”的定义。 在程序运行前执行链接,叫做“静态链接” (dynamic linking);它生成的可执行文件来自多个目标文件,所以可能会比较大。 而在程序运行的时候才临时找到相关目标文件并resolve symbols, 则属于“动态链接”(dynamic linking). 动态链接的一个典型例子是:只把自己写的代码直接编译成可执行文件,以免文件太大;在运行时才临时链接到库文件。Windows的DLL就是这样搞的。