3.1 进程概念
1)进程组成:程序代码(文本段|代码段);当前活动(程序计数器的值和处理器寄存器的内容);堆栈段(临时数据、函数参数、返回地址、局部变量);数据段(全局变量);堆(进程运行期间动态分配的内存);
【操作系统】第三章 进程
2)进程状态:
a)新的(进程正在被创建);
b)运行(一次只有一个进程可以在一个处理器上运行);
c)等待(进程等待某个事件的发生(如I/O完成或收到信号);
d)就绪(进程等待分配处理器);
e)终止(进程完成执行);
【操作系统】第三章 进程
3)进程控制块(PCB|任务控制块):存储下述信息的仓库:
a)进程状态(上述五个状态);
b)程序计数器(进程要执行的下一个指令地址);
c)CPU寄存器(中断时CPU信息,用于恢复);
d)CPU调度信息(进程优先级、调度队列的指针和其他调度参数);
e)内存管理信息;
f)记账信息;
g)I/O状态信息(分配给进程的I/O设备列表、打开的文件列表等);

3.2 进程调度
1)调度队列
a)作业队列:系统中的所有进程;
b)就绪队列:驻留在内存中的就绪的、等待运行的进程;
c)设备队列(I/O请求队列):等待特定I/O设备的进程列表;
2)调度程序
a)长期调度程序(作业调度程序):从缓冲池中选择进程并装入内存以准备执行;(不频繁执行)
b)短期调度程序(CPU调度程序):从准备执行的进程中选择进程并为之分配CPU;(频繁执行)
c)中期调度程序:能将进程从内存(或从CPU竞争)中移出,从而降低多道程序设计的程度,之后进程能被重新调入内存,并从中断处继续执行,称为交换(用于改善进程组合(比如所有进程以CPU为主或者I/O为主的,需要重新调度一下)或者因内存要求的改变引起了可用内存的过度使用而需要释放内存);
3)上下文切换:将CPU切换到另一个进程需要保存当前进程的状态并回复另一个进程的状态;

3.3 进程操作
1)进程创建:
a)进程创建新进程时,有两种可能:父进程与子进程并发执行;父进程等待,直到某个或全部子进程执行完;
b)新进程的地址空间,有两种可能:子进程是父进程的复制品(具有与父进程相同的程序和数据);子进程装入另一个新程序;
2)进程终止(只有被终止进程的父进程才能执行这一系统调用):
需要终止的原因:
a) 子进程使用了超过它所分配到的一些资源;
b) 分配给子进程的任务已经不再需要;
c) 父进程退出(有些系统父进程终止其所有子进程都会终止,但有些系统如UNIX,如果父进程终止会将其所有子进程以init进程作为父进程,因此子进程仍然有一个父进程来手机状态和执行统计)。

3.4 进程间通信
进程分为独立进程(不能影响其他进程或被其他进程所影响)和协作进程(能影响其他进程或被其他进程所影响)两种。
1) 进程需要协作的原因:信息共享;提高运算速度(任务分为多个子任务可以执行得快);模块化;方便(用户级可以并行编辑、打印、编译等操作)。
2) 进程间通信:共享内存;消息传递(具体优缺点对比见第二章总结)。
3) 共享内存系统:需要一个缓冲(无限缓冲|有限缓冲)来被生产者填充并被消费者所使用。
4) 消息传递系统:需要缓冲(零容量缓冲,发送必须阻塞直到接收者接受信息;有限容量缓冲,如果消息队列未满,不阻塞,如果线路满,必须阻塞发送者知道队列中的空间可用为止;无限容量,从不阻塞发送者);

3.5 IPC系统的实例
1)POSLX共享内存
【操作系统】第三章 进程
2)Mach:
a)每个任务创建时也创建了两个特别邮箱:内核邮箱(与任务通信)和通报邮箱(发送事件发生的通知);
b)消息传输只需三个系统调用:msg_send()向邮箱发送消息,msg_receive()接收消息,msg_rpc()执行远程过程调用(RPC)。
3)Windows XP:通过端口(连接端口和通信端口)实现通信;
通信原理(如下图):
a) 客户机打开系统的连接端口对象的句柄;
b) 客户机发送连接请求;
c) 服务器创建两个私有通信端口,并返回其中之一的句柄给客户机;
d) 客户机和服务器使用相应端口句柄以发送消息或毁掉,并等待回答;
当小消息时(<=256B)采用这种方式,若大消息可通过区段对象(构建共享内存)。
【操作系统】第三章 进程
3.6 客户机-服务器系统通信
1)Socket:由IP地址与一个端口号(所有低于1025的服务器端口都被认为是众所周知的,可以用它们来实现标准服务)连接(所有连接必须是唯一的)组成;
2)Java三种类型的Socket:面向连接(TCP)Socket、无连接(UDP)Socket、多点传送Socket(允许数据发送给多个接收者);采用第一种类型实现如下图:
【操作系统】第三章 进程【操作系统】第三章 进程
3)Socket通信:
a)优点:常用、高效;
b)缺点:属于较为低级的分布式进程通信,之能交换无结构的字节流。
4)远程过程调用(RPC):通常对于每个独立的远程过程都有一个存根,当哭户籍调用远程过程时,RPC系统调用合适的存根,并传递远程过程的参数(该存根位于服务器的端口),并编组参数,接着存根使用消息传递向服务器发送一个消息,服务器的一个类似存根接收到这一消息,并调用服务器上的过程,如果有必要,返回值可通过同样技术传回客户机。(注:客户机和服务器的数据表示差别,如大端法还是小端法,可以通过一个成为外部数据表示(XDR)的中间表示解决)
5)远程方法调用(RMI):采用存根和骨干实现远程对象。存根为远程对象的代理,它驻留在客户机中,当客户机调用远程方法时,远程对象的存根被调用,这种客户端存根负责创建一个包,它具有服务器上要调用方法的名称和用于该方法的编排参数,存根将该包发送给服务器,远程对象骨干会接收它,骨干负责重新编排参数并调用服务器上所有执行的方法。骨干接着编排返回值(或异常),然后打包,并将该包返回给客户机。存根重新编排返回值,并传递给客户机。
(注:编排参数如果为本地对象,则采用对象串行化技术来复制传递,若是远程对象,则通过引用传递;如果将本地对象作为参数传递给远程对象,需要实现接口java.io.Serializable)
【操作系统】第三章 进程
6)RPC和RMI的区别:
a)RPC只能调用远程的子程序或函数,而RMI支持调用远程对象的方法;
b)RPC远程过程的参数是普通数据结构,RMI远程方法的参数可以是对象。

相关文章: