引导扇区、中断、指令执行周期、多处理器系统、集群、作业调度、虚拟内存、双重模式、定时器
POSIX、系统调用、文件、进程(进程控制块、进程调度、进程创建、进程终止、进程通信、socket、远程过程调用<RPC>、JAVA的RPC机制<RMI>)
同步(Synchronous)、异步(Asynchronous)、阻塞(Blocking)、非阻塞(Non-blocking)
引导扇区 (Boot Loader,512Byte)
计算机开机的时候需要运行一个初始化程序,又名引导程序。这段程序用于自检设备,初始化系统,包括CPU寄存器、设备控制器和内存,然后运行操作系统。通常,引导程序位于ROM或EEPROM中。装入操作系统的关键在于定位操作系统,即知道操作系统入口在哪里。
中断(Interrupt)
操作系统开始执行,初始化完毕以后,就静静地等待事件的发生。事件的发生通过中断表示。硬件和软件都可以中断。当CPU中断时,它暂停当前工作,立即开启中断服务程序(ISP),执行完毕以后,重新回到被中断的工作。中断发生时,为了尽快开启相应的中断服务程序,会有一份这些服务程序的地址指针表,称为中断向量表.
指令执行周期
- 从内存中获取从程序计数器(PC)指向的指令,并保存在指令寄存器(IR)。
- 指令被解码,并可能导致从内存中获取操作数或将操作数保存在内部寄存器中。
- 在指令完成对操作数的执行后,结果存回到内存。
多处理器系统
多处理器系统有三个优点:
- 增加吞吐量
- 共享外设、存储和电源,节省资金
- 增加可靠性,一个处理器挂掉,系统只会变慢,而不会崩溃。
非对称多处理器系统,CPU一主多从;对称多处理器系统,所有CPU对等。
目前的CPU趋势是单芯片,多内核,相当于多处理器。
集群(Cluster)
集群通常用于打造高可用性,集群中一个系统出错,服务仍然可以继续。
1)非对称集群 —— 比如热备份模式
2)对称集群 —— 所有机器都运行应用程序,互相监视。能充分使用硬件资源,更为高效。
3)并行集群 —— 多个主机共享数据。一致性控制是关键。
4)WAN集群 —— 分布式集群
作业调度
分时和多道程序设计需要在存储器中同时保存几个作业。通常由于主存较小而不能容纳太多作业,所以刚开始时作业会存储在作业池中。所谓的作业池,放在磁盘中,由等待分配内存的作业组成。调入哪些作业进内存执行,称为作业调度。
同时,系统也必须在分配CPU上做出选择,是为CPU调度。除此而外,相关的还有进度调度、磁盘存储、内存管理等等。
虚拟内存
虚拟内存允许一个执行中的作业不完全放在内存中,适合程序比物理内存大的情况。另外,虚拟内存将内存抽象成逻辑内存,与真正的物理内存区隔开,使程序员不必为内存空间的限制而担心。
双重模式
用户模式(用户态?) 和 内核模式(监督程序模式、管理模式、系统模式、特权模式、核心态?)
系统引导时,机器处于内核模式;装入操作系统,开始在用户模式下运行。一旦出现陷阱(软件错误会触发陷阱)或中断(硬件或软件中断),就会从用户模式切换到内核模式。
双重模式提供了保护操作系统和用户程序不受错误用户程序影响的手段。实现原理为:用户模式下,执行只有在内核模式下的指令(特权指令)是不行的,会被认为非法,以陷阱形式通知操作系统。
双重模式需要硬件支持。在计算机硬件中增加一个模式位,内核模式为0,用户模式为1,以此区分。
缺乏硬件支持的双重模式会产生一些缺点。比如奔腾以前的英特尔CPU,MS-DOS下系统很容易崩溃。
定时器
防止用户程序执行时间过长
POSIX(Portable Operating System Interface 可移植操作系统接口)
系统调用(System Call)
用户应用程序调用系统调用接口的API(应用程序接口),系统调用接口截获这个请求,并调用操作系统中相应的系统调用。对于用户应用程序来说,不需要知道这里面的细节,只关心操作结果。
文件
文件是一个逻辑概念,属于虚拟设备。
进程(Process)
进程是执行中的程序,除了程序代码,还包括该程序的当前活动,包括程序计数器的值,处理器的寄存器内容,堆栈段(临时数据,如函数参数,返回地址,局部变量等)和 数据段(全局变量),可能还有堆(进程运行期间动态分配的内存)。
程序本身不是进程,程序是被动实体,而进程是活动实体。同一个程序,可以同时对应多个进程,但进程之间是独立的。进程与程序的关系,就类似对象与类的关系。
1> 进程控制块(PCB)
进程在操作系统内用进程控制块来表示。
PCB包含一系列进程信息:
- 进程状态:新建(New)、就绪(Ready)、运行(Run)、挂起(Suspend)、结束(End)
- 程序计数器:当前进程要执行的下个指令的地址
- CPU寄存器
- CPU调度信息:优先级等
- 内存管理信息
- 记账信息:CPU时间、实际使用时间、时间界限、记账数据、作业或进程数量
- IO状态信息
2> 进程调度
为使CPU使用率达到最大化,操作系统在进程之间快速切换CPU以便用户在程序运行时能与其交互。进程调度负责选择一个可用的进程到CPU上执行。
1、调度队列
调度队列又称为作业队列。作业队列包括就绪队列、设备队列(IO队列)。
- 驻留在内存中,准备就绪,等待运行的进程保存在就绪队列
- 等待IO设备的进程列表称为设备队列
队列通常用链表来实现:头节点指向第一个和最后一个PCB;每个PCB指向下一个。
进程首先会进入就绪队列;分配了CPU后,开始执行;顺利的话,一口气最终完成;或者被中断,强行释放CPU,重新回到就绪队列;或者等待特定事件发生(如完成IO请求)。请求IO时,如果有许多进程都进行请求,那么进入设备队列,依次执行。也有的会创建子进程,等待其结束。
2、调度程序
进程调度程序分为长期调度程序和短期调度程序。
- 长期调度程序负责将进程从缓冲池中调入就绪队列或IO队列,执行频率不频繁,关键在于在CPU为主和IO为主两个队列的安排中取得平衡
- 短期程序负责为进程分配CPU,执行
- 中期调度程序负责将中断后的进程从就绪队列中换出,时机成熟时再换入,从中断处再执行
进程一旦被执行,那么一直在就绪队列、CPU之间切换,直到执行完毕,不会中途退出一说。
3、上下文(Content)
中断、进程切换,都涉及到上下文。进程上下文用PCB表示,用于中断或切换前的状态保存,到重新执行的状态恢复。上下文切换速度与硬件有关。上下文切换,系统并不能做什么有用的工作。
3> 进程创建
进程在执行过程中,可以创建新进程。那么这个进程称为父进程,新建的进程为子进程。同理,子进程又可以创建自己的子进程,子子孙孙,无穷匮也,形成进程树。
大多数操作系统使用进程标识符(PID)来识别进程。
通常,进程需要资源来完成任务(如CPU时间、内存、文件、IO设备)。在创建子进程时,子进程可能从操作系统获得资源,也可能从父进程获得。限制子进程只能使用父进程的资源可以防止创建进程过多,导致系统超载。另外,创建之时,初始化数据也由父进程传递给子进程。
子进程创建之后,有2种执行可能:
1)父子进程并发执行
2)父进程等待子进程执行完毕再执行
子进程的地址空间也有2种可能:
1)子进程是父进程的克隆,这样父子有相同的程序和数据
2)子进程装入新程序,另起炉灶
Unix中,通过fork()函数来开辟新进程。fork,分叉的意思。系统调用该函数,返回值为0;父进程调用,返回新进程的PID,这样便于父进程对它进行控制。Windows有类似机制,但Unix是子进程为父进程的复制品(上述情况1),而WINDOWS则要传很多参数给新进程(上述情况2)
4> 进程终止
进程可以终止自身;也可以由其他进程调用相关系统服务终止,但通常只能由父进程进行这样的调用,避免360与腾讯互相攻击。
父进程终止子进程有许多理由,如:
1)子进程使用资源太过
2)子进程的任务已out
3)父进程终止
5> 进程通信
进程之间往往需要协作,理由:
1)信息共享
2)并行,提高运算速度(需要多CPU或I/O通道)
3)模块化
4)多任务
进程协作 需要通信机制(interprocess communication,IPC)。有两种基本模式:
- 共享内存—— 生产者、消费者模式;
- 消息传递—— 系统提供,采用中转机制进行中转。
消息传递处理简单,但速度不如共享内存快,适合交换数据量少,或者用在分布式系统;共享内存速度快,可处理比较多的数据量,不过有同步问题,处理机制较为复杂。两种模式应用都很广泛,并且许多操作系统同时具备这两种模式。
6> socket
套接字,通信的端点,由IP地址与端口号组成。一对进程进行网络通信,需要使用一对socket,通常一个做服务器,一个做客户端。服务器通过监听指定端口,收到请求,接受连接,即可完成连接,进行通信。凡1024以下的端口,都被认为是实现了标准服务的端口。所以,我们要用的话,可以用大于1024的端口。
7> 远程过程调用(RPC)——面向过程
类似于IPC机制,但交换的消息有很好的结构,用做传递给函数的参数。跟Socket一样,也是通过端口来进行消息的传送。说不定,就是socket在做底层支持。
RPC的机制,是服务器端在客户端有一个存根,客户端要调用服务器端的方法,就通过这个存根。这个存根代办参数的准备,发送,接收。然后服务器端也有个存根,做相关处理工作。
RPC有几个问题处理:
1)机器之间的数据表示可能有差异
2)保证远程调用的有且只有一次,一是避免重复调用;二是要保证有调用。前者用时间戳;后者用ACK(确认字符),客户端周期性向服务器发出PRC调用,直到收到服务器的ACK回应为止。
8> JAVA的RPC机制(RMI)——面向对象
与普通RPC最大的区别就是,它的参数可以是对象。传递的对象如果是引用远程对象,不必多言;如果是本地,需要序列化后再传递给对方。
存根为远程对象的代理,驻留于客户机中。
同步(Synchronous)—— 同时按顺序执行,数据保持一致
异步(Asynchronous)—— 分工执行,先后顺序不一定,数据难保持一致
阻塞(Blocking)—— 内存不足、CPU未分配或需要等待IO操作时,进程挂起(换出到外存中),所分配的资源被释放
非阻塞(Non-blocking)—— 内存不足、CPU未分配或需要等待IO操作时,进程睡眠(仍在内存中),所分配的资源不释放