进程与线程
进程的基础
程序的顺序执行
处理器严格按照程序所规定的顺序运行,只有当前指令结束后,下一条指令才能开始执行。
系统所有资源为这个程序独占,直至执行结束。顺序执行的程序具有顺序性 , 封闭性 ,可再现性的特点。
程序的并发执行
在多道程序设计系统中,多个程序并发执行,它们共享资源,但是由于资源的有限性,多道程序的并发执行过程必然伴随着资源的共享和竞争,从而导致并发执行的每个程序都有可能受到其他程序的约束。
总结
- 程序并发执行时,由于失去了封闭性,程序执行的结果与程序的速度有关,而程序向前推进的速度是随机并且不可控的,其结果不再具有可再现性
- 为了使并发执行的程序具有可再现性,必须使并发执行的才跟你关系能够被管理、制约,并控制其执行速度。
- 操作系统需要一个能够描述程序的执行过程以及共享资源的基本单位,而这个基本单位就是:进程
进程的定义
- 程序的一次执行
- 正在运行的程序的一个实例
- 可以分配给处理器,并且由处理器执行的一个实例
- 是可以和别的计算并发执行的计算
- 是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位
- 进程是系统分配资源和调度的基本单位
- 操作系统通过进程控制块PCB感知进程的存在
进程是由一段可执行的程序,数据(程序数据、用户栈以及可修改的程序)、系统栈(用于保存参数、过程调用地址以及系统调用地址)、以及进程控制块PCB组成的集合
进程的状态及其转换
进程的执行模式
处理器的执行模式分为系统态和用户态
- 系统态:又叫控制态,或者内核态,具有对处理器以及所有指令、寄存器和内存的控制能力。
- 用户态:只能执行规定的指令,访问指定的寄存机和存储区
系统进程运行在系统态下。用户进程运行在用户态,不能执行操作系统的指令和访问系统区域。因此,可以保护操作系统不受用户程序的破坏。
程序状态字中有一位表示处理器的执行模式,通过这一位的改变进行执行模式的设置。
进程控制
进程切换
所谓进程切换是指,一个正在运行的进程被中断,操作系统指定另一个进程为运行态,并将控制权交给这个进程。
引起进程切换的事件:
- 中断:时钟中断(基于时间片的调度)和I/O中断
- 陷阱:与当前运行进程所产生的错误或者异常有关
- 系统调用:切换至操作系统进程,请求系统调用的进程转为阻塞态。
进程切换时的动作:
- 保存处理器上下文环境
- 更新当前运行进程的PCB
- 将进程控制块移入相应队列(阻塞队列或者就绪队列)
- 选择另一进程运行(进程调度)
- 更新所选择进程的PCB,比如状态有就绪变为运行
- 恢复被选择进程的处理器上下文
进程的创建:进程借助创建原语实现创建一个新进程
进程的阻塞与唤醒
引起进程阻塞与唤醒的事件有以下几种
- 请求系统服务
- 启动某种操作
- 等待新的数据
- 等待新的工作
当一个进程被阻塞时,执行一下步骤 - 停止运行,修改PCB中状态为“阻塞”
- 将进程插入到阻塞队列。如果系统设置了多个不同原因的阻塞队列,则将进程插入到具有相同原因的阻塞队列中
- 系统进行调度并完成进程切换。保留被阻塞进程的处理器状态与PCB,转操作系统调度程序,选择一个就绪进程将处理器都分配给它,并且按照新进程PCB中的处理器状态设置CPU环境,完成进程切换。
进程被唤醒时,需要完成以下工作: - 把被阻塞的进程从等待该事件的阻塞对列中移除,唤醒原语将进程从外存调入内存
- 将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中去。
- 假如采用的是抢占调度策略,则每当有新进程进入就绪队列时检查是否需要进行重新调度,即比较被唤醒进程与当前进程的优先级,决定处理机的归属。
线程
线程又被称为轻型进程,在引入了线程的系统中,线程是一个可以独立执行和调度的基本单位,但不再是拥有资源的独立单位。他只拥有少量运行中必不可少的资源(比如程序计数器,一组寄存器和栈)。它可与同属一个进程的线程共享该进程拥有的所有资源。
传统的进程等效于只有一个线程的进程
根据实现方式的不同,可以把线程分为两类:
- 内核级线程
线程管理的所有工作都是由内核完成的。用户通过操作系统给应用程序提供的应用陈旭编程接口API来进行进程管理 - 用户级线程
线程管理的所有 工作都是由应用程序完成的,内核意识不到线程的存在,内核以进程为单位进行调度。操作系统给用户体统一个线程库对线程进行操作
与进程或线程相关的其它技术
写时拷贝
父进程创建子进程时,最初父子进程共享内存空间等到子进程修改数据时,再分配内存空间,这是对程序性能的优化,可以延迟甚至是避免内存拷贝,当然目的就是避免不必要的内存拷贝
线程池
线程池的出现正是着眼于减少管理线程的开销而产生的技术。
- 线程池采用预创建的技术,在应用程序启动之后,将立即创建一定数量的线程(N个),放入空闲队列中。
- 当任务到来后,缓冲池选择一个空闲线程,把任务分配给此线程运行。在任务执行完毕后线程也不退出,而是继续保持等待下一次的任务。
进程间的远程通信
套接字(Socket)
Socket就想一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被多个进程占用,而我们建立连接就像是把插头插在这个插座上,创建一个Socket实例开始监听后,这个电话插座就时刻监听着消息的传入,谁拨通我这个“IP地址和端口”,我就接通谁
Socket可以定义为通信的端点,一对通过网络通信的进程需要使用一对套接字,其中一个运行于客户端,称为Socket 另一个运行于服务器端成为ServerSocket服务器通过监听指定端口来等待进来的客户机请求。
远程过程调用
远程调用简称RPC,是一种最为常见的远程服务。RPC对于通过网络连接系统之间的过程调用进行了抽象。它在许多方面都类似IPC机制,并且通常建立在IPC之上
远程方法调用(Remote Method Invocation,RMI)是Java在JDK1.1中实现的,它大大增强了JAVA开发式分布式应用的能力
RMI能够让在客户端JAVA虚拟机上的对象像调用本地对象一样调用服务端java虚拟机中对象上的方法