进程概念:

1.程序在执行中

2.一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程,是系统进行资源分配和调度的独立单位。

进程与程序的差别

·进程----动态,        程序----静态

·进程----有生命周期,短暂的, 程序----相对长久的

·进程----具有并发性,     程序----没有

·进程是竞争计算机系统资源的基本单位,其并发性受到系统本身的制约

·不同进程可以包含同一程序,只要程序所对应的数据集不同

一个进程包括:

·Text section 文本段(代码段)-------程序代码

·program counter 程序计数器----------其值与处理器寄存器的内容共同表示当前活动

·Stack 栈------------------包括临时数据,如函数参数、返回地址和局部变量

·Heap 堆-------------------在进程运行期间动态分配的内存

·data section 数据段-------包括全局变量

下面是进程在内存中的状态:

 进程的特征:

进程控制块(PCB),也称任务控制块:

作用:PCB用来保存程序运行期间的重要信息

·进程存在的唯一标识

·记录了OS所需的用于描述进程及控制进程所需的全部信息

·进程状态(process state):状态可包括新的(new)、就绪(ready)、运行(running)、等待(waiting)、终止(teminated)。

·程序计数器(program counter):表示进程要执行的下个指令的地址。

·CPU寄存器(CPU registers):根据计算机体系结构不同,寄存器的数量和类型也不同。

·CPU调度信息(CPU scheduling information):包括进程优先级、调度队列的指针和其他调度参数。

·内存管理信息(Memory-management information):根据操作系统所使用的内存系统,这类信息包括基址和界限寄存器的值、页表或段表。

·记账信息(Accounting information):包括CPU时间、实际使用时间、时间界限、记账数据、作业或进程数量等。

·I/O状态信息(I/O status information):这类信息包括分配给进程的I/O设备列表、打开的文件列表等。

 CPU在进程间切换时用到了PCB:

当CPU切换到另一个进程时,系统需要保存老进程的状态,并且加载新进程的状态。

*进程状态图:

进程状态切换:

·就绪-->运行

 -调度程序选择一个新的进程运行

·运行-->就绪

 -运行进程用完了时间片

 -运行进程被中断,因为一高优先级进程处于就绪状态

·运行-->等待

 -OS尚未完成服务

 -对一资源的访问尚不能进行

 -初始化I/O且必须等待结果

 -等待某一进程提供输入(IPC)

·等待-->就绪

 -当所等待的事件发生时

并行和并发:

·并发是指两个或多个事件在同一时间间隔发生。并行是指在两个或多个事件在同一时刻发生。

·并发的关键是你有处理多个任务的能力,不一定要同时。
·并行的关键是你有同时处理多个任务的能力。

下面是知乎上的一个举例:

-你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
-你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
-你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

进程调度

1.调度队列

·进程进入系统时,会被加入到作业队列(Job queue)中。作业队列包括系统中所有进程。

·驻留在内存中就绪的、等待运行的进程保存在就绪队列(Ready queue)中。该队列常用链表来实现,其头结点包括指向链表的第一个和最后一个PCB块的指针。每个PCB包括一个指向就绪队列的下一个PCB的指针域。

·等待特定I/O设备的进程列表称为设备队列(Device queue)。每个设备都有自己的设备队列。

下面是就绪队列和各种设备队列:

2.调度程序

进程在其生命周期中会在各种调度队列之间迁移。为了调度,操作系统必须按某种方式从这些队列中选择进程。进程选择是由相应的调度程序(scheduler)来执行的。

·长期调度程序(作业调度程序):选择一个进程进入内存的就绪队列。---------------执行不频繁

·短期调度程序(CPU调度程序):从就绪队列中选择一个一个进程,并为之分配CPU。---执行频繁

·中期调度程序:将进程从内存(或从CPU竞争)中移出,从而降低多道程序设计的程度。之后,进程能被重新调入内存,并从中断处继续执行。这种方案称为交换

下面是增加了中期调度的队列图:

*进程间通信:

很多时候我们需要提供环境以允许进程协作,这有许多理由,包括:信息共享、提高运算速度、模块化、方便等等。

而协作进程需要一种进程间通信机制(interprocess communication,IPC)来允许进程相互交换数据与信息。

进程间通信有两种基本模式:

·共享内存:建立起一块供协作进程共享的内存区域,进程通过向此共享区域读或写入数据来交换信息。

