进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时需要等待CPU服务,显然进程的状态是在不断变化的。为了方便对各个进程的管理,操作系统将进程合理的划分为几种状态
占有CPU,并在CPU上运行。
单核处理器下,同一时刻最多只有一个进程处于运行态,双核环境下可以有两个进程处于运行态
已经具备运行条件,但由于没有空闲CPU,而暂时不能运行
注意这里所说的具备运行条件是指进程已经拥有了除CPU以外的所有需要的资源,包括所需要的设备的控制权限,缺少的只有CPU的控制权
又称等待态,因等待某一事件而暂时不能运行
例如,等待操作系统分配打印机的控制权限,读取磁盘操作的请求等。CPU是计算机中最昂贵的不见,为了提高CPU利用率,需要先将其他进程所需资源分配到位,才能得到CPU服务
也称新建态,进程正在被创建,操作系统为进程分配资源,初始化PCB的阶段
进程正在从系统中撤销,操作系统回收进程拥有的资源,撤销PCB
可能是由于进程运行结束,也可能是由于bug导致进程无法继续执行(例如数组越界或数学错误)
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新线程,撤销已有线程,实现线程状态转换等功能
简言之,进程控制就是要实现进程各个状态之间的转换
原语的特点是执行期间不允许中断,只能一次全部执行完成。这种不可中断的操作也称原子操作。
原语采用“关中断指令”和“开中断指令”实现。代码执行前执行关中断指令,所有代码执行结束后执行开中断指令,在此期间,外部的中断信号会被忽略,待开中断指令执行后,再开始处理传来的外部中断信号,由此保证了原语的执行特点
显而易见,关中断/开中断指令的权限十分大,二者都是只允许在核心态下执行的特权指令
无->创建态->就绪态
就绪态/阻塞态/运行态->终止态->无
阻塞原语和唤醒原语必须成对出现
运行态->阻塞态/就绪态
就绪态->运行态
进程通信指进程之间的信息交换
进程是系统分配资源的单位(包括内存地址空间),因此各个进程拥有的内存地址空间相互独立,为了保证系统安全,一个进程不能直接访问另一个进程的地址空间。
但是有时进程之间的信息交换又是必须实现的,为了保证进程间的安全通信,操作系统提供了多种方法进行进程间的通信
两个进程都不能直接访问对方的地址空间,所以两个进程在内存中开辟出一块共享空间用于通信。
两个进程对共享空间的访问必须是互斥的,即A在访问共享空间时,B不可以访问(互斥访问通过操作系统提供的工具实现,即同步互斥工具,如P,V操作)
共享存储又分为以下两种
共享空间里只能存放提前规定好的某种数据结构(例如长度为10的数组),这种方式共享的速度慢,对共享数据的限制多,是一种低级通信的方式
在内存中画出一块共享存储区。数据的形式,存放位置由进程控制,而不再是操作系统,相较于前一种速度更快,是一种高速通信方式
管道是指用于连续读写进程的一个共享文件,又名pipe文件,其实就是在内存中开辟一个固定大小的缓冲区
进程间的数据交换以格式化的信息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换
A进程通过发送原语向B进程发送消息,B进程利用接收原语接收信息,并将消息挂到本进程的消息缓冲队列上,逐个读取消息缓冲队列的消息
消息不直接在两个进程间传递,而是首先由发送方通过发送原语发送到中间实体(信箱)中,然后接收方利用接收原语找到信箱中发给自己的信息。所以该种通信方式也称“信箱通信方式”