进程模型是什么,第1张

在过程模型中,计算机上所有可运行的软件,通常包括操作系统,被组织成几个连续的过程,简称为过程。过程是一个动态的过程,即有生命周期,它拥有资源,它是一个程序的执行过程,它的状态是变化的。

进程模型中,计算机上所有可运行的软件,通常包括操作系统,被组织成几个连续的进程,简称为进程。操作系统中的核心概念是进程,这也是并发编程中最重要、最基本的概念。过程是一个动态的过程,即有生命周期,它拥有资源,它是一个程序的执行过程,它的状态是变化的。Windows、unix、Linux是目前最流行的操作系统。

进程模型是什么,进程模型是什么,第2张

操作原理

进程是正在执行的程序的实例,包括程序计数器、寄存器和变量的当前值。从概念上讲,每个进程都有自己的虚拟CPU。当然,真正的CPU其实是在进程之间来回切换的。然而,为了理解这个系统,考虑(伪)并行运行的进程集要比试图跟踪CPU如何在程序之间来回切换简单得多。如我们所见,这种快速切换称为多通道编程。

在图A中,我们可以看到多程序计算机的内存中有4个程序。在图B中,这四个程序抽象为四个进程,各有自己的控制流(即每个程序都有自己的逻辑程序计数器),每个程序独立运行。当然,实际上只有一个物理程序计数器,所以当每个程序运行时,其逻辑程序计数器被加载到实际的程序计数器中。当程序执行完成(或暂停)时,物理程序计数器保存在内存中进程的逻辑程序计数器中。在图c中,我们可以看到,在观察了足够长的时间后,所有的进程都在运行,但在任何给定的时刻,只有一个进程真正在运行。

因为CPU在进程间快速来回切换,所以每个进程执行其操作的速度是不确定的。而当同样的过程再次运行时,其运行速度通常是不可再现的。因此,在编程过程中,我们绝不能对时间做出任何明确的假设。例如,考虑一个输入/输出过程,它使用流式磁带机来恢复备份的文件。它执行空循环10 000次,等待磁带机达到正常速度,然后发出读取第一条记录的命令。如果CPU决定在空周期内切换到另一个进程,则在第一条记录通过磁头后,磁带机进程可能不会再次运行。当一个进程有如此严格的实时要求,即某些特定的事件必须在指定的毫秒数内发生时,必须采取特殊的措施来保证它们必须在这个时间内发生。但是,一般来说,大多数进程不受CPU多道程序设计或其他进程相对速度的影响。

值得注意的是,如果一个程序运行两次,就算作两个进程。例如,我们可能经常两次启动同一个文字处理软件,或者在有两台可用打印机的情况下同时打印两个文件。“两个进程恰好运行同一个程序”这个事实其实并不重要,因为它们是不同的进程。操作系统可以让他们共享代码,所以只有一个副本放在内存中,但这只是一个技术细节,不会改变有两个进程在运行的概念。

独特的理解

过程和程序的区别很微妙,但很重要。用一个比喻可以让我们更容易理解这一点。想象一下,一个厨艺高超的计算机科学家为女儿烤生日蛋糕。他有制作生日蛋糕的食谱,厨房有必备的原料:面粉、鸡蛋、糖、香草汁等等。在这个比喻中,做蛋糕的食谱是一个程序(即以适当形式描述的算法),计算机科学家是一个处理器(CPU),做蛋糕的原料是输入数据。过程就是一系列动作的总和,比如看菜谱,拿各种原料,烤蛋糕。

现在假设计算机科学家的儿子哭着进来说他的头被蜜蜂蛰了。这位计算机科学家根据配方(保存过程的当前状态)记录了他在哪里做的,然后拿出一本急救手册,按照说明处理刺痛。这里我们看到处理器从一个流程(做蛋糕)切换到另一个优先级高的流程(实施医疗),每个流程都有自己的程序(菜谱和急救手册)。蜜蜂蛰完了,电脑科学家回来做蛋糕,从离开的那一步继续做蛋糕。

这里的关键思想是,过程是某种类型的活动,它有程序、输入、输出和状态。一个处理器可以由几个进程共享。它使用一些调度算法来决定何时停止一个进程的工作,而为另一个进程提供服务。

特定模型介绍

Windows、unix、Linux是目前最流行的操作系统。因为Linux和unix有很多相似之处,这里只分析Windows和Linux操作系统中的流程模型。

Linux进程模型

1.1 Linux进程描述符为了管理进程,内核必须清晰地描述每个进程做什么,这就是进程描述符的作用。过程描述符都是task_struct类型的结构,它们的字段包含与过程相关的所有信息。过程描述符包含过程的所有信息。Task_struct是一个非常复杂的结构。本文重点分析其中包含的信息:

过程描述符中的状态字段描述了过程的当前状态。它由一组标志组成,每个标志描述一个可能的进程状态。以下是六种可能的状态:①可运行状态进程要么正在CPU上执行,要么准备执行。正在运行的进程是当前进程(current所指向的进程),而准备运行的进程只要得到CPU就可以运行,CPU是这些进程唯一等待的系统资源。②可中断等待过程暂停(睡眠),直到某个条件变为真。

③不间断等待状态类似于可中断等待状态,但有一点不同。将信号传递给睡眠进程不能改变其状态。④暂停状态进程的执行被暂停。一般在收到SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU信号后,进程处于这种状态。⑤跟踪状态进程的执行已被调试器程序暂停。⑥死状态进程的执行被终止,但是在发出wait4()系统调用之前,它在进程表中仍然有它的任务结构。

(2)进程调度信息调度器利用这个信息来决定系统中哪个进程应该运行得最多,并结合进程的状态信息来保证系统公平高效的运行。这部分信息通常包括流程的类型(普通流程或实时流程)、流程的优先级等等。(3)标识符Linux操作系统允许用户使用一个称为进程标识符进程ID(或pid)的数字来标记一个进程,PID存储在进程描述符的PID字段中。PID按顺序编号,新建流程的PID通常是上一个流程的PID加1。然而PID是有上限的。当内核使用的PID达到这个上限时,就必须开始回收闲置的小PID号。(4)关于过程通信的信息为了使过程在同一任务上协调工作,过程必须能够通信,即交换数据。Linux支持很多不同的通信机制。它包含以下字段:spin lock _ t sigmask _ lock:spin lock long blocked of sign mask:sign mask struct SIG:sign sign:sign processing function struct SEM _ undo * Semundo:取消信号量上设置的操作以避免死锁struct sem _ queue * semsleeping:与信号量操作相关的等待队列(5)进程链接信息程序创建的进程具有父子关系。如果一个流程创建多个子程序,则子流程之间存在兄弟关系。(6)时间和计时器信息一个进程从创建到终止的生命周期称为进程的生命周期。当一个进程在其生命周期内使用CPU时,内核应该记录它进行统计、计费等相关操作。一个进程消耗的CPU时间由两部分组成:一部分是在用户模式(或用户模式)下花费的时间,另一部分是在系统模式(或系统模式)下花费的时间。每一次时钟滴答,也就是每一次时钟中断,内核都要更新当前进程消耗的CPU时间。进程有三种类型的计时器:实时计时器、虚拟计时器和配置文件计时器。这三个计时器有三个特征:到期时间、计时间隔和要触发的事件。到期时间是定时器完成计时操作,从而触发相应事件的时间;定时间隔是两次定时操作之间的时间间隔,它决定了定时操作是否继续。如果计时间隔大于O,则在定时器到期时,重新分配定时器的到期时间,这样计时操作可以一直持续到进程结束或者定时器停止,但是对于不同的定时器,到期时间的重新分配操作是不同的。无论实时计时器所属的进程是否正在运行,都应该对其进行更新。因此,当时钟中断到来时,系统中所有进程的实时定时器都应该更新。如果多个进程的实时定时器到期,内核应该逐个处理这些定时器触发的事件。虚拟定时器和profile定时器只在进程运行时更新,所以当时钟中断到来时,只更新当前进程的profile定时器,如果当前进程在用户模式下运行,其虚拟定时器也会更新。(7)文件系统信息处理可以打开或关闭文件,文件属于系统资源。Linux内核应该记录进程对文件的使用。task_struct结构中有两种数据结构来描述与进程和文件相关的信息。fs_struct中描述了两个vFs索引节点,分别称为root和pwd,分别指向Home目录和进程可执行映像对应的当前目录或工作目录。file_struct结构记录由进程打开的文件的描述符。(8)虚拟内存信息除了内核线程,每个进程都有自己的地址空(也叫virtual 空),用mm_struct描述。内存信息如下:struct mm_struct *mm:描述进程的地址空struct mm _ struct * active _ mm:内核线程借用的地址空 (9)页面管理信息当物理内存不足时,Linux内存管理子系统需要将内存中的部分页面交换到外部内存, 和对称多处理器相关的域如下:int has_cpu:进程当前是否拥有CPU int processor:进程当前使用的CPU int lock_depth:上下文切换期间的内核锁定深度(11)和处理器相关的环境信息进程作为执行环境的合成,当系统调度一个进程执行时,即为该进程建立一个完整的环境时,处理器的寄存器和堆栈是必不可少的。 因为不同的处理器对内部寄存器和栈的定义不同,所以被称为“处理器相关环境”和“处理器状态”。当进程暂时停止运行时,处理器状态必须保存在进程的task_struct结构中,当进程被调度再次运行时,可以从中恢复这些环境,即可以恢复这些寄存器和栈的值。处理器信息的定义形式是struct thread_struct*tss:任务切换状态1.2 Linux进程描述符处理进程是一个动态实体,其生命周期从几毫秒到几个月不等。因此,内核必须能够同时处理多个进程,并将进程描述符存储在动态内存中。Linux将两种不同的数据结构紧凑地放置在一个为进程分配的存储区域:一个是内核进程栈,另一个是进程描述符旁边的小数据结构thread_info,称为线程描述符。这个存储区的大小通常是8192字节(两页帧)。alloc_thread_info和free_thread_info宏被内核用来分配和释放存储thread_info结构和内核的内存区域。1.3过程链表过程链表链接所有过程描述符。每个task_struct结构都包含一个list_head类型的tasks域,这种类型的prev和next域分别指向前面和后面的task_struct元素。进程链表的头是init_task descriptor,它是所谓的0进程(process 0)或交换进程的进程描述符。init_task的tasks.prev域指向链表中最后插入的进程描述符的tasks域。当内核寻找一个新的进程在CPU上运行时,它必须只考虑可运行的进程(即处于TASK _ RUNNING状态的进程)。Linux2.6实现的运行队列建立了多个可运行进程的链表,每个进程优先级对应一个不同的链表。其目的是使调度程序能够在固定时间内选择“最佳”可运行进程,而不管队列中可运行进程的数量。每个task_struct描述符都包含一个list_head类型的run_list字段。这样,内核必须为系统中的每个运行队列保存大量的数据,但运行队列的主要数据结构是构成运行队列的进程描述符链表,而这些链表都是由单一的prio_array_t数据结构实现的。

Windows进程模型

2.1 Windows进程的特点Windows进程设计的目标是支持各种操作系统环境。不同操作系统环境支持的流程在许多方面有所不同,包括:

◇如何命名一个进程◆一个进程中是否提供线程◆如何表示一个进程◆如何保护进程资源◆进程之间的通信和同步使用什么机制◆进程之间如何联系因此Windows内核提供的进程结构和服务是相当简单和通用的,每个OS子系统都允许模拟一个特定的进程结构和功能。Windows进程的重要特点有:◇ Windows进程实现为对象◇一个可执行的进程可以包含一个或多个线程◇进程对象和线程对象都具有内置的同步能力。图4显示了一个过程与其控制或使用的资源关联的方式。每个进程都被分配一个安全访问标志,称为进程的基本标志。当用户第一次登录时,窗口将创建一个包含用户安全标识的访问标志。由用户创建或代表用户运行的每个进程都有一个访问标记的副本。Windows使用此标志,以便用户可以访问受保护的对象或在系统和受保护的对象上执行有限的功能。访问标志控制进程是否可以更改自己的属性。在这种情况下,进程没有自己的访问标志的开放句柄。如果一个进程试图打开这样一个句柄,安全系统将决定是否允许它,也就是说,该进程是否可以更改自己的属性。与进程相关的还有一系列块,这些块定义了当前分配给进程的虚拟地址空。进程不能直接修改这些结构,但必须依赖虚拟存储管理器,它为进程提供内存分配任务。该过程还包括一个对象表,该对象表带有该过程已知的其他对象的句柄。对象中包含的每个线程都有一个句柄。对象句柄是对象标识符。当一个进程按名称创建或打开一个对象时,它接收一个句柄,然后通过该句柄访问该对象。对象句柄实际上是指向句柄表中与进程相关的条目的索引。2.2 Windows进程的组成从最抽象的层面来说,Windows由以下几个方面组成:◇一个私有虚拟地址空 ◇一个可执行程序:定义代码和数据并映射到进程的虚拟地址空 ◇一个打开的句柄列表:指向各种资源。进程的所有线程都可以访问这些系统资源◇一个称为访问令牌的安全环境:标识与进程关联的用户、安全组和特权◇一个称为进程ID ◇至少一个执行线程2.3 Windows进程的关键数据结构Windows进程的数据结构主要有以下几个块:◇ Executive Process Block:执行进程对象的对象体,包括进程ID、父进程ID、程序名、进程优先级、内存管理信息和设备映像。◇内核进程块(Kernel Process Block):内核进程对象的对象体,也称为PCB,包含线程调度所需的信息,如进程状态、线程时间片等。◇过程环境块(PEB):包括用户模式代码需要和修改的信息。◇ WIN32KPROCESS,windows环境子系统的核心状态组件win32k.sys为每个进程建立的进程信息数据结构。windows环境子系统的进程csrss为每个进程建立的进程信息数据结构(在用户模式空之间)。每个窗口进程都由一个对象表示。每个流程都由许多属性定义,并封装了它可以执行的许多行为或服务。一个进程在收到相应的消息后会执行一个服务。调用这种服务的唯一方法是向提供服务的流程对象发送消息。当窗口创建一个进程时,它使用为窗口进程定义的对象类或类型作为模板来生成一个新的对象实例。而在创建对象的时候,属性值是给他们的。以下是流程对象中每个对象属性的简要定义。◇进程ID:为操作系统标记进程的唯一值◇安全描述符:描述对象的创建,可以访问或使用对象且不允许访问对象的用户ID标志◇基本优先级:进程中线程的基准执行优先级◇默认处理器关联:进程中可以运行线程的默认处理器集◇配额限制:分页和非分页系统内存的最大值, 分页文件之间的最大值空, 用户进程可以使用的最大处理器时间◇执行时间:进程中所有线程执行的总时间◇ I/O计数器:记录线程在进程中执行的I/O操作的数量和类型的变量◇ VM操作计数器:记录线程在进程中执行的虚拟内存操作的数量和类型的变量◇异常/调试端口:当进程中的线程抛出异常时, 进程管理器用来发送消息的进程间通信通道退出状态:进程终止的原因一个Windows进程必须包含至少一个执行线程,这可能会创建其他线程。 在Windows操作系统中,进程是资源分配的最小单位,而线程是操作系统调度的最小单位。Windows线程有六种状态,描述如下:① Ready状态:可以调度执行。微内核调度程序跟踪所有就绪的线程,并按优先级顺序对它们进行调度。②待机状态:待机线程已经选择下次在特定处理器上运行。线程在这种状态下等待,直到该处理器可用。如果备用线程的优先级足够高,运行在该处理器上的线程可能会被备用线程抢占。否则,备用线程将等待,直到运行线程被阻塞或结束其时间片。③运行状态:一旦微内核处理线程或进程切换,备用线程将进入运行状态并开始执行,执行过程将持续到被抢占、时间片过期、阻塞或终止。在前两种情况下,它将返回到就绪状态。④等待状态:当一个线程被一个事件阻塞(比如自愿等待同步)或者一个环境子系统指令其挂起自己时,该线程进入等待状态。当等待条件满足时,如果它的所有资源都可用,线程就进入就绪状态。⑤过渡状态:线程在等待后进入这种状态,如果它准备运行但资源不可用。例如,线程的堆栈被换出内存。当资源可用时,线程进入就绪状态。⑥终止状态:一个线程可以自己终止,也可以由另一个线程终止,或者当其父进程终止时终止。一旦清理完成,线程将从系统中移除,或者由执行器保留,以便稍后重新初始化。

