进程

定义

  • 浏览器是多进程的

  • 浏览器之所以能够运行,是因为系统给它的进程分配了资源(cpu、内存)

  • 简单点理解,每打开一个 Tab 页,就相当于创建了一个独立的浏览器进程。

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程 [3] 
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
代码与程序:
代码可以看做是程序的片段,代码也许只有一行或是几行,是完成部分任务的,程序是精心安排部署的代码的集合,完成系统的复杂的任务的。单独的代码没有任何意义,只有放在特定的程序中,被解释成计算机可以执行的程序时才有用
单词与文章之间的关系

进程的定义:是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。 

程序的定义:只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。

程序
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
进程更能真实地描述并发,而程序不能;
进程是由进程控制块程序段、数据段三部分组成;
进程具有创建其他进程的功能,而程序没有。
同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。
 
线程
进程和线程关系进程和线程关系
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线程操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
当下推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。

控制

进程控制是进程管理中最基本的功能。它用于创建一个新进程,终止一个已完成的进程,或者去终止一个因出现某事件而使其无法运行下去的进程,还可负责进程运行中的状态转换。
创建进程
1.引起创建进程的事件
多道程序环境中,只有(作为)进程(时)才能在系统中运行。因此,为使程序能运行,就必须为它创建进程。导致一个进程去创建另一个进程的典型事件,可以有以下四类:
1) 用户登录
分时系统中,用户在终端键入登录命令后,如果是合法用户,系统将为该终端建立一个进程,并把它插入到就绪队列中。
批处理系统中,当作业调度程序按照一定的算法调度到某作业时,便将该作业装入到内存,为它分配必要的资源,并立即为它创建进程,再插入到就绪队列中。
3) 提供服务
当运行中的用户程序提出某种请求后,系统将专门创建一个进程来提供用户所需要的服务,例如,用户程序要求进行文件打印,操作系统将为它创建一个打印进程,这样,不仅可以使打印进程与该用户进程并发执行,而且还便于计算出为完成打印任务所花费的时间。
4) 应用请求
在上述三种情况中,都是由系统内核为它创建一个新进程,而这一类事件则是基于应用进程的需求,由它创建一个新的进程,以便使新进程以并发的运行方式完成特定任务。
2.进程的创建过程
一旦操作系统发现了要求创建新进程的事件后,便调用进程创建原语create()按下述步骤创建一个新进程。
1) 申请空白PCB。为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。
2) 为新进程分配资源。为新进程的程序和数据以及用户栈分配必要的内存空间。显然,此时操作系统必须知道新进程所需要的内存大小。
3) 初始化进程控制块。PCB的初始化包括:
①初始化标识信息,将系统分配的标识符和父进程标识符,填入新的PCB中。
初始化处理机状态信息,使程序计数器指向程序的入口地址,使栈指针指向栈顶。
③初始化处理机控制信息,将进程的状态设置为就绪状态或静止就绪状态,对于优先级,通常是将它设置为最低优先级,除非用户以显式的方式提出高优先级要求。
4) 将新进程插入就绪队列,如果进程就绪队列能够接纳新进程,便将新进程插入到就绪队列中。
进程终止
1.引起进程终止的事件
1)正常结束
在任何计算机系统中,都应该有一个表示进程已经运行完成的指示。例如,在批处理系统中,通常在程序的最后安排一条Hold指令或终止的系统调用。当程序运行到Hold指令时,将产生一个中断,去通知OS本进程已经完成。
 
程序与指令
简单一点来理解:指令就是命令,你输入要求cpu运行工作的命令,就是指令。
由多(无数)条指令有顺序地排序起来的集合就是程序了!通过程序运行,最后到达程序
 
程序里的指令都是基于机器语言;程序通常首先用一种计算机程序设计语言编写,然后用编译程序或者解释执行程序翻译成机器语言。 有时,也可以用程序和数据程序已经被定义了。如何定义数据呢?数据可以被定义为被程序处理的信息。当我们考虑到整个计算机系统时,有时程序和数据的区别就不是那么明显了。中央处理器有时有一组微指令控制硬件,数据可以是一个有待执行的程序(参见脚本编程语言),程序可以编写成去编写其它的程序;所有这些例子都使程序和数据的比较成为一种视角的选择。有人甚至断言程序和数据没有区别。
计算机科学中,“指令”是由指令集构架定义的单个的CPU操作。在更广泛的意义上,“指令”可以是任何可执行程序的元素的表述,例如字节码。
在传统的构架上,指令包括一个操作码(opcode)--它指定了要进行什么样的操作,例如“将存储器中的内容与寄存器中的内容相加”--和零个或者更多的操作数(operand)--它可能指定了参与操作的寄存器、内存地址或者立即数(literal data)。操作数可能还包括寻址方式,它确定了操作数的含义
 
