关于双重模式
操作系统为了机器防止运行对机器有害的代码,将指令分为用户模式和监督程序模式(也称管理模式、系统模式、内核模式或特权模式),可能造成危害的指令都是监督程序模式的指令,需要操作系统通过系统条调用来执行。为了区分这两种模式,计算机硬件中增加了模式位来表示当前模式(早期并没有硬件支持,所以早期系统在这方面更薄弱)。
为了防止一个用户进程无休止地抢占资源,进而妨碍其他进程运行,操作系统必须维持对CPU的控制。所以操作系统通常在开始一个进程之初会设置一个定时器,在定时器所规定时间内,进程需要将控制权从用户程序移交给系统,或者等到定时器到期,产生中断系统自动获取控制权。
系统调用分类
- 进程控制
- 文件管理
- 设备管理
- 信息维护
- 通信
通常编程人员编程时不需要关注系统调用,它们会被封装在平台所提供的API中,相比于系统调用,API更容易理解与操作,并且移植性更好。
三种常用的API:Win32 API(适用于window平台)、POSIX API(适用于几乎所有Unix,Linux 和Mac OS X)以及Java API
操作系统结构
- 简单结构:早期的,没有充分设计的
- 分层结构:上层只能使用下层的服务,构造和调试简单,难点是层的定义与划分
- 微内核:将所有非基础功能从内核中移走,以系统应用的方式实现。“基础功能”并没有明确定义,但应当包括进程管理,内存管理和通信
- 模块化:现代的操作系统设计方法。允许内核提供核心服务,也允许动态加载特定服务
进程
进程释义
进程是正在计算机中运行的程序,它不仅包括程序(代码段),还包括程序计数器、寄存器内容、堆栈段以及数据段。因为进程是在运行的程序,与时间相关,所以通过一个程序,在计算机中可以有多个进程。
进程的状态:
- 新的:进程正在被创建
- 运行:进程得到CPU的控制权,CPU正在执行进程的指令
- 等待:进程等待某个事件发生
- 就绪:进程等待获得CPU的控制权
- 终止:进程指令执行完成
一个处理器一个时刻只能有一个进程正在运行,但是可以有多个进程在等待或者就绪状态。
进程状态的转化
进程在操作系统的表示
在操作系统中,进程用数据结构“进程控制块”(PCB)表示,PCB中包含进程状态、程序计数器(进程要执行的下一跳指令的地址)、CPU寄存器、CPU调度信息(包括进程优先级、调度队列的指针等)、内存管理信息、记账信息(包括CPU时间、实际使用时间等)和I/O状态信息(I/O设备列表,打开文件列表等)。 在操作系统中,有多个PCB链表形成的队列,例如就绪队列用来记录所有在就绪状态的PCB,I/O队列用来记录所有等待I/O的PCB,这些队列可以用来表示进程正在做什么,并且辅助调度每个进程。进程调度程序
进程的调度通过调度程序来实现,调度程序可以分为两大类:长期调度(或称作业级调度)、短期调度(或称CPU级调度)。二者的区别是长期调度的执行周期更长,很可能几分钟才会执行一次(因为被调度的进程可能会持续运行几分钟才能切换CPU控制权),短期调度的执行周期更短,很可能执行数毫秒就需要再次调度。 此外,长期调度需要仔细选择需要执行的进程,执行I/O为主的进程为浪费CPU计算力,而执行CPU计算为主的进程会使I/O空闲,所以长期调度需要寻找互补的组合进程一起执行。进程间通信的方式
进程间可能需要协同工作,来实现消息共享、提高运算速度、模块化等目的。 进程间通信,有两种方式:共享内存以及消息传递,共享内存更快,可以达到内存速度,但是消息传递实现起来更方便而且不会引起冲突,在分布式的环境下更合适。共享内存
- 共享内存通信再细分可以区分出无限缓冲的共享内存和有限缓冲的共享内存,为了实现共享内存的目的(操作系统会阻止一个进程试图访问另一个进程的内存空间的操作),共享内存可能需要更多进程来实现。
同时,共享的内存空间的通信的数据结构格式,是由进程自己来控制的,同步访问问题也由进程来控制而不是操作系统。
消息共享
- 消息传递可以从三个方面进行区分:直接还是间接通信、同步还是异步(阻塞还是非阻塞)通信、自动还是显式缓冲
直接的消息传递,通信的进程双方之间只能架设一条通信链路(这条链路的物理实现可能是共享内存,可能是总线也可能是网络),并且至少一方需要知道另一方进程的标识符。
间接的消息传递,通信的双方可以把消息传递给一个第三方的邮箱,双方分别想这个邮箱发送和取回消息,这样的设计使得通信的双方可以有多个通信的链路(使用不同的邮箱),而且一个邮箱也可以供多个,而不仅仅是两个进程使用。
同步和异步的通信可以划分成同步的发送和同步的接受、异步的发送和异步的接受,四个相互组合。
显式缓冲是指通信的消息放置在一个临时的队列中,如果队列允许的最大长度是0,也就是说消息必须立刻被处理,则为显式缓冲;其他的(有限缓冲和无限缓冲)都被称为自动缓冲。