结构
- 操作系统服务:
- 基本服务:用户界面、程序执行、I/O操作、文件系统、通信、错误检测
- 增值服务:资源分配、统计、保护和安全
- 操作系统用户界面:CLI\GUI
- 系统调用:程序通过API(应用程序接口)访问
- 每个系统调用有一个固有番号,操作系统通过系统调用番号表管理系统调用接口(Linux在‘syscalls.h’或‘unistd.h)
- 系统调用传参三种方式:寄存器、块、栈
- 系统程序:不属于内核,但属于操作系统
- 操作系统设计与实现:受硬件选择、系统类型影响
- 设计目标:用户、系统目标
- 操作系统结构:简单、层次、微内核(用户内核间开销增加)、模块(使用面向对象方法)、混合
- 内核:硬件之上和系统调用接口下所有部分
进程
- 进程概念:执行中的程序(被动实体),是活动实体
- 作业是任务实例
- 程序载入内存变为进程
- 结构/表现形式:代码段、堆、栈、数据段
- 操作系统通过控制表堆系统中的每个资源进行管理
- 数据结构:PCB:进程控制块(进程ID、进程状态、进程计数器、CPU寄存器、CPU调度信息、内存管理、记账、I/O状态)
- 进程状态
- 进程调度
- 进程调度队列:就绪队列、设备队列
- 运行状态发生以下事件进入就绪状态:
- 进程发出I/O请求被放到I/O队列
- 创建子进程并等待子进程结束
- 等待中断而强制释放CPU
- 用完时间片
- 运行状态发生以下事件进入就绪状态:
- 调度程序(调度器)
- 长期(作业)调度程序:从存储设备缓冲池选择装入就绪队列(I/O调度)
- 中期调度程序(分时系统):进程移出内存,即移出CPU竞争,降低多道程序设计程度,分时系统增加中期调度程序
- 短期调度程序(CPU调度程序):从准备执行队列中选择一个为之分配CPU
- 上下文切换:切换到另一个进程保存当前进程状态,恢复另一个进程状态,依赖于硬件支持 (如内存速度、存储器数量等)
- 提供多组寄存器只改变寄存器组指针减少上下文开销
- 进程调度队列:就绪队列、设备队列
- 进程操作
- 创建fork():资源共享、执行、地址空间选项
- 步骤:创建进程控制块、分配内存、载入可执行文件、初始化程序
- 终止abort()
- 子进程使用超过它所分配的资源
- 子进程任务不再需要
- 父进程终止导致子进程终止(级联终止)
- 僵尸进程:进程终止但是没用被父进程等待
- 创建fork():资源共享、执行、地址空间选项
- 进程通信
- 系统内并发运行的进程可以是相互独立(不共享数据)或协作工作(共享数据)
- 消息传递:需要内核干涉,少量数据,易于实现
- 通信线路逻辑实现:直接或间接通信;同步或异步通信;自动或显示缓冲。
- 直接通信:明确命名通信接受发送者。对称寻址(一对一)(一个线路只有两个进程有关,两个进程之间只有一个线路),非对称寻址(多对一)
- 间接通信:通过端口/邮箱发送,线路可与多进程关联
- 阻塞(同步)发送:发送进程阻塞直到成功发送,接收进程阻塞直到有消息可用
- 非阻塞(异步)发送
- 缓冲区:通信进程所交换的消息都驻留在临时的队列,即缓冲区
- 消息队列实现方式:零容量、有限容量、无限容量
- Windows中的消息传递成为LPC
- 通信线路逻辑实现:直接或间接通信;同步或异步通信;自动或显示缓冲。
- 共享内存:不需要内核干涉,速度快
- 共享内存区域实现:无限缓冲、有限缓冲
- 客户机与服务器系统通信
- sockets套接字:IP地址、端口号组成
- TCP:面向连接套接字
- UDP:无连接套接字
- 远程过程调用RPC:每个独立远程调用过程有一个存根(stubs),隐藏通信发生细节。调用子程序或函数,普通数据结构传输
- 远程方法调用RMI:调用远程对象的方法,可以对象传输
- sockets套接字:IP地址、端口号组成
- 管道PIPE:通信中间介质是文件 FIFO实现
- 匿名管道:半双工,单向通信。父子进程、兄弟进程可用
- 命名管道:任意范围
线程
- 概述:每个线程是独立的调度对象,一个进程可以有多个线程
- 创建线程pthread_create():复制栈、寄存器
- 线程共享:代码段,全局变量;打开的文件标识符,工作环境
- 多线程优点:响应速度快,资源共享,经济,多处理器体系结构利用
- 多线程模型
- 用户线程:内核支持,用户层线程库管理,无需内核管理
- 内核线程:内核管理调度维护
- 映射:用户线程和内核线程建立起的联系
- 线程库:实现方式:嵌入内核,非嵌入内核
- 多线程问题
- 调用fork()和exec()
- 线程取消:异步(一个线程立即终止目标线程)、延迟取消(不断检查)
- 信号处理:同步(内部信号),异步(外部)信号
- 处理程序:默认信号处理程序,用户定义的信号处理程序
- 发送信号方法依赖于产生信号的类型
- 线程池:多对多和二级模型中用户线程和内核线程需要通信维持内核线程数量
- LWP:虚拟处理器
- 调度程序激活:解决用户线程库和内核通信,机制称为upcall