Windows进程与Linux进程的比较

Linux和Windows系统的进程结构相当复杂。Linux中只有进程的概念,WIN32中也有“线程”的概念。那么这里Linux和WIN32有什么区别呢?在WIN32中,“进程”是指程序,“线程”是“进程”中的执行“线索”。从核心来说,WIN32多处理器和Linux没有太大区别,WIN32中的线程相当于Linux进程,实际上是在执行代码。但是,在WIN32中,同一进程中的所有线程共享数据段。这是和Linux最大的区别。在WIN32下,CreateThread函数用于创建线程。与在Linux下创建的进程不同,WIN32线程不是从它被创建的地方开始运行的,而是CreateThread指定了一个函数,并且线程从该函数开始运行。在WIN32中,全局变量由子线程和父线程共享,这是和Linux最大的区别。从上面的分析可以看出,Windows的进程/线程比Linux复杂。对于多任务系统,共享数据区是必要的,但也是一个令人困惑的问题。在WIN32下,线程之间的数据是共享的。一个线程修改一个变量后,另一个线程修改它,导致程序问题。但是在Linux下,由于变量不共享,程序员明确指定要共享的数据,使得程序更加清晰和安全。Linux在进程管理和调度方面的开销比Windows小。Linux是单片操作系统,通常运行在用户进程空的内存中,可以避免系统调用时的进程切换开销。Windows是一个准微内核的操作系统,很多功能都是通过单独的进程来实现的,提高了系统的模块化程度,但是在进程切换上的开销更高。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 进程模型是什么

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情