操作系统概念复习第三章

进程

进程概念

进程是执行中的程序。包括程序代码(文本段或代码段),当前活动(通过程序计数器的值和处理器寄存器的内容来表示),进程堆栈段(包括临时数据,如函数参数,返回地址和局部变量)和数据段(包括全局变量),还可能包括堆(进程运行期间动态分配的内存)。
在这里插入图片描述
区分:

  • 程序:被动实体
  • 进程:活动实体,有一个程序计数器表示下一个要执行的命令和相关资源集合
  • 当一个可执行文件装入内存时,程序才能成为进程。
  • 同一个程序可以和多个进程相关。这些进程是独立的,虽然文本段相同,但数据段,堆,堆栈段不同。

进程状态

进程状态某种程度上是由当前活动所定义,每个进程可能处于以下状态之一:

  • 新的:进程正在被创建
  • 运行:指令正在被执行
  • 等待:进程等待某个事件的发生(如I/O完成或收到信号)
  • 就绪:进程等待分配处理器
  • 终止:进程完成执行

在这里插入图片描述

进程控制块PCB(任务控制块)

PCB包含许多与一个特定进程相关的信息:

  • 进程状态
  • 程序计数器:计数器表示进程要执行的下个指令的地址
  • CPU寄存器:寄存器的数量和类型与计算机体系结构相关。包括累加器、索引寄存器、堆栈指针、通用寄存器和其他条件码信息寄存器。程序计数器和这些状态信息在出现中断时需要保存。
  • CPU调度信息:包括进程优先级、调度队列的指针和其他调度参数
  • 内存管理信息:根据OS使用的内存系统,包括基址和界限寄存器的值、页表和段表
  • 记账信息:CPU时间、实际使用时间、时间界限、记账数据、作业或进程数量
  • I/O状态信息:分配给进程的I/O设备列表、打开的文件列表等

在这里插入图片描述

进程调度

多道程序设计的目的是无论何时都有进程在运行,从而使CPU利用率达到最大化。
分时系统目的是在进程之间快速切换CPU以便用户在程序运行时能与其进行交互。
进程调度选择一个可用的进程到CPU上执行。其他进程需要等待CPU空闲并重新调度。

调度队列

作业队列:包括系统中的所有进程。
就绪队列:驻留在内存中就绪的,等待运行的进程。通常用链表实现,头节点指向链表的第一个和最后一个PCB块的指针。每个PCB包括一个指向就绪队列的下一个PCB的指针域。
如果进程向一个共享设备(如磁盘)发送I/O请求,由于系统有多个进程,磁盘可能会忙于其他进程I/O请求而导致该进程需要等待磁盘。
设备队列:等待特定I/O设备的进程列表。每个设备都有自己的设备队列。
在这里插入图片描述
队列图:长方形——队列,圆形——为队列服务的资源,箭头——系统内进程流向
新进程开始处于就绪队列,它在就绪队列中等待直到被选中执行或被派遣。当进程分配到CPU并执行时,可能发生以下事件之一:

  • 进程可能发出一个I/O请求,并放到I/O队列中
  • 进程可能创建一个新的子进程,并等待其结束
  • 进程可能会由于中断而强制释放CPU,并放回到就绪队列中

前两种情况,进程最终从等待状态切换到就绪态,并放回到就绪队列中,然后继续这一循环直到终止,然后他会从所有队列中删除,其PCB和资源被释放。
在这里插入图片描述

调度程序

进程在生命周期中会在各种调度队列中迁移,OS必须按照调度程序从这些队列中选择进程。

  • 长期调度程序(作业调度程序)从大容量存储设备的缓冲池中选择进程并装入内存准备执行。
  • 短期调度程序 CPU调度程序从准备执行的进程中选择进程并为之分配CPU。
  • 差别:执行频率。短期每100ms至少执行一次。长期控制多道程序设计的程度(内存中进程的数量)。如果多道程序的程度稳定,创建进程的平均速度必须等于进程离开系统的平均速度。
  • 中期调度 程序能将进程从内存(或从CPU竞争)中移出,从而降低多道程序设计的难度。之后进程能被重新调入内存,并从中断处继续执行。这种方案成为交换。通过中期调度程序,进程可换出,并后来被换入。
    在这里插入图片描述

