操作系统主要是用来屏蔽复杂的硬件细节,高校的管理计算机资源,并为用户提供丰富的程序接口。操作系统是随着硬件的发展而发展的。下面回顾了一些基本概念。

System Call

系统调用是用户在编程时可以调用的操作系统功能,所以系统调用是一个简称,全称是操作系统功能调用。系统调用会使CPU从user mode变成kernel mode。System Call一般有很多种,比如进程创建,IO操作。一个应用程序可以直接进行系统调用,但是一般情况下都是通过API接口或者编程语言的库函数进行调用,然后一个系统调用可能调用一个或多个内核函数来完成对应的功能操作。

Register

Register寄存器,主要用来记录CPU的指令、数据和地址。其本质上是少量且快速的电脑内存。

Privilege Instruction

特权指令在CPU寄存器中,主要用于系统资源的分配和管理,包括改变系统工作方式,检测用户的访问权限,修改虚拟存储器管理的段表、页表,完成任务的创建和切换等。

Interrupt

Interrupt,是操作系统中断,目的是为了支持CPU和设备之间的并行操作。中断本质是CPU对系统发生的某个事件的一种反应。发生了某一事件之后,CPU会暂停正在执行的程序保留现场。自动去执行对这个事件的处理程序完成了这个处理过程之后,返回到断点继续执行刚才被打断的程序。具体类型有IO中断,时钟中断,硬件中断

Exception

Exception,是操作系统异常,表示CPU执行指令遇到了问题,比如,内存越界。

Trap

陷阱或者陷入Trap,指的是当异常或者中断发生时,处理器捕捉到一个执行线程,并且将控制权转移到操作系统中某一个固定地址的机制。也就是从用户level转移到操作系统level。

Multi-programming

允许多个程序同时进入内存并运行,其目的是为了提高系统运行效率。

Process

Process是操作系统进程,它准确的刻画一个并发环境下,并发程序的执行。进程是具有独立功能的程序,是关于某个数据集合上的一次运行活动[也就是说一个程序执行三次就是三个不同的进程],是系统进行资源分配和调度的独立单位。每个进程拥有独立的地址空间。操作系统会根据进程的状态维护不同的队列,来进行调度。进程是可以交互并且异步的。

Process Control Block

PCB是进程控制块,又称进程描述符,进程属性。用于管理进程和记录进程的各种属性,描述进程的变化过程。一进程对应一个PCB。进程表就是PCB的集合。进程表的大小就可以代表一个操作系统并发度[还是因为一个PCB对应一个Process]。

在UNIX中进程通过fork和exec配合来实现。UNIX拥有一个init进程,所有进程都是其后代,最开始的进程创建是通过fork这个init进程来完成的,也就是一个“祖宗进程”。

Primitve

原语描述了操作系统的不能被打断的原子操作,复杂的操作都是由原子操作组成的。

Context Switch

上下文转换指的是CPU硬件状态从一个进程转换到另一个进程的过程。一个进程运行时,相关的信息会保存在CPU中的寄存器,当换到另一个进程的运行时,CPU中的寄存器需要切换到对应的信息以完成运行。

Thread

有了进程之后,还是需要线程Thread,因为,需要更高程度的并行化。线程是进程的运行实体[甚至可以看成是进程中的不同function]。有了线程之后,进程还是资源的基本管理单位,但是线程成为了基本的调度单位。

Mutual Exclusive

互斥,各个进程在使用共享资源的时候需要排他性的时候,就是老子在用的时候其他人都不能用,进程之间的关系叫做进程互斥。

Critical Resource

临界资源,互斥资源,共享资源。是系统中一次只能被一个进程使用资源。

Critical Section

各个进程中操作临界资源的代码片段,叫做临界区。没有进程在临界区的时候,其他进程可以进入临界区。而且不允许两个进程同时处于临界区中,临界区以外运行的进程不得阻塞其他进程进入临界区。

Semaphore & PV

Semaphore信号量,是一种特殊变量,用于进程之间传递消息的一个整数值。其定义是一个结构体

struct semaphore 
{
    int count;
    queueType queue;
}

其可用操作只有三个,初始化操作,P操作[荷兰语porberen,意为test],V操作[荷兰语verhogen,意为increment]。PV两个操作为primitive操作。P操作会对信号量的count进行-1,并且检查信号量的count值是否小于0,如果小于0,则该进程状态为阻塞状态,并放到等待队列queue末尾以备重新调度。如果不小于0,则CPU执行进程临界区的操作。V操作是对信号量的count进行+1,并检查count是否小于等于0,如果小于等于0则唤醒一个等待队列你的进程,改变其状态为就绪,并放入就绪队列,否则继续执行该进程操作。信号量的count如果是正整数或者0,其可用资源数量,初始值设为1,表示有一个可用资源。如果为负整数其绝对值表达了正在等待的进程数量。

具体信号量和PV操作过程:(1)首先分析并发进程的活动,确定临界区。(2)设置信号量mutex,并初始化为1。(3)在临界区前实施P操作。(4)出了临界区实施V操作。

Monitor

用信号量或者pv操作的时候,对于编程要求比较高,对于逻辑要求比较清晰,一般人搞不定,经常出错。小错还行,大错就得出事,所以出现了Monitor管程机制。管程是一个程序模块,进行共享数据操作的一组过程。进程只能通过调用管程来访问管程内部的数据结构。所以可以把管程看成进程中的一个内部类,进程通过调用管程提供的方法来操作管程的内部共享数据。 管程主要用来解决互斥问题,所以是互斥进入的,有一个进程在调用管程里的过程,就不允许其他进程调用。同时还要解决同步操作,所以管程内部会进行条件变量判断及等待唤醒操作。

MMU

MMU(Memory Management Unit),即内存管理单元,主要责任是将CPU获得的虚拟地址转换成内存上的物理地址。

TLB

TLB(Translation Lookside Buffer),即转译后备缓冲器,转址旁路缓存,俗称快表。虽然叫buffer,但其本质是cache,用来缓存CPU经常访问的地址以便CPU快速访问。其最重要的也是最实用的是因为TLB有一个接线的逻辑。这个接线的逻辑可以让快表能够按特定的匹配算法,在一个存储周期内把所有的字进行同时的比较,也就是实现按内容并行查找。 比如在这个快表里,查找一个数值,那么我可以同时对快表的所有的单元同时查找,而且由于快,一个存储周期就可以把相应的内容进行比较了。

Buffer

缓冲技术(Buffer)主要是为了解决CPU与外部I/O设备之间速度不匹配的问题,在今天主要也是为了提高CPU与设备之间的并行工作能力。减少I/O设备对CPU的中断次数,放宽CPU对中断响应时间的要求。

可以想像CPU处理速度快,每隔1s就要写入disk一次,那disk很快就被玩坏了,所以可以先把cpu的写入请求放入一个缓冲区,然后一次性把多个写入请求写到disk中。

I/O Performance

IO性能经常是一个系统最大瓶颈,想要解决,基本思路都是从两方面入手:第一就是让CPU利用率尽量不被IO影响,第二就是让CPU摆脱IO。