操作系统补充

操作系统

操作系统是一个管理软硬件资源,调度各类作业从而方便用户使用的软件

管理 处理机、存储器、设备和文件


进程间通信

IPC 是什么

每个进程有自己的地址空间,进程的全局变量在另一个进程中是看不到的。所以进程间交换数据必须通过内核,通过在内核中开辟一块缓冲区,A进程把数据放进去,B进程把数据取走,这种机制叫 IPC

信号

一般用来通知进程发生了异步事件,任何进程都不需要监听信号是否到来。信号例如键盘发来中断信号

消息队列

是消息的链表,存放在内核中,可以向另一个进程发送数据块,每个数据块都有对应的类型。和管道一样,队列大小有限制,不过克服了管道只能承载无格式字节流的缺点,并且可以双向通信

共享内存

两个进程中不同的虚拟地址空间映射到同一个物理地址,指向的这块区域就是共享内存

信号量

主要用来解决互斥同步的问题

管道

命名管道

socket

总结

共享内存效率最高,但是不能跨主机通信


子进程

调用 fork ,根据现有的进程复制出一个新进程,是原进程的子进程,相当于克隆了自己。复制时,在虚拟地址空间中,子进程会复制父进程的代码段和数据段;在物理空间,子进程会先和父进程共享物理空间,等到父子进程涉及对物理空间修改时,再给子进程分配物理空间


进程上下文切换

上下文就是指 CPU 寄存器和程序计数器,这些就是所谓的 CPU 环境

  • 指令寄存器存储了当前要执行的指令
  • 程序计数器存储下一条指令的地址

上下文分为用户级上下文、寄存器上下文和系统级上下文

在进程开始运行前,要先设定好 CPU 寄存器 和 程序计数器

进程在 用户态 和 内核态 进行切换时,也会发生上下文切换


进程组

进程组就是一些进程的组合,他们之间存在父子、兄弟之间的关系。进程组方便对进程进行批量管理


守护进程

进程和一个会话关联,而会话又和一个控制中断关联。中断关闭后,对应的会话中的所有进程会被关闭。为了让进程可以不受终端的掌控,引入了守护进程,这种进程可以在后台服务,有较长的生命周期。

大致步骤是:创建子进程,父进程退出,所有工作在子进程中进行,形式上脱离了终端;在子进程中创建新的会话,让进程完全独立


PCB 进程控制块

PCB 是系统为了描述和控制进程的运行而定义的一个数据结构,其中存储了操作系统所需的关于进程的全部信息,是进程存在的唯一标志。有不同的组织形式,索引表或者链表


进程到线程

  • 最早的 CPU 一次只能执行一个程序
  • 引入进程后可以支持多任务,但是也产生了新的问题
    • 为每个进程分配资源开销较大
    • 进程频繁切换开销较大
    • 进程间通信复杂
  • 之后就引入在进程中开辟“小进程”来实现多任务,也就是线程
    • 线程在进程内部共享很多进程的资源,分配资源开销不大
    • 上下文切换只涉及寄存器内容的设置和保存
    • 线程可以共享进程的部分地址空间,通信也不麻烦

操作系统中每个线程一般都会有 线程ID,一组寄存器值,栈,线程私有数据等


用户态和内核态的线程

现代的操作系统主要是,用户态实现线程在非阻塞时的切换,内核态实现内存阻塞时的切换