进程:

  • 以I/O为主,执行I/O方面比执行计算要花费更多时间
  • 以CPU为主,很少产生I/O请求,更多的执行计算
  • 所有是I/O为主,就绪队列几乎为空,短期调度程序无事可做。所有是CPU为主,I/O等待队列几乎为空。

上下文切换

当发生一个中断时,系统需要保存当前运行在CPU中进程的上下文,从而在其处理完后能恢复上下文,即先中断进程再继续。
进程上下文用进程PCB表示。通常通过执行一个状态保存来保存CPU当前状态,之后执行一个状态恢复重新开始运行。
上下文切换:将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态。当发生上下文切换时内核会将旧进程的状态保存在其PCB中,然后装入经调度要执行的并已保存的新进程的上下文。
上下文切换时间是额外开销,切换时系统不能做什么有用的工作。它依赖于内存速度、必须复制的寄存器数量、是否有特殊指令。与硬件支持密切相关。

进程操作

进程能并发执行,可以动态创建和删除,所以OS必须提供进程创建和删除的机制。

进程创建

进程(父进程)在其执行过程中能通过创建进程系统调用创建多个新进程(子进程)。除了物理和逻辑资源外,初始化数据(或输入)由父进程传递给子进程。
OS根据一个唯一的进程标识符(pid)来识别进程,pid通常是一个整数值。
UNIX系统中,ps命令可以得到一个进程列表。ps el列出系统所有当前活动进程的完整信息。
子进程可以从OS直接获得资源,也可以只从父进程获得资源。父进程可能必须在其子进程之间分配或共享资源。限制子进程只能使用父进程资源能防止创建过多的进程带来的系统超载。
当进程创建新进程时,有两种执行可能:

  • 父进程和子进程并发执行
  • 父进程等待,直到某个或全部子进程执行完

新进程的地址空间也有两种可能:

  • 子进程是父进程的复制品(具有与父进程相同的程序和数据)
  • 子进程装入另一个新程序

在UNIX中:

  • 通过fork()系统调用创建新进程。新进程通过复制原来进程的地址空间而成。这种机制允许父进程和子进程方便的进行通信。两个进程都继续执行位于fork()之后的指令,子进程fork()返回值为0,父进程返回值为子进程的pid(非0)。
  • fork()之后,一个进程使用系统调用exec()用新程序取代进程的内存空间。exec()将二进制文件装入内存(消除了原来包含exec()的程序的内存映射)并开始执行。这样,两个进程可以相互通信,并能按各自的方法执行。
  • 父进程如果在子进程运行时无事可做,它采用系统调用wait()把自己移出就绪队列来等待子进程的终止。当子进程完成时(通过显示或隐式调用exit()),父进程会从wait()调用处开始继续,wait()返回了终止子进程的pid使父进程知道哪个子进程终止了。
  • 调用exit()以表示结束。

在Win32 API:

  • CreateProcess()函数创建进程,需要将一个特殊程序装入子进程的地址空间。至少要传递10个参数。 调用CreateProcess()前调用ZeroMemory()函数清空每个结构的内存。
    • STARTUPINFO结构:指明新进程的许多特性,如窗口大小、标准输入及输出文件的句柄
    • PROCESS_INFORMATION结构:包含一个句柄以及新的生成进程和线程的标识

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程终止

exit()请求OS删除自身时,进程终止。这时,进程可以返回状态值到父进程。所有的进程资源会被OS释放。
只有父进程才能执行终止子进程的系统调用。当创建子进程时,子进程的pid要传递给父进程。
父进程终止子进程的原因:

  • 子进程使用了超过他所分配到的一些资源
  • 分配给子进程的任务不再需要
  • 父进程退出。父进程终止,OS不允许子进程继续。

级联终止:如果一个进程终止,那么它的所有子进程也将终止。通常由OS进行。
在UNIX中,如果父进程终止,那么其所有子进程会以init进程作为父进程。这样,子进程仍然有一个父进程来收集状态和执行统计。

进程间通信

如果一个进程不能影响其他进程或被其他进程所影响,那么它是独立的。否则它是协作的。
需要提供环境允许进程协作的理由:

  • 信息共享
  • 提高运算速度:如果希望一个特定任务快速运行,必须将他分成子任务。每个子任务可以与其他子任务并行执行。这需要计算机有多个处理单元。
  • 模块化
  • 方便

协作进程需要一种进程间通信机制(IPC)来允许进程相互交换数据与信息。IPC两种基本模式:

  • 共享内存:建立起一块供协作进程共享的内存区域,进程通过向此区域读或写入数据来交换信息。速度快,方便通信。仅在建立共享内存区域需要系统调用,一旦建立起共享内存,所有的访问都被处理为常规的内存访问,不需要内核帮助。
  • 消息传递:通过在协作进程间交换消息来通信。适合交换较少数量的数据,这样可以不用避免冲突。易于实现。通常用系统调用实现,所以需要更多的内核介入的时间消耗。
    在这里插入图片描述

共享内存系统

通常,一块共享内存区域驻留在生成共享内存段进程的地址空间。其他希望使用内存段进行通信的进程必须将此放到自己的地址空间上。共享内存需要取消OS阻止进程访问另一个进程的限制。数据的形式或位置取决于进程而不是OS。进程还负责保证它们不向同一区域同时写数据。

生产者-消费者问题
生产者进程产生信息以供消费者进程消费。通常将客户机当作生产者,服务器当作消费者。
为了允许生产者进程和消费者进程能并发执行,必须有一个缓冲来被生产者填充并被消费者使用。该缓冲驻留在生产者进程和消费者进程的共享内存区域中。生产者和消费者必须同步,以免消费者消费一个没有生产的项。
缓冲:

  • 无限缓冲:对大小没有限制。消费者可能不得不等待新的项,,但生产者可以总时产生新项。
  • 有限缓冲:大小固定。如果缓冲为空,消费者必须等待。如果缓冲为满,生产者必须等待。

在这里插入图片描述
在这里插入图片描述
这种方法最多允许的缓冲最大项数为BUFFER_SIZE-1,这是因为in指向下一个空位

消息传递系统

消息传递提供一种机制以允许进程不必通过共享地址空间来实现通信和同步,这在分布式环境中很有用。
消息传递工具提供的操作:

  • 发送:由进程发送的消息可以是定长(实现简单编程困难)或变长的。
  • 接收

如果进程P和Q需要通信,那么他们必须彼此相互发送和接收消息,他们之间必须要有通信链路
逻辑实现线路和send()/receive()操作的方法:

  • 直接或间接通信
  • 同步或异步通信
  • 自动或显示缓冲
命名

需要通信的进程必须有一个方法以相互引用:

  • 直接通信1v1:需要通信的进程必须明确地命名通信的接收者或发送者。
    • 对称寻址,原语send()/receive()定义如下
      send(P,message):发送消息到P
      receive(Q,message):接受来自Q的消息
    • 通信线路属性:
      在需要通信的每对进程之间自动建立线路。进程仅需知道相互通信的标识符
      一个线路只与两个进程相关
      每对进程之间只有一个线路
    • 非对称寻址,只要发送者命名接收者,接收者不需要命名发送者
      send(P,message):发送消息到P
      receive(id,message):接受来自任何进程的消息,id设置为与其通信的进程名称
    • 对称寻址和非对称寻址限制了进程定义的模块化。
  • 间接通信1vn,nv1,nvn:通过邮箱或端口来发收消息。进程可以在邮箱中存放或删除消息。每个邮箱都有一个唯一的标识符。一个进程可能通过许多不同的邮箱和其他进程通信,但两个进程仅在其共享至少一个邮箱时可以相互通信。
    • 原语send()/receive()定义如下
      send(A,message):发送消息到邮箱A
      receive(A,message):接受来自邮箱A的消息
    • 通信线路属性:
      只有在两个进程共享一个邮箱时才能建立通信线路
      一个线路可以与两个或更多进程相关联
      两个通信线路之间可以有多个不同的线路,每个线路对应于一个邮箱

在这里插入图片描述

进程和操作系统可以拥有邮箱:

  • 为进程所有(邮箱是进程地址空间的一部分),那么拥有者只能通过邮箱接收消息,使用者只能向邮箱发送消息。
  • 为OS所有,邮箱是独立存在的,OS必须提供机制允许进程可以创建新邮箱、通过邮箱发收消息、删除邮箱。创建新邮箱的进程默认为邮箱拥有者通过系统调用,拥有权和接收特权可以传递给其他进程,这会导致每个邮箱有多个接收者。
同步

消息传递可以是阻塞或非阻塞——也成为同步或异步:

  • 阻塞send:发送进程阻塞,直到消息被接收进程或邮箱所接收
  • 非阻塞send:发送进程发送消息并再继续操作
  • 阻塞receive:接收者阻塞,直到有消息可用
  • 非阻塞receive:接收者收到一个有效消息或空消息

send()receive()都阻塞时,则在发送者和接收者之间有一个集合点。当使用阻塞send()receive()时,生产者-消费者问题不再重要,生产者仅需调用阻塞send()调用并等待,直到消息被送到接收者或邮箱。同样消费者调用receive()时,发生阻塞直到有一个消息可用。

缓冲

通信进程所交换的消息都驻留在临时队列中,队列实现方法:

  • 零容量(没有缓冲的消息系统):队列最大长度为0。线路中不能有任何消息处于等待。必须阻塞发送直到有接收者接收消息。
  • 有限容量(自动缓冲):容量为有限的n。最多只能有n个消息驻留。如果发送新消息时队列未满,则可以放在队列(或复制消息或保存消息的指针),发送者可以继续执行不用等待。如果线路满,必须阻塞发送者直到队列中的空间可用。
  • 无限容量(自动缓冲):不管有多少消息在队列中等待,从不阻塞发送者。

IPC系统实例(详细看书)

POSIX系统适用共享内存和消息传递。
Mach绝大多数通信通过消息实现。消息通过邮箱来发收。每个任务创建时,也创建两个特别邮箱——内核邮箱(内核与任务通信)和通报邮箱(发送事件发生的通知)。
远程过程调用(RPC):发送消息并只等待来自发送者的一个返回消息。msg_rpc()
WIndows XP的消息传递工具称为本地过程调用LPC工具。LPC在位于同一机器的两进程之间通信。使用了端口对象以建立和维护两进程之间的连接。
在这里插入图片描述

客户机-服务器系统通信

Socket

Socket套接字可定义为通信的端点。一对通过网络通信的进程需要使用一对Socket(每个进程各有一个)。

  • Socket由IP地址与一个端口号连接组成。
  • 采用客户机-服务器结构。
    • 服务器通过监听指定端口来等待进来的客户请求。接收到请求,服务器就接受客户Socket的连接。服务器实现的特定服务是通过监听众所周知的端口(telnet23,ftp21,Web/http80)进行的。所有<1024的服务器端口可以用来实现标准服务
    • 客户机进程发出连接请求时被主机赋予一个大于1024的端口。

Socket属于较为低级的分布式进程通信,只允许在通信线程之间交换无结构的字节流

远程过程调用(RPC)

RPC设计成抽象过程调用机制,用于通过网络连接系统。通常建立在IPC系统之上,用于RPC交换的消息有很好的结构,每个消息(包含执行函数的名词和传递给函数的参数)传递给位于远程系统上监听端口号的RPC服务器。
RPC语义允许客户机调用位于远程主机上的过程。通过在客户端提供存根stub
matchmaker:集合点服务程序
在这里插入图片描述
大端:高地址存高字节
小端:高地址存低字节

远程方法调用RMI

RMI是类似于RPC的java特性,允许线程调用远程对象(位于不同的JVM)的方法。
不同:

  • RPC支持子程序编程,只能调用远程的子程序或函数;RMI是基于对象的,支持调用远程对象的方法
  • RPC远程过程的参数是普通数据结构,RMI可以将对象作为参数传递给远程方法

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值