文章目录
第3章:进程
早期的计算机系统只允许一次执行一个程序
现代计算机系统允许将多个程序调入内存并发执行
进程的概念:执行中的程序
3.1 进程概念
本书中时常同时使用作业与进程这两个概念
3.1.1 进程
1.把进程仅仅理解为执行中的程序时不够准确的
2.进程不只是程序代码(文本段),进程还包括当前活动,通过程序计数器的值和处理器寄存器的内容表示。此外,进程通常还包括进程堆栈段(临时数据,函数参数,返回地址,局部变量)和数据段(全局变量)
3.程序本身不是进程,程序只是被动实体(仅仅是一个可执行文件而已)。进程是活动实体,进程有一个程序计数器用来表示下一个要执行的命令和相关资源集合。当一个可执行文件被装入内存时,一个程序才能成为进程
3.1.2 进程状态
进程分为以下几个状态
- 新的:进程正在被创建
- 运行:指令正在被执行
- 等待:进程等待某个事件的发生(比如I/O完成)
- 就绪:进程等待分配处理器
- 终止:进程完成执行
进程牛头图,要求完全理解并掌握
3.1.3 进程控制块
1.每个进程在操作系统内用进程控制块(process control block)(PCB)来表示
2.进程控制块的一个例子
- 进程状态:上面的五种基本进程状态
- 程序计数器:表示进程要执行的下个指令的地址
- CPU寄存器:保存出现中断时的状态信息,以便进程能正确地执行
- CPU调度信息:包括进程优先级等
3.2 进程调度
进程调度指的是在多个可用的进程集合中选择一个可用的进程到CPU上执行
3.2.1 调度队列
- 进程进入系统后,会被加到作业队列中,该队列包括系统中的所有进程
- 在内存中就绪的,等待运行的进程保存在就绪队列中。
- 该队列通常用链表实现
例:
3.2.2 调度程序
- 进程选择是由相应的调度程序执行的
- 长期调度程序(作业调度程序)从缓冲池(里面保存了进程)中选择进程并装入内存以准备执行
- 短期调度程序从准备执行的进程中选择进程,并为之分配CPU
- 短期调度程序执行的频率比较频繁,而长期调度程序执行得并不频繁
3.2.3 上下文切换
- 当发生一个中断时,系统需保存当前运行在CPU中进程的上下文,从而在其处理完后能恢复上下文,即先中断进程,之后再继续
- 通常通过执行一个状态保存来保存CPU的当前状态,之后再执行一个状态恢复重新开始运行
- 将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换
- 上下文切换与硬件支持密切相关
3.3 进程操作
3.3.1 进程创建
进程再执行过程中,能通过创建进程系统调用创建多个新进程。创建进程称为父进程,而新进程称为子进程。每个新进程可以再创建其它进程,从而形成了进程树
在一个进程创建子进程时,子进程可能从操作系统那里直接获得资源,也可能只从父进程那里获得资源。
新进程的地址空间也有两种可能:
(1)子进程是父进程的复制品(具有与父进程相同的程序和数据)
(2)子进程装入另一个新程序
通过fork()系统调用,可以创建新进程。新进程通过复制原来进程的地址空间而成(UNIX系统)
这里先执行execlp()函数,再执行printf(“Child Complete”)
3.3.2 进程终止
- 当进程完成执行最后的语句并使用系统调用exit()请求操作系统删除自身时,进程终止
- 父进程需要知道子进程的标识符。当一个进程创建新进程时,新创建进程的标识符要传递给父进程
3.4 进程间通信
- 操作系统内并发执行的进程可以是独立进程或协作进程
- 如果一个进程不能影响其他进程或被其它进程影响,则该进程是独立的
- 如果一个进程能影响其它进程或被其它进程影响,则该进程是协作的
提供进程协作的原因
- 信息共享需求:用户之间共享文件等
- 提高运算速度:将一个任务分成若干个子任务,然后并发执行
- 模块化
- 方便
进程协作需要一种进程间的通信机制(IPC)
这种通信机制允许进程相互交换数据和信息
进程通信有两种基本方式
(1)共享内存
在共享内存模式中,建立起一块供协作进程共享的内存区域,进程通过向此共享区域读或写入数据来交换信息。
(2)消息传递
在消息传递模式中,通过在协作进程间交换消息来实现通信。
3.4.1 共享内存系统
- 为了解释协作进程的概念,先研究生产者——消费者问题
- 生产者进程产生信息提供给消费者进程消费
共享内存中的数据类型
共享内存在这里是一个循环数组,类似一个圆圈,将一个数组的头和尾连接起来
in变量代表生产者要插入的数组的下标,out变量代表消费者要取出的数组的下标
该数组是循环数组,当数组内为空时,out变量(消费者)陷入等待(无限循环)。当数组填满时,in变量(生产者)陷入等待(无限循环),等待消费者取出里面的值
生产者消费者具体的程序