进程概述
进程是为了操作系统进行并发操作而引入的概念,是程序运行的过程,也可以看成是进程实体的运行过程,是资源分配和调度的独立单位。
结构、组织方式和特征
进程的结构就可以看成是进程实体的结构:
PCB:进程的唯一标识。
代码段:内存中存放应用程序代码的地方
数据段:内存中存放应用程序要处理或执行后产生的数据的地方。
PCB的内容:
进程描述信息:进程标识符PID(创建时产生,唯一),用户标识符UID。
资源分配清单:进程分配到的资源,比如程序段指针、数据段指针、键盘、鼠标等。
进程控制信息:进程的状态与优先级
处理机状态:CPU寄存器里的信息,如程序计数器保存的程序执行到哪里的信息。
进程的组织方式:
- 链接方式:按照进程状态将PCB分在不同的队列里,选择相应状态的指针指向队列:
- 执行指针:指向包含当前正在执行的进程,如果是单核CPU,那么队列里只有一个PCB。
- 就绪状态指针:指向处于就绪状态的进程,通常会把优先级高的放在前面。
- 阻塞状态指针:指向处于阻塞状态的进程,还会根据阻塞原因不同分为不同的阻塞队列。
索引方式:给处于相同状态的进程创建一个索引表,不同的状态指针指向不同的索引表。
进程的特征:
- 动态性:最基本的特征
- 并发性
- 独立性
- 异步性:需要进程同步机制处理异步产生的问题
- 结构性
进程的状态
进程的基本状态:
新建态:进程被创建时处于的状态,等待系统分配资源、初始化PCB。
就绪态:获得了需要的各种资源,如摄像头等,但CPU被其他进程占据,需要等待获取CPU执行权。
运行态:占有CPU资源,在CPU上运行,单核CPU只有一个进程可以处于这个状态。
阻塞态:当进程需要等待某个事件时,如等待系统分配打印机,这是为了提高CPU的利用率,就会让进程暂停运行。
终止态:系统撤销进程的过程,回收进程占有的资源,撤销PCB。
进程的状态切换:从运行态切换到阻塞态,是进程主动发起的请求,所以只有在运行态的进程才可以进入阻塞态。从阻塞态不能直接回到运行态,要先进入进入就绪态。
进程控制
通过原语让线程进入某个状态或切换状态,就是进程控制。原语使用关中断指令后,CPU再收到中断信号就会被忽略,原语使用开中断指令后,就退出了原语程序的执行。
进程控制的基本操作:
更新PCB的信息:修改进程状态标志;如果要放弃CPU控制权,就要保存CPU环境;再开始运行前,恢复CPU环境。
将PCB插入到合适的队列
分配/回收资源。
开始线程的过程:
申请空白PCB
分配资源
初始化PCB
将PCB插入到就绪队列。
终止线程的过程:
从队列中找到相应的PCB
若进程正在运行,剥夺进程的CPU控制权,分配给其他进程。
终止所有子进程。
回收线程占用的资源给父进程或系统。
撤销PCB。
阻塞进程的过程:
从队列中找到相应的PCB。
保存进程的CPU环境,将PCB状态信息修改为“阻塞态”,剥夺进程的CPU控制权,分配给其他进程,从运行队列中删除PCB。
将PCB插入到相关事件的等待序列。
唤醒进程的过程:
从队列中找到相应的PCB。
将PCB状态信息修改为“就绪态”,从等待队列中删除PCB。
将PCB插入到就绪队列。
进程通信
每个进程都有一个独立的内存地址,是不能直接互相访问对方的内存空间,但有时进程之间必须要交换信息,比如你在手机上把图片分享到朋友圈,就需要把图片从图库的进程传到微信的进程,操作系统中实现进程间交换信息的功能就称为进程通信。
进程通信的方式主要有共享存储、管道通信、消息传递。
共享存储:操作系统为各个线程提供可以公共访问的数据资源。基于数据结构:各个线程只能存放特定的数据结构,如长度为100的数组,效率很低。基于存储区:操作系统提供共享内存空间,但数据的形式、存放的地址有进程控制,是一种高级通信方式。
管道通信:可以连接读写进程的共享文件,又叫pipe文件。
半双工通信,读的时候就不能写。要实现全双工,就得设置两条管道。
只有写满后才允许读,这时写进程就会被阻塞。只有读空后才允许写,这时读进程就会被阻塞。
因为数据一旦被读取后就从管道内被删除,所以读进程只能有一个,避免读错数据,写进程可以由多个。
消息传递:进程有一个消息缓存队列,接受其他进程发来的格式化消息。格式化消息类似于网络报文,由信息头和信息体组成。信息头主要包括发送进程的ID、接受进程的ID、类型、长度等信息。提供发送/接受原语来实现消息的发送与接受。
消息传有两种方式:
直接通信方式:直接发到接受进程的消息缓存队列,
间接通信方式:先传到一个中间实体,再传给接受进程。类似于先传给信箱,所以也叫信箱通信方式。