堆栈
堆栈是一个特定的存储区寄存器,它的一端是固定的,另一端是浮动的
堆栈是计算机科学领域重要的数据结构,它被用于多种数值计算领域。表达式求值是编译程序中较为常见的操作,在算术表达式求值的过程中,需要使用堆栈来保存表达式的中间值和运算符,堆栈使得表达式的中间运算过程的结果访问具有了一定的自动管理能力。大部分编译型程序设计语言具有程序递归特性,递归能够增强语言的表达能力和降低程序设计难度。递归程序的递归深度通常是不确定的,需要将子程序执行的返回地址保存到堆栈这种先进后出式的结构中,以保证子程序的返回地址的正确使用顺序。函数式程序设计语言中,不同子函数的参数的种类和个数是不相同的,编译器也是使用堆栈来存储子程序的参数 [2]  。
 

PCB

(进程管理块)

为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消

PCB中记录了操作系统所需的,用于描述进程的当前情况以及控制进程运行的全部信息。PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。

PCB进程控制块是进程的静态描述,由PCB、有关程序段和该程序段对其进行操作的数据结构集三部分组成。

作用

1 进程控制块:进程控制块的作用是使一个在多道程序环境下不能独立运行的程序(包含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。
2 程序段:是进程中能被进程调度程序在CPU上执行的程序代码段。
3 数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行后产生的中间或最终数据 [1]

包含信息

在不同的操作系统中对进程的控制和管理机制不同,PCB中的信息多少也不一样,通常PCB应包含如下一些信息。
1、进程标识符信息
2、处理机状态信息
说明进程当前所处的状态。为了管理的方便,系统设计时会将相同的状态的进程组成一个队列,如就绪进程队列,等待进程则要根据等待的事件组成多个等待队列,如等待打印机队列、等待等。处理机状态信息主要是由处理机各种寄存器中的内容所组成。
通用寄存器。又称为用户可视寄存器,可被用户程 序访问,用于暂存信息。
指令寄存器。存放要访问的下一条指令的地址。
程序状态字PSW。其中含有状态信息。(条件码、 执行方式、中断屏蔽标志等)
用户栈指针。每个用户进程有一个或若干个与之相 关的系统栈,用于存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶。
3.进程调度信息
在PCB中还存放了一些与进程调度和进程对换有关的信息。
(1)进程状态。指明进程当前的状态,作为进程调度和对换时的依据。
(2)进程优先级。用于描述进程使用处理机的优先级别的一个整数,优先级高的进程优先获得处理机。
(3)进程调度所需要的其他信息。(进程已等待CPU的时间总和、进程已执行的时间总和)
(4)事件。这是进程由执行状态转变为阻塞状态所等待发生的事件。(阻塞原因)
进程上下文:
是进程执行活动全过程的静态描述。包括计算机系统中与执行该进程有关的各种寄存器的值、程序段在经过编译之后形成的机器指令代码集、数据集及各种堆栈值和PCB结构。可按一定的执行层次组合,如用户级上下文、系统级上下文等。
进程存在的唯一标志:
在进程的整个生命周期中,系统总是通过PCB对进程进行控制的,亦即,系统是根据进程的PCB而不是任何别的什么而感知到该进程的存在的,所以说,PCB是进程存在的唯一标志 [1]  。
 

执行栈

执行栈是计算机科学中存储有关正在运行的子程序的消息的栈。有时称控制栈(control stack)、运行时栈(run-time stack)和调用栈,但栈中不一定仅存储子程序消息。几乎所有计算机程序都依赖于执行栈,然而高级语言一般将调用栈的细节隐藏至后台。

简介

执行栈是计算机科学中存储有关正在运行的子程序的消息的栈。经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入执行栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在执行栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),执行栈就会产生栈溢出
子程序函数的最大区别在于,子程序在执行后,并不返回任何值,而函数式要返回某种类型的值的。

功能

执行栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:
本地变量:子程序的变量可以存入调用栈,这样可以达到不同子程序间变量分离开的作用。
参数传递:如果寄存器不足以容纳子程序的参数,可以在调用栈上存入参数。
环境传递:有些语言(如Pascal与Ada)支持“多层子程序”,即子程序中可以利用主程序的本地变量。这些变量可以通过调用栈传入子程序。
在较底层语言(如汇编语言C语言中),程控消息与数据可能一同被存入调用栈中,因此造成安全隐患,可能允许恶意程序通过栈缓冲区溢出(stack buffer overflow)来获取程序的控制权。
posted @ 2019-10-11 15:51  燕子fly  阅读(252)  评论(0编辑  收藏  举报