进程是一个实体。每个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈区。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态内存分配的内存;堆栈区域存储着活动过程调用的指令和本地变量,堆栈的内容随着进程发出的嵌套过程调用而增长,随着调用过程的返回而减少。
进程的状态:
执行状态:进程正在处理器上执行,则处于执行状态。
就绪状态:如果可以获得一个处理器时,一个进程就能够在处理器上执行,则说明这一进程已经就绪,处于就绪状态。
阻塞状态:如果一个进程在继续进行之前正等待某一事件的发送,比如I/O完成事件,则说这一进程被阻塞,处于阻塞状态。(还有其他状态,主要是这三个)
上图是4种可能的状态转换。当一个进程被调度时,它的状态从就绪状态转变为执行状态。当进程的时间片到期时,进程从执行状态转换为就绪状态。当进程阻塞时,它从执行状态转换为阻塞状态。最后,当由于进程正在等待的某一事件完成而唤醒进程时,其状态从阻塞状态转换为就绪状态。需要注意的是,唯一由用户进程发起的状态转换是阻塞,也就是最后一种。其他3种转换都是由操作系统发起的。
进程控制块/进程描述符:
操作系统在创建一个进程时要完成若干操作,首先必须能够识别每一个进程,因此,它为进程分配一个进程标识号(process identification number,PID),其次,操作系统创建一个进程控制块(process control block,PCB),或称进程描述符,用来维护操作系统管理进程所需要的信息。一般包括:
PID
进程状态
程序计数器(用来确定进程下一步应该执行哪条指令)
调度优先级
凭证(确定此进程能够访问的资源的数据)
到此进程的父进程的指针(即创建该进程的进程)
如果存在,则还包括到此进程的子进程的指针
用来定位进程在内存中的数据和指令的指针
到所分配的资源的指针(例如:文件)
PCB也存储着当进程从执行状态转换到别的状态时进程持续在其执行的处理器的寄存器内容,即执行上下文(execution context)。
进程间通信
1、信号
信号是软件中断,它通知进程一个事件已经发生了。信号不允许进程指定与其他进程要交换的数据。当一个信号发生时,操作系统首先确定哪个进程应该接收这个信号,并确定此进程将如何响应这一信号。
进程可以捕获、忽略或屏蔽一个信号。进程捕获信号的方法是:指定操作系统递送此信号时所调用的例程。进程也可以忽略此信号,在这种情况下,进程根据操作系统的默认动作来处理信号。进程也可以屏蔽一个信号来阻塞此信号,当进程屏蔽一种特定类型的信号(比如挂起信号)时,操作系统并不递送这种类型的信号,直至进程清除此信号的屏蔽。
2、消息传递
基于消息的进程间通信:消息可以一次以一个方向传递,这样对于给定的消息,一个进程是发送者,另一个进程是接收者;消息传递也可以是双向的,即每一个进程在参加进程间通信时,既可以充当发送者又可以充当接收者。
阻塞发送必须等待接收者接收到消息,要求接收者收到消息时向发送者发出通知,这种通知也成为确认(acknowledgment)。非阻塞发送使发送者在发送完消息后能够继续其他操作,即使接收者还没有收到(并确认)这一消息。
阻塞发送是同步通信的一个范例;非阻塞发送是异步通信的一个范例。
一个普遍流行的消息传递实现方法是管道(pipe)。它是操作系统保护起来的一个内存区域,可以作为缓冲区,允许两个或者多个进程交换数据。
linux进程间通信方法
1、信号
2、管道
3、套接字
4、消息队列
5、共享内存
6、系统V信号量
windows进程间通信方法
1、管道
2、mailslot控件
3、共享内存
4、本地和远程过程调用
5、组件对象模型(COM)
6、拖放式和复合文档