OS- -进程详详解
OS- -进程详详解
文章目录
- OS- -进程详详解
- 一、进程
- 进程模型
- 进程的创建
- 进程的终止
- 进程的层次结构
- 进程状态
- 进程的实现
一、进程
操作系统中最核心的概念就是进程,进程是对正在运行中的程序的一个抽象。操作系统的其他所有内 容都是围绕着进程展开的。
进程是操作系统提供的最古老也是最重要的概念之一。即使可以使用的 CPU只有一个,它们也支持(伪)并发操作。它们会将一个单独的CPU抽象为多个虚拟机的CPU。
可以说:没有进程的抽象,现代操作系统将不复存在。
所有现代的计算机会在同一时刻做很多事情,过去使用计算机的人(单CPU)可能完全无法理解现在 这种变化
举个例子更能说明这一点:首先考虑一个Web服务器,请求都来自于Web网页。
当一个请 求到达时,服务器会检查当前页是否在缓存中,如果是在缓存中,就直接把缓存中的内容返回。
如果缓 存中没有的话,那么请求就会交给磁盘来处理。但是,从CPU的角度来看,磁盘请求需要更长的时 间,因为磁盘请求会很慢。
当硬盘请求完成时,更多其他请求才会进入。如果有多个磁盘的话,可以在 第一个请求完成前就可以连续的对其他磁盘发出部分或全部请求。
很显然,这是一种并发现象,需要有 并发控制条件来控制并发现象。
现在考虑只有一个用户的PC。当系统启动时,许多进程也在后台启动,用户通常不知道这些进程的启 动,试想一下,当你自己的计算机启动的时候,你能知道哪些进程是需要启动的么?
这些后台进程可能 是一个需要输入电子邮件的电子邮件进程,或者是一个计算机病毒查杀进程来周期性的更新病毒库。某 个用户进程可能会在所有用户上网的时候打印文件以及刻录CD-ROM,这些活动都需要管理。
于是一 个支持多进程的多道程序系统就会显得很有必要了。
在
许多多道程序系统中,CPU会在进程间快速切换,使每个程序运行几十或者几百毫秒
。然而,严格 意义来说,
在某一个瞬间,CPU只能运行一个进程,然而我们如果把时间定位为1秒内的话,它可能 运行多个进程
。这样就会让我们产生并行的错觉。有时候人们说的 伪并行Cpseudoparallelism) 就是这种情况,以来区分多处理器系统(该系统由两个或多个CPU来共享同一个物理内存)再来详细解释一下伪井行:
伪并行是指单核或多核处理器同时执行多个进程,从而使程序更快。 通过以非常有限的时间间隔在程序之间快速切换CPU,因此会产生并行感。缺点是CPU时间可 能分配给下一个进程,也可能不分配给下一个进程
。因为CPU执行速度很快,进程间的换进换出也非常迅速,因此我们很难对多个并行进程进行跟踪,所 以,在经过多年的努力后,操作系统的设计者开发了用于描述并行的一种概念模型(顺序进程),使得并行更加容易理解和分析
对该模型的探讨,也是本篇文章的主题。下面我们就来探讨一下进程模型
进程模型
在进程模型中,所有计算机上运行的软件,通常也包括操作系统,被组织为若干顺序进程(sequential processes),简称为进程(process)。
一个进程就是一个正在执行的程序的实例,进程也包括程 序计数器、寄存器和变量的当前值。从概念上来说,每个进程都有各自的虚拟CPU,但是实际情况是 CPU会在各个进程之间进行来回切换
。
如上图所示,这是一个具有4个程序的多道处理程序,在进程不断切换的过程中,程序计数器也在不同 的变化。
在上图中,这4道程序被抽象为4个拥有各自控制流程(即每个自己的程序计数器)的进程,并且每 个程序都独立的运行。
当然,实际上只有一个物理程序计数器,每个程序要运行时,其逻辑程序计数器 会装载到物理程序计数器中。
当程序运行结束后,其物理程序计数器就会是真正的程序计数器,然后再 把它放回进程的逻辑计数器中。
从下图我们可以看到,在观察足够长的一段时间后,所有的进程都运行了,但在任何一个给定的瞬间仅 有一个进程真正运行。
因此,当我们说一个CPU只能真正一次运行一个进程的时候,即使有2个核(或CPU),每一个核 也只能一次运行一个线程。
- 由于CPU会在各个进程之间来回快速切换,所以每个进程在CPU中的运行时间是无法确定的。
并且 当同一个进程再次在CPU中运行时,其在CPU内部的运行时间往往也是不固定的。
进程和程序之间 的区别是非常微妙的,但是通过一个例子可以让你加以区分:
- 想想一位会做饭的计算机科学家正在为他 的女儿制作生日蛋糕。
- 他有做生日蛋糕的食谱,厨房里有所需的原谅:面粉、鸡蛋、糖、香草汁等。
- 在这个比喻中,做蛋糕的食谱就是程序、计算机科学家就是CPU.
- 而做蛋糕的各种原谅都是输入数据。
- 进程就是科学家阅读食谱、取来各种原料以及烘焙蛋糕等一系例了动作的总和。
- 现在假设科学家的儿子跑过来告诉他,说他的头被蜜蜂蛰了一下,那么此时科学家会记录出来他做蛋糕这个过程到了哪一步
- 然后拿出急救手册,按照上面的步骤给他儿子实施救助。
- 这里,会涉及到进程之间的切换,科学家(CPU)会从做蛋糕(进程)切换到实施医疗救助(另一个进程)。
- 等待伤口处理完毕后
- 科学家会回到刚刚记录做蛋糕的那一步,继续制作。
- 这里的关键思想是认识到一个进程所需的条件,进程是某一类特定活动的总和,它有程序、输入输出以 及状态。
单个处理器可以被若干进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而 为另外一个进程提供服务。
- 另外需要注意的是,如果一个进程运行了两遍,则被认为是两个进程。那么 我们了解到进程模型后,那么进程是如何创建的呢?
进程的创建
操作系统需要一些方式来创建进程。下面是一些创建进程的方式
•系统初始化(init)
•正在运行的程序执行了创建进程的系统调用(比如fork)
•用户请求创建一个新进程
•初始化一个批处理工作
系统初始化
启动操作系统时,通常会创建若干个进程。其中有些是前台进程(numerous processes),也就是同 用户进行交互并替他们完成工作的进程。一些运行在后台,并不与特定的用户进行交互。
- 例如,设计一 个进程来接收发来的电子邮件,这个进程大部分的时间都在休眠,但是只要邮件到来后这个进程就会被唤醒。
- 还可以设计一个进程来接收对该计算机上网页的传入请求,在请求到达的进程唤醒来处理网页的传入请求。
- 进程运行在后台用来处理一些活动像是e-mail, web网页,新闻,打印等等被称为
守护进程(daemons)
。- 大型系统会有很多守护进程。在UNIX中,ps程序可以列出正在运行的进程,在 Windows中,可以使用任务管理器。
系统调用创建
除了在启动阶段创建进程之外,一些新的进程也可以在后面创建。通常,
一个正在运行的进程会发出系 统调用用来创建一个或多个新进程来帮助其完成工作。
例如,如果有大量的数据需要经过网络调取并进 行顺序处理,那么创建一个进程读数据,并把数据放到共享缓冲区中,而让第二个进程取走并正确处理 会比较容易些。在多处理器中,让每个进程运行在不同的CPU±也可以使工作做的更快。
用户请求创建
在许多交互式系统中,输入一个命令或者双击图标就可以启动程序,以上任意一种操作都可以选择开启 一个新的进程
在基本的UNIX系统中运行X,新进程将接管启动它的窗口。在Windows中启动进程 时,它一般没有窗口,但是它可以创建一个或多个窗口。每个窗口都可以运行进程。通过鼠标或者命令 就可以切换窗口并与进程进行交互。
交互式系统是以人与计算机之间大量交互为特征的计算机系统,比如游戏、web浏览器,IDE等 集成开发环境。
批处理创建
最后一种创建进程的情形会在大型机的批处理系统中应用。
用户在这种系统中提交批处理作业。当操作 系统决定它有资源来运行另一个任务时,它将创建一个新进程并从其中的输入队列中运行下一个作业。
从技术上讲,在所有这些情况下,让现有流程执行流程是通过创建系统调用来创建新流程的。
该进程可 能是正在运行的用户进程,是从键盘或鼠标调用的系统进程或批处理程序。这些就是系统调用创建新进 程的过程。该系统调用告诉操作系统创建一个新进程,并直接或间接指示在其中运行哪个程序。
在UNIX中,
仅有一个系统调用来创建一个新的进程,这个系统调用就是fork 这个调用会创建一 个与调用进程相关的副本。
在fork后,一个父进程和子进程会有相同的内存映像,相同的环境字符串和 相同的打开文件。
通常,
子进程会执行execve或者一个简单的系统调用来改变内存映像并运行一个 新的程序。
例如,当一个用户在shell中输出sort命令时,shell会fork-个子进程然后子进程去执行 sort命令。这两步过程的原因是允许子进程在fork之后但在execve之前操作其文件描述符,以完成标 准输入,标准输出和标准错误的重定向。
在Windows中,情况正相反,一个简单的Win32功能调用CreateProcess ,会处理流程创建并将 正确的程序加载到新的进程中。
这个调用会有10个参数,包括了需要执行的程序、输入给程序的命令 行参数、各种安全属性、有关打开的文件是否继承控制位、优先级信息、进程所需要创建的窗口规格以 及指向一个结构的指针,在该结构中新创建进程的信息被返回给调用者。
除了 CreateProcess Win 32中大概有100个其他的函数用于处理进程的管理,同步以及相关的事务。下面是UNIX操作系统和 Windows操作系统系统调用的对比
在UNIX和Windows中,进程创建之后,
父进程和子进程有各自不同的地址空间
。如果其中某个进程 在其地址空间中修改了一个词,这个修改将对另一个进程不可见。在UNIX中,子进程的地址空间是父 进程的一个拷贝,但是确是两个不同的地址空间;不可写的内存区域是共享的。
某些UNIX实现是正是 在两者之间共享,因为它不能被修改。
或者,子进程共享父进程的所有内存,但是这种情况下内存
通过写时复制(copy-on-write)共享,这意味着一旦两者之一想要修改部分内存,则这块内存首先被明确 的复制,以确保修改发生在私有内存区域
。再次强调,
可写的内存是不能被共享的
。但是,对于一个新 创建的进程来说,确实有可能共享创建者的资源,比如可以共享打开的文件。在Windows中,从一开 始父进程的地址空间和子进程的地址空间就是不同的。
进程的终止
进程在创建之后,它就开始运行并做完成任务。然而,没有什么事儿是永不停歇的,包括进程也一样。进程早晚会发生终止,但是通常是由于以下情况触发的
•正常退出(自愿的)
• 错误退出(自愿的)
•严重错误(非自愿的)
•被其他进程杀死(非自愿的)
正常退出
多数进程是由于完成了工作而终止。当编译器完成了所给定程序的编译之后,编译器会执行一个系统调 用告诉操作系统它完成了工作。这个调用在UNIX中是exit ,在Windows中是ExitProcess。
面向屏幕中的软件也支持自愿终止操作。字处理软件、Internet浏览器和类似的程序中总有一个供用户 点击的图标或菜单项,用来通知进程删除它锁打开的任何临时文件,然后终止。
错误退出
进程发生终止的第二个原因是发现严重错误,例如,如果用户执行如下命令
cc foo.c
为了能够编译foo.c但是该文件不存在,于是编译器就会发出声明并退出
。在给出了错误参数时,面向 屏幕的交互式进程通常并不会直接退出,因为这从用户的角度来说并不合理,用户需要知道发生了什么 并想要进行重试,所以这时候应用程序通常会弹出一个对话框告知用户发生了系统错误,是需要重试还 是退出。
严重错误
进程终止的第三个原因是由进程引起的错误,通常是由于程序中的错误所导致
的。例如,
执行了一条非 法指令,引用不存在的内存,或者除数是0等
。在有些系统比如UNIX中,进程可以通知操作系统,它 希望自行处理某种类型的错误,在这类错误中,进程会收到信号(中断),而不是在这类错误出现时直 接终止进程
。被其他进程杀死
第四个终止进程的原因是,
某个进程执行系统调用告诉操作系统杀死某个进程
。在UNIX中,这个系统 调用是kill。在Win32中对应的函数是TerminateProcess (注意不是系统调用)。
进程的层次结构
在一些系统中,当一个进程创建了其他进程后,父进程和子进程就会以某种方式进行关联。子进程它自己就会创建更多进程,从而形成一个进程层次结构。
UNIX进程体系
在UNIX中,
进程和它的所有子进程以及子进程的子进程共同组成一个进程组
。当用户从键盘中发出一 个信号后,该信号被发送给当前与键盘相关的进程组中的所有成员
(它们通常是在当前窗口创建的所有 活动进程)。每个进程可以分别捕获该信号、忽略该信号或采取默认的动作,即被信号kill掉
。
这里有另一个例子,可以用来说明层次的作用,考虑UNIX在启动时如何初始化自己:
一个称为init的特殊进程出现在启动映像中。当init进程开始运行时,它会读取一个文件,文件会告诉它有 多少个终端。
然后为每个终端创建一个新进程。这些进程等待用户登录。如果登录成功,该登录进程就 执行一个shell来等待接收用户输入指令,这些命令可能会启动更多的进程,以此类推。
因此,整个操 作系统中所有的进程都隶属于一个单个以init为根的进程树。
Windows进程体系
相反,
Windows中没有进程层次的概念,Windows中所有进程都是平等
的唯一类似于层次结构的是 在创建进程的时候,
父进程得到一个特别的令牌
(称为句柄),该句柄可以用来控制子进程。然而,这 个令牌可能也会移交给别的操作系统
,这样就不存在层次结构了。而在UNIX中,进程不能剥夺其子进 程的 进程权。(这样看来,还是Windows比较渣)。
进程状态
- 尽管每个进程是一个独立的实体,有其自己的程序计数器和内部状态,但是,进程之间仍然需要相互帮 助。例如,一个进程的结果可以作为另一个进程的输入,在shell命令中
cat chapter1 chapter2 chapter3 | grep tree
- 第一个进程是cat ,将三个文件级联并输出。
- 第二个进程是grep ,它从输入中选择具有包含关键字 tree的内容,根据这两个进程的相对速度(这取决于两个程序的相对复杂度和各自所分配到的CPU 时间片),可能会发生下面这种情况
- grep准备就绪开始运行,但是输入进程还没有完成,于是必 须阻塞grep进程,直到输入完毕。
当一个进程开始运行时,它可能会经历下面这几种状态:
图中会涉及三种状态
1.
运行态,运行态指的就是进程实际占用CPU时间片运行时
2.
就绪态,就绪态指的是可运行,但因为其他进程正在运行而处于就绪状态
3.
阻塞态,除非某种外部事件发生,否则进程不能运行
逻辑上来说,运行态和就绪态是很相似的。这两种情况下都表示进程可运行,但是第二种情况没有获得CPU时间分片。第三种状态与前两种状态不同的原因是这个进程不能运行,CPU空闲时也不能运 行
。三种状态会涉及四种状态间的切换,在操作系统发现进程不能继续执行时会发生状态1的轮转,在某些 系统中进程执行系统调用
- 例如pause ,来获取一个阻塞的状态。在其他系统中包括UNIX,当进程
从管道或特殊文件(例如终端)中读取没有可用的输入时,该进程会被自动终止。
转换2和转换3都是由进程调度程序(操作系统的一部分)引起的,进程本身不知道调度程序的存 在
。转换2的出现说明进程调度器认定当前进程已经运行了足够长的时间,是时候让其他进程运行 CPU时间片了
。- 当所有其他进程都运行过后,这时候该是让第一个进程重新获得CPU时间片的时候 了,就会发生转换3。
程序调度指的是,决定哪个进程优先被运行和运行多久,这是很重要的一点。已经设计出许多算 法来尝试平衡系统整体效率与各个流程之间的竞争需求
。
当进程等待的一个外部事件发生时(如从外部输入一些数据后),则发生转换4。
如果此时没有其他进 程在运行,则立刻触发转换3,该进程便开始运行,否则该进程会处于就绪阶段,等待CPU空闲后再 轮到它运行。
从上面的观点引入了下面的模型
- 基于进程的操作系统中最底层的是中断和调度处理,在该层之上是顺序进程
操作系统最底层的就是调度程序,在它上面有许多进程。
所有关于中断处理、启动进程和停止进程的具 体细节都隐藏在调度程序中。事实上,调度程序只是一段非常小的程序。
进程的实现
操作系统为了执行进程间的切换,会维护着一张表格,这张表就是进程表
(process table)。每个进 程占用一个进程表项
。该表项包含了进程状态的重要信息
,包括程序计数器、堆栈指针、内存分配状 况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时所必须保 存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样
。
下面展示了一个典型系统中的关键字段
第一列内容与进程管理有关,第二列内容与 存储管理有关,第三列内容与文件管理有关。
现在我们应该对进程表有个大致的了解了,就可以在对单个CPU上如何运行多个顺序进程的错觉做更 多的解释。
与每一 I/O类相关联的是一个称作 中断向量(interrupt vector)的位置(靠近内存底部 的固定区域)。它包含中断服务程序的入口地址。
假设当一个磁盘中断发生时,用户进程3正在运行, 则中断硬件将程序计数器、程序状态字、有时还有一个或多个寄存器压入堆栈,计算机随即跳转到中断 向量所指示的地址。这就是硬件所做的事情。然后软件就随即接管一切剩余的工作
。当中断结束后,操作系统会调用一个C程序来处理中断剩下的工作。在完成剩下的工作后,会使某些进 程就绪,接着调用调度程序,决定随后运行哪个进程。
然后将控制权转移给一段汇编语言代码,为当前 的进程装入寄存器值以及内存映射并启动该进程运行
下面显示了中断处理和调度的过程:
- 1.
硬件压入堆栈程序计数器等
- 2.硬件
从中断向量装入新的程序计数器
- 3.汇编语言过程保存寄存器的值
- 4.汇编语言过程设置新的堆栈
- 5.C中断服务器运行(典型的读和缓存写入)
- 6.
调度器决定下面哪个程序先运行
- 7.C过程返回至汇编代码
- 8.汇编语言过程开始运行新的当前进程
一个进程在执行过程中可能被中断数千次,但关键每次中断后,被中断的进程都返回到与中断发生前完 全相同的状态。
OS- -进程详详解相关推荐
- getpid php,对python中的os.getpid()和os.fork()函数详解
如下所示: import os import sys import time processNmae = 'parent' print "Program executing ntpid:%d ...
- Linux操作系统的进程管理详解
Linux操作系统的进程管理详解 pkill & pgrep pkill & pgrep 是两个很方便的命令.省去了要先ps auwx | grep xxxx然后再根据pid kill ...
- router linux命令,router os 常用命令详解
router os 常用命令详解 发布时间:2006-04-20 01:17:30来源:红联作者:[Hl.y] 看了很多router os 的资料都是关于如何安装的,却很少见到关于router os的 ...
- linux看不到进程管理,关于Linux下进程的详解【进程查看与管理】
关于Linux下进程的详解[进程查看与管理] 一.关于进程 进程: 已经启动的可执行程序的运行实力 进程的组成:一个进程包含内核中的一部分地址空间和一系列数据结构.其中地址空间是内核标记的一部分内存以 ...
- (渗透测试后期)Linux进程隐藏详解
文章目录 (渗透测试后期)Linux进程隐藏详解 前言 Linux进程基础 Linux进程侦查手段 Linux进程隐藏手段 一.基于用户态的进程隐藏 方法1:小隐隐于/proc/pid--劫持read ...
- IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
IIS:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池的最大工作进程数详解 iis性能指标的各种概念:连接数.并发连接数.最大并发工作线程数.应用程序池的队列长度.应用程序池 ...
- iTerm2终端工具在Mac OS上使用详解
iTerm2终端工具在Mac OS上使用详解 一.概述 因个人工作需要,使用终端工具进行运维和开发工作,但是Mac OS 自带的终端工具使用堡垒机登录配置不了,而且使用CRT等终端工具每次登录堡垒机都 ...
- WINDOWS XP服务和进程优化详解
WINDOWS XP服务和进程优化详解 1.Alerter Alerter(警示器)服务的进程名是Services.exe(即启动这个服务后在后台运行的进程的名称,可以通过任务管理器看到).Alert ...
- 操作系统OS进程(一)初识
OS进程 什么是进程 进程状态 中断 信号 什么是进程 逻辑上,执行程序的过程 操作系统加载程序,执行程序,产生一个进程 物理上,操作系统分配的资源 程序执行过程中需要的程序,数据,以及内存.寄存器等 ...
最新文章
- swift 连接mysql数据库_Swift - 操作SQLite数据库(引用SQLite3库)
- 基于KVM虚拟化搭建lamp
- 【ORACLE 高可用】 高级复制的两个配置实例 - 使用高级复制和物化视图
- linux系统基础优化小结
- X86逆向教程10:学会使用硬件断点
- EasyOcr 安装(linux、docker)、使用(gin、python)
- 问世十年,腾讯宣布重磅产品死亡:一代人的青春记忆!
- array 前端面试题_一则关于js数组的前端面试题
- 国联安 德盛 新基金 申购免手续费 产品好 利润高
- UI设计之不同抠图工具的使用技巧
- 网站/APP统计分析工具及教程
- 看完比尔盖茨30年的56条思考,我才理解他为什么能17年斩获世界首富!
- Kruise Rollout: 让所有应用负载都能使用渐进式交付
- IE安全系列:IE浏览器的技术变迁(上)
- buck型三相PFC
- java作业Scanner收银
- android源码树结构介绍
- 1.11 学JS的第7天
- 调用海康视频接口获取预览取流的URL
- 分享 孩子,请记住那些比药家鑫更凶恶的人——21世纪经济导报记者周斌写给张妙儿子的一封信(转)...