·消息传递:通过在协作进程间交换信息来实现通信。

下图为(a)、消息传递模式 (b)、共享内存模式

共享内存系统:

为说明协作进程这一概念,可研究一下生产者-消费者问题,这是协作进程的通用范例。生产者进程产生信息以供消费者进程消费。采用共享内存是解决生产者-消费者问题方法中的一种。为了允许生产者进程和消费者进程能够并发执行,必须要有一个缓冲区来被生产者填充并被消费者所使用。生产者和消费者必须同步,以免消费者消费一个没有生产出来的项。

可以使用两种缓冲:

无限缓冲对缓冲大小没有限制。消费者可能不得不等待新的项,但生产者总是产生新项。

有限缓冲假设缓冲大小固定。对于这种情况,如果缓冲为空,那么消费者必须等待;如果缓冲为满,那么生产者必须等待。

为更进一步了解进程共享内存如何使用有限缓冲。下面驻留在内存中的变量由生产者和消费者共享:

 #define BUFFER_SIZE 10

 typedef struct {
...
}item; item buffer[BUFFER_SIZE];
int in = ;
int out = ;

共享缓冲是通过循环数组和两个逻辑指针来实现的:in和out。in指向缓冲中的下一个空位;out指向缓冲的第一个满位。

当in == out时,缓冲为空;当(in + 1) % BUFFER_SIZE == out时,缓冲为满。

下面是生产者进程代码,其中有一个局部变量nextProduced以存储所产生的新项:

 item nextProduced;

 while(true) {
//produce an item in nextProduced
while(((in + ) % BUFFER_SIZE) == out)
;//do nothing
buffer[in] = nextProduced;
in = (in + ) % BUFFER_SIZE;
}

下面是消费者进程代码,其中有一个局部变量nextConsumed以存储所要使用的新项:

 item nextConsumed;

 while(true) {
while(in == out)
;//do nothing
nextConsumed = buffer[out];
out = (out + ) % BUFFER_SIZE'
//consume the item in nextConsumed
}

这个例子没有解决生产者和消费者同时访问共享内存的问题,将在另外一篇文章上讨论在共享内存环境下协作进程如何有效实现同步。

消息传递系统:

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

消息传递工具至少提供两种操作:发送(消息)和接受(消息)

下面是一些send()/receive()操作方法:

·直接或间接通信

·同步或异步通信

·自动或显式缓冲

1.命名

需要通信的进程必须有一个方法以相互引用。它们可使用直接通信或间接通信。

直接通信:需要通信的每个进程必须明确地命名通信的接受者或发送者。其原语send()和receive()定义如下:

·send(P,message):发送消息到进程P。

·receive(Q,message):接收来自进程Q的消息。

该方案的通信线路属性:

·在需要通信的每对进程之间自动建立线路。进程仅需知道相互通信的标识符。

·一个线路只与两个进程相关。

·每对进程之间只有一条线路。

上述的是直接通信中的对称寻址,即发送和接收进程必须命名对方以便通信;这个方案也可以变形为非对称寻址,即只要发送者命名接收者,而接收者不需要命名发送者,

对称和非对称寻址方案的缺点是限制了进程定义的模块化。改变进程名称可能必须坚持所有其他进程定义。

间接通信:通过邮箱或端口来发送和接收消息。邮箱可以抽象成一个对象,进程可以向其中存放信息,也可以从中删除信息。其原语send()和receive()定义如下:

·send(A,message):发送消息到邮箱A。

·receive(A,message):接收来自邮箱A的消息。

该方案的通信线路属性:

·只有在两个进程共享一个邮箱时,才能建立通信线路。

·一个线路可以与两个或更多地进程相关联。

·两个通信进程之间可有多个不同的线路,每个线路对应于一个邮箱。

2.同步

进程间的通信可以通过调用原语send()和receive()来进行。这些原语的实现有不同的设计选项。

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

·阻塞send:发送进程阻塞,直到消息被接收进程或邮箱所接收。

·非阻塞send:发送进程发送消息并再继续操作。

·阻塞receive:接收者阻塞,直有消息可用。

·非阻塞receive:接收者收到一个有效消息或空消息。

3.缓冲

不管通信是直接的还是间接的,通信进程所交换的消息都驻留在临时队列中。简单地讲,队列实现有三种方法:

·零流量:队列最大长度为0,因此线路中不能有任何消息处于等待。必须阻塞发送,直到接收者接收到消息。

·有限容量:若线路满,则必须阻塞发送直到队列中的空间可用为止。

·无限容量:从不阻塞发送者。

:零流量情况称为没有缓冲的消息系统,其他情况称为自动缓冲。

此外,还有其他方式可进行进程之间的通信,如管道、socket等,将在另一篇文章介绍。

[OS] 进程相关知识点的更多相关文章

  1. [OS] 线程相关知识点

    操作系统中引入进程的目的,是为了描述和实现多个程序的并发执行,以改善资源利用率以及提高系统吞吐量.那为什么还需要引入线程呢?下面我们先来回顾一下什么是进程: 进程有两个基本属性:·资源的拥有者:给每个 ...

  2. [OS] 死锁相关知识点以及银行家算法详解

    因此我们先来介绍一下死锁: 死锁特征 当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,先深入讨论一下死锁的特征. ·必要条件 (1)互 ...

  3. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

  4. IOS开发涉及有点概念&相关知识点

    前言,IOS是基于UNIX的,用C/C+/OC直通系统底层,不想android有个jvm. 首先还是系统架构的分层架构 1.核心操作系统层 Core OS,就是内存管理.文件系统.电源管理等 2.核心 ...

  5. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  6. linux服务器开发二(系统编程)--进程相关

    进程相关的概念 程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(CPU.内存.打开的文件.设备.锁等等). 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...

  7. day34进程相关

    进程1 什么是进程    进程指的是一个正在进行/运行的程序,进程是用来描述程序执行过程的虚拟概念    进程vs程序    程序:一堆代码    进程:程序的执行的过程    进程的概念起源于操作系 ...

  8. Python OS模块重要知识点

    Python OS模块重要知识点 这几点很重要,主要是关于文件路径,我之前踩了很多坑,今天总结一下,方便以后能够避免与path相关的各种坑! 1,首先我们想获取某个文件夹下面的所有文件夹以及文件(不包 ...

  9. http及浏览器相关知识点归纳

    http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...

随机推荐

  1. 【TOJ 3812】Find the Lost Sock(异或)

    描述 Alice bought a lot of pairs of socks yesterday. But when she went home, she found that she has lo ...

  2. 洛谷P2439 [SDOI2005]阶梯教室设备利用(带权区间覆盖)

    题目背景 我们现有许多演讲要在阶梯教室中举行.每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的.现在我们想要尽最大可能的利用这个教室 ...

  3. vs2017中的scanf_s

    在visual studio 2017中格式化输入函数不同于其他c/c++编译器使用scanf,而是使用scanf_s. scanf_s相比较于scanf来说更安全,因为使用scanf_s函数需要有一 ...

  4. Java OOP——第一章 对象和封装

    1.软件出现的目的: 用计算机的语言描述现实世界 用计算机解决现实世界的问题   ◆面向对象设计和开发程序的好处:    交流更加流畅    提高设计和开发效率 计算机语言的发展向接近人的思维方式演变 ...

  5. php获取客户端IP地址、所在地、操作系统、浏览器信息

    本实例主要实现获取客户端的IP,再根据获取的IP获取所在地,还可以获取用户当前电脑使用的操作系统以及用户是通过什么浏览器进行访问的. 您可以在这里查看具体演示和下载demo  http://www.j ...

  6. 国内maven库链接地址,链接阿里的库,下载很快!!!

    <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http:/ ...

  7. (数据科学学习手札14)Mean-Shift聚类法简单介绍及Python实现

    不管之前介绍的K-means还是K-medoids聚类,都得事先确定聚类簇的个数,而且肘部法则也并不是万能的,总会遇到难以抉择的情况,而本篇将要介绍的Mean-Shift聚类法就可以自动确定k的个数, ...

  8. HDU暑假多校第三场H.Monster Hunter

    一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...

  9. python2.7练习小例子(十)

        10):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?     程序分析:兔子的规律为数列1,1 ...

  10. Android log 里面快速搜索错误堆栈 ( 关键字)

    有时候,别人给你的log 文件,是一个文件夹,里面放了很多文件.但是可能你需要的log 只有几行.这时候不可能手工搜索的. 那怎么办呢?使用FileLocationPro.下载地址: https:// ...