操作系统补充
操作系统
操作系统是一个管理软硬件资源,调度各类作业从而方便用户使用的软件
管理 处理机、存储器、设备和文件
进程间通信
IPC 是什么
每个进程有自己的地址空间,进程的全局变量在另一个进程中是看不到的。所以进程间交换数据必须通过内核,通过在内核中开辟一块缓冲区,A进程把数据放进去,B进程把数据取走,这种机制叫 IPC
信号
一般用来通知进程发生了异步事件,任何进程都不需要监听信号是否到来。信号例如键盘发来中断信号
消息队列
是消息的链表,存放在内核中,可以向另一个进程发送数据块,每个数据块都有对应的类型。和管道一样,队列大小有限制,不过克服了管道只能承载无格式字节流的缺点,并且可以双向通信
共享内存
两个进程中不同的虚拟地址空间映射到同一个物理地址,指向的这块区域就是共享内存
信号量
主要用来解决互斥同步的问题
管道
命名管道
socket
总结
共享内存效率最高,但是不能跨主机通信
子进程
调用 fork ,根据现有的进程复制出一个新进程,是原进程的子进程,相当于克隆了自己。复制时,在虚拟地址空间中,子进程会复制父进程的代码段和数据段;在物理空间,子进程会先和父进程共享物理空间,等到父子进程涉及对物理空间修改时,再给子进程分配物理空间
进程上下文切换
上下文就是指 CPU 寄存器和程序计数器,这些就是所谓的 CPU 环境
- 指令寄存器存储了当前要执行的指令
- 程序计数器存储下一条指令的地址
上下文分为用户级上下文、寄存器上下文和系统级上下文
在进程开始运行前,要先设定好 CPU 寄存器 和 程序计数器
进程在 用户态 和 内核态 进行切换时,也会发生上下文切换
进程组
进程组就是一些进程的组合,他们之间存在父子、兄弟之间的关系。进程组方便对进程进行批量管理
守护进程
进程和一个会话关联,而会话又和一个控制中断关联。中断关闭后,对应的会话中的所有进程会被关闭。为了让进程可以不受终端的掌控,引入了守护进程,这种进程可以在后台服务,有较长的生命周期。
大致步骤是:创建子进程,父进程退出,所有工作在子进程中进行,形式上脱离了终端;在子进程中创建新的会话,让进程完全独立
PCB 进程控制块
PCB 是系统为了描述和控制进程的运行而定义的一个数据结构,其中存储了操作系统所需的关于进程的全部信息,是进程存在的唯一标志。有不同的组织形式,索引表或者链表
进程到线程
- 最早的 CPU 一次只能执行一个程序
- 引入进程后可以支持多任务,但是也产生了新的问题
- 为每个进程分配资源开销较大
- 进程频繁切换开销较大
- 进程间通信复杂
- 之后就引入在进程中开辟“小进程”来实现多任务,也就是线程
- 线程在进程内部共享很多进程的资源,分配资源开销不大
- 上下文切换只涉及寄存器内容的设置和保存
- 线程可以共享进程的部分地址空间,通信也不麻烦
操作系统中每个线程一般都会有 线程ID,一组寄存器值,栈,线程私有数据等
用户态和内核态的线程
现代的操作系统主要是,用户态实现线程在非阻塞时的切换,内核态实现内存阻塞时的切换