进程:a program in execution(执行中的程序)
进程包括通过程序计数器(program counter)的值和处理器寄存器(processor's registers)的内容来表示的当前活动(current activity),代码段(text section),堆栈段(stack),数据段(data section),以及堆(heap)。
stack:包括临时数据(函数参数、返回地址和局部变量)
data section:包括全局变量
heap:在进程运行期间动态分配的内存
注:程序本身不是进程,程序只是被动实体,而进程是活动实体(a process is an active entity)。
进程状态:
新的(New):进程正在被创建
运行(Running):指令正在被执行
等待(Waiting):进程等待莫个事件的发生(如I/O完成或收到信号)
就绪(Ready):进程等待分配处理器
终止(Terminated):进程完成执行
进程控制块(PCB):每个进程在OS内用PCB来表示
· 进程状态
· 程序计数器:计数器表示进程要执行的下个指令的地址。
· CPU寄存器
· CPU调度信息
· 内存管理信息
· 记账信息
· I/O状态信息
进程调度:选择一个可用的进程到CPU上执行,若有多个,需等待(单处理器系统)
进程进入系统,会被加入到作业队列(job queue),该队列包含系统中的所有进程。驻留在内存中就绪的,等待运行的进程保存在就绪队列(ready queue)中。(通过链表实现)
等待特定的I/O设备的进程列表称为设备队列(device queue)。每个设备都有自己的设备队列。
新进程处于就绪队列,当它被分配到CPU执行时,可能出现下面三种情况
1.进程可能发出一个I/O请求,并被放到I/O队列中
2.进程可能创建一个新的子进程,并等待其结束
3.进程可能会由于中断而强制释放CPU,并被放回到就绪队列
当进程从所有队列中删除时,其PCB和资源将得以释放。
那进程是如何被选中的?
进程的选择是由相应的调度程序(scheduler)来执行的
批处理系统:进程更多是被提交,而不是马上执行。这些进程被放到磁盘的缓冲池中。
长期调度程序(long-term scheduler)或者作业调度程序(job scheduler):从该缓冲池中选择进程,并装入内存以准备执行。
短期调度程序(short-term scheduler)或者CPU调度程序(CPU scheduler):从准备执行的进程中选中进程,并为之分配CPU
中期调度程序(medium-term scheduler):将进程从内存或CPU竞争中移出,从而降低多道程序设计的程度,之后,进程能被重新调入内存,并从中断处继续执行。
当出现中断时,OS会进行上下文切换
上下文切换:内核将旧进程的状态保存在其PCB中,然后装入经调度要执行的并已保存的新进程的上下文(进程上下文用进程的PCB表示)。
进程的一些操作 注意点
进程创建:在UNIX中通过fork()系统调用,可创建新进程,新进程通过复制原来进程的地址空间而成。两个进程都执行fork()之后的指令。
注:对于新进程,fork()的返回值是0,对于父进程,返回值为子进程的进程标识符
进程终止:进程可通过exit()请求OS删除自身,进程终止,并将状态值返回父进程,释放进程资源(父进程也能终止子进程)。
那当父进程终止了,子进程怎么办?
有些系统,会进行级联终止(cascading termination),操作系统会将其所有子进程也终止了。
而UNIX系统:当父进程终止,那么其所有子进程会以init进程作为父进程。
在OS中,并发执行的进程可以是独立进程或是协作进程。
协作进程就需要一种进程间通信进制(interprocess communication)(IPC)来允许进程相互交换数据与信息。
进程间通信有两种模式:
1.共享内存
这种模式的通信,需要通信进程建立共享内存区域。一块共享内存区域驻留在生成共享内存段进程的地址空间,其它希望使用这个共享内存段进行通信的进程必须将此放到它们自己的空间。
一旦建立了共享内存,所以的访问都被处理为常规的内存访问,不需要来自内核的帮助
这里需要一个缓存,当需要信息时,缓冲中要有这个信息。
两种缓存,一种是无限缓冲,无限往里面产生信息,另一种是有限缓冲,缓冲空,接收信息的进程要等待,缓冲满,发出信息的进程要等待。
2.消息传递
通过系统调用来实现
1.直接通信
send(P,message):发送消息到进程P
receive(Q,message):接收来自进程Q的消息
2.间接通信
send(A,message):发送一个消息到邮箱A(mailbox,一个对象,可以向其中存放消息,并删除,有唯一标识符)
receive(A,message):接收来自邮箱A的消息
OS提供了进制来允许进程创建邮箱,通过邮箱接收和发送消息以及删除邮箱。开始时,拥有者是唯一能通过该邮箱接收消息的进程,但通过系统调用,有拥有权和接收特权可能传递给其他进程,使邮箱有了多个接收者。
这时,当有多个进程都对邮箱执行receive(),哪个进程能接受到消息取决于所选择的方案
1.允许一个线路最多只能与两个进程相关联
2.一次最多允许一个进程执行receive()操作
3.运行系统随意选择一个进程以接收消息