引论
计算机硬件介绍
CPU、内存以及I/O设备都是有一条系统总线连接起来并通过总线与其他设备通信
处理器
- 在每个CPU基本周期中,从内存中取出指令,解码以确定其类型和操作数,接着执行
- 每个CPU有专门的指令集
- CPU内有一些用来保存关键变量和临时数据的通用寄存器
- 寄存器:
--通用寄存器
-- 程序计数器:程序计数器是用于存放下一条指令所在单元的地址的地方。
--程序状态字(Program Status Word, PSW)寄存器,PSW用来存放两类信息:一类是体现当前指令执行结果的各种状态信息,如有无进位(CY位),有无溢出(OV位),结果正负(SF位),结果是否为零(ZF位),奇偶标志位(P位)等;另一类是存放控制信息,如允许中断(IF位),跟踪标志(TF位)等。
存储器
- 从访问时间(小到大)、典型容量(小到大):寄存器,高速缓存,内存,磁盘,磁带
I/O设备
- 包括设备控制器&设备本身
- 每个设备控制器都有少量的用于通信的寄存器
- 有的计算机中,设备寄存器被映射到操作系统的地址空间,可以像普通存储字一样读写,不需要专门的I/O指令,但是占用了一些地址空间;另一些计算机中,设备寄存器被放入专门的I/O端口空间中,提供内科态中使用的专门IN和OUT指令,不占用地址空间,但是需要专门的指令
- 实现输入输出有三种
-- basy waiting:CPU一直轮询设备直到对应的I/O操作完成
-- 设备驱动程序启动设备并且让该设备在操作完成时发出一个中断。中断:设备驱动程序通过写设备寄存器通知设备控制器做什么,完成后,使用特定的总线发信号给中断控制芯片,在CPU芯片的一个管脚上声明,中断控制器把该设备的编号放在总线上,这样CPU可以读总线,并且知道哪个设备刚刚完成了操作
-- Direct Memory Access(DMA) 直接存储器访问芯片:控制在内存和某些控制器之间的位流。CPU对DMA芯片进行设置,说明需要传送的字节数、有关的设备和内存地址以及操作方向,接着启动DMA。当DMA完成时,引发一个中断
启动计算机
- 基本输入输出系统(Basic Input Output System)
- BIOS内有底层I/O软件,包括读键盘、写屏幕、进行磁盘I/O以及其他过程,存放在RAM中,时非可易失性的
进程
- 进程表:该表项包含了除了该进程自身地址空间以外,操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。
- 一个(挂起的)进程包括:进程的地址空间,以及进程表项
文件
- special file(特殊文件):UNIX中,使I/O设备看起来像文件一般,保存在/dev目录中
-- block special file(块特殊文件):由随机存取的块组成的设备,e.g. 磁盘
-- character special file(字符特殊文件):用于打印机、调制解调器和其他接受或输出字符流的设备
系统调用
- 包括创建和终止进程,创建、删除、读入、写入文件,目录管理以及完成输入输出
用于进程管理的系统调用
- fork:创建原有进程的精确副本,包括文件描述符,寄存器等全部内容。其中一个的后续变化不会影响到另一个。fork调用,子进程返回0,父进程返回子进程PID
- 文件描述符:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2
#define TRUE 1
while (TRUE)
{
type_prompt();
read_command(command, parameters);
if(fork()!=0) //子进程
waitpid(-1, &status, 0);
else //父进程
execve(command, parameters, 0);
}
- exit():在进程完成执行后的系统调用,退出状态(0~255)通过waitpid中的status返回给父进程
用于文件管理的系统调用
- open:通过绝对路径或指向工作目录的相对路径名指定要打开的文件夹名称
- lseek:改变文件当前位置的指针,可以在文件的任何地方开始。三个parameter,文件描述符,文件位置,文件位置是相对于文件起始位置、当前位置or文件的结尾。返回文件中的绝对位置
- UNIX为每个文件保存了该文件的类型(普通文件、特殊文件、目录等),大小,最后修改时间以及其他信息。通过stat查看
用于目录管理的系统调用
- mkdir,rmdir
- link: 允许同一个文件以两个或以上的名称出现
- i-node:UNIX中,每个文件都有唯一的编号,i-number,是对i-node的一个引用,说该文件的拥有者,磁盘块的位置等
各种系统调用
- chdir:调用改变当前的工作目录 chdir("/usr/ast/test");
- chmod:chmod("file", 0644)
- kill:发送信号。若一个进程准备好捕捉一个特定的信号,那么,在信号到来时,运行一个信号处理程序。如果该进程没有准备好,那么信号的到来会杀掉该进程
进程与线程
进程
创建进程
- fork和execve分开,是为了在fork之后exec之前允许该子进程处理其文件描述符,可以完成对标准输入输出和标准出错的重定向
- 进程创建后,父进程和子进程有各自不同的地址空间(不可写的区域是共享的)
进程的层次结构
- 在UNIX中,进程和它的所有子女以及后裔组成一个进程组。当用户从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员(通常是当前窗口创建的所有活动进程)。每个信号可以分别捕获该信号、忽略该信号或采取默认动作,即被杀死
进程的状态
- 状态:运行态(该时刻进程实际占用GPU),就绪态(可运行,但因其他进程正在运行而暂时停止),阻塞态(除非外部事件发生,否则进程不能运行,如有效输入)
进程的实现
- process table(进程表):也称processing control block(进程控制块),包含了进程状态的重要信息,包括程序计数器,堆栈指针,内存分配情况,所打开文件的状态,账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断
- interrupt vector(中断向量):与每一类I/O类关联的时称作中断向量的位置(靠近内存底部的固定区域)。包含中断服务程序的入口地址。
- 当一个磁盘发生中断时,用户进程3正在进行,则中断硬件将程序计数器、程序状态字,有事还有一个或多个寄存器压入堆栈,极端机随机跳转到中断向量所指示的地址。之后软件接管剩余工作
线程
- 三个线程并行,每个获得CPU速度的三分之一
- 所有的线程都有完全一样的地址空间,共享全局变量,线程之间没有保护
网友评论