进程的概念和控制

上一篇博客提到因为程序需要并发执行,所以引入了进程的概念。这一篇则介绍进程的相关知识。

1.程序执行

       (1)程序的顺序执行

              一个应用程序是由若干个程序段组成的,它们在执行时是按照一定的先后顺序执行的,也就是说它们的执行顺序可以由一个前趋图(有向无环图)表示出来。例如,在进行计算前,首先运行输入程序;接着运行计算程序;最后运行打印程序,打印计算结果。我们用结点代表各个程序段的操作,I代表输入程序段,C代表计算程序段,P代表打印程序段。则执行过程可用以下前趋图表示:

              程序在顺序执行时的特征:顺序性、封闭性、可在现性。

       (2)程序的并发执行

              只有在不存在前趋关系的程序之间才有可能并发执行。就以上例进行并发执行操作如下图。

              从图可知,I(n),C(n),P(n)存在着前趋关系,I(n),I(n+1);C(n),C(n+1);P(n),P(n+1)存在三组前趋关系。而P(i-1),C(i),I(i+1)不存在前趋关系,可以并发执行。

              程序并发执行的特征:间断性、失去封闭性、不可再现性。

2.进程的概念

       (1)进程的定义和特征

              为了使每个进程能够独立运行,必须配置一个专门的数据结构,称为进程控制块(PCB),系统通过PCB来描述进程的基本情况和活动状况,进而控制和管理进程。将程序段、相关的数据段和PCB三部分构成了进程实体(又称进程映像),简称为进程。进程是程序的一次执行;一个程序及其数据在处理机上顺序执行时所发生的活动;具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程由创建而产生,由调度而执行,由撤销而消亡。

进程的特点:动态性、并发性、独立性、异步性。

       (2)进程的状态及转换:

              三状态由下图所示:

         

              挂起操作和进程状态的转换:

       (3)进程管理中的数据结构:

              资源(进程)信息表:资源或进程的标识、描述、状态等信息以及一批指针。通过指针,可以将同类的进程或资源的信息表链接成不同的队列,便于操作系统的查找。

              OS管理这些数据结构一般分为四类:内存表、设备表、文件表和进程表,进程表又称为PCB

              PCB的作用是:

              ①作为独立运行基本单位的标志。

              ②能够实现间断性运行方式

              ③提供进程管理所需的信息

              ④提供进程调度所需的信息

              ⑤实现与其它进程的同步与通信

              进程控制块的信息:进程标识符、处理机状态、进程调度信息、进程控制信息

              进程控制块的组织方式:线性方式、链接方式、索引方式

3.进程控制

       进程的层次:在OS中,允许一个进程创建另外一个进程,原进程称为父进程,被创建的进程称为子进程。在Windows中不存在任何进程层次,在一个进程创建另一个进程时会获得一个句柄,可以用来控制被创建进程。进程图可以表示为一颗有向树。

       引起进程创建的事件:用户登录、作业调度、提供服务、应用请求。

       进程的创建:申请空白PCB、为新进程分配其运行的资源、初始化PCB、就绪队列未满则插入到就绪队列中。

       进程的终止:正常结束,表示进程的任务完成,准备退出运行。异常结束,进程发生某种异常事件,使程序无法运行。外界干预,是指进程应外界的要求而终止运行。它的过程是OS调用进程终止原语完成的,首先根据被终止进程的标识符,从PCB集合中检索出该进程PCB,读出进程的状态;如果被终止进程处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新调度;若进程还有子孙进程还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程;将被终止进程拥有的资源归还给父进程或者系统;PCB从所在队列中移除,等待其他程序来搜集信息。

4.进程同步

       概念:主要任务是使并发执行的进程之间按照一定的规则共享系统资源,从而使程序的执行具有可在现性。

              两种形式的制约:间接相互制约关系、直接相互制约关系。

              临界资源:许多硬件资源如打印机、磁带机等,进程之间应采用互斥方式,实现共享。引入一个著名的进程同步问题————生产者-消费者问题。

              临界区:每个进程访问临界资源的那段代码称为临界区。

              同步机制应该遵循的原则:空闲让进、忙则等待、有限等待、让权等待。

       硬件同步机制:关中断、利用Test-and-Set指令实现互斥、利用Swap指令实现互斥

       信号量机制:整型信号量、记录型信号量、AND信号量

              整型信号量:定义了一个表示资源数目的整形量S,仅能通过两个原子操作才能改变其值这两个操作称为P、V操作。

              记录型信号量:因为整型信号量机制中wait()未遵循“让权等待”,使进程“忙等”。记录型信号量机制则是一种不存在“忙等”的进程同步机制,但会出现多个进程等待一个资源的情况,为此需要增加一个链表指针list,用于链接等待进程。

       管程机制:由于信号量机制要求每个进程必须自备wait(S)、signal(S)(就是PV操作),使得大量的同步操作分散在各个进程中,而且容易因为同步操作不当造成死锁现象,因此便出现了新的进程同步工具——管程。

              管程由四部分组成:管程名称、局部于管程的共享数据结构说明、对该数据结构进行操作的一组过程、对局部于管程的共享数据设置初始值的语句。

              进程对对共享资源的申请、释放和其他操作必须通过这组过程,间接的对共享数据结构实现操作,对请求访问共享资源的并发进程,可以根据资源情况接受或阻塞,确保每次仅有一个进程进入管程,达到对共享资源访问的统一管理。

              管程和进程的不同:

              (1)虽然都定义了数据结构,但进程定义的使私有数据结构PCB,管程定义的使公共数据结构。

              (2)进程是由顺序程序执行有关操作,管程主要是进行同步操作和初始化操作。

              (3)进程的目的在于实现系统的并发性,管程的目的是解决共享资源的互斥使用问题。

              (4)进程是通过调用管程中的过程实现对共享数据结构的操作,管程是被动工作方式,进程是主动工作方式。

              (5)进程之间可以并发执行,而管程不能与其调用者并发执行

              (6)进程具有动态性,由创建而诞生,有撤销而消亡;管程则是OS中的一个资源管理模块,供进程调用。

5.经典同步问题:

       生产者消费者问题:

              利用记录型信号量解决该问题,假设生产者和消费者之间的公用缓冲池有n个缓冲区,可利用互斥信号量mutex实现对缓冲池的互斥访问;利用empty和full表示缓冲池中空缓冲区和满缓冲区的个数。

int in=0,out=0;
int buffer[n];    //此处n理解为一个常量
int mutex=1,empty=n,full=0;
void product(){
  do{
    producer an item nextp;
    ...
    wait(empty);
    wait(mutex);
    buffer[in]=nextp;
    in=(in+1)%n;
    signal(mutex);
    signal(full);
  }while(True);
}

void consumer(){
do{
    wait(full);
    wait(mutex);
    nextc=buffer[out];
    out=(out+1)%n;
    signal(mutex);
    signal(empty);
    consumer the item in nextc;
    ...
  }while(True);
}
void main(){
  cobegin
  producer();consumer();
  coend
}

              在程序中的wait操作不能颠倒,先执行对资源信号量的wait操作,再执行对互斥信号量的wait操作,否则会出现死锁。

       哲学家进餐问题:

              该问题描述有五位进餐的哲学家共用一个圆桌,在桌子上有五只筷子,他们的生活方式是交替进行思考和进餐,饥饿的时候试图拿起自己左右两边的筷子进餐,金蚕完毕后,放下筷子继续思考。

              利用记录型信号量进行解决问题,可以设置一个信号量数组,表示筷子资源:chapstick[5]=[1,1,1,1,1],然后对chapstick[i]和chapstick[i+1]进行P操作保证是相邻的两只筷子,用完之后,依次进行V操作。但这样会出现死锁情况,例如每一个哲学家都是拿起来了左手边的筷子,则会死锁。以下提供几种解决死锁的办法。

              (1)最多允许四位哲学家同时拿起左边的筷子,则能保证最后一位哲学家可以满足互斥条件。

              (2)仅当哲学家左右两只筷子均可用时,才允许拿起筷子。

              (3)规定奇数哲学家先拿左边筷子,然后那右边的筷子,偶数哲学家则相反,即五位哲学家先争夺奇数号筷子,抢到之后再去竞争偶数号筷子,最后总有一位哲学家能获得两只筷子。

       读者-写者问题

              读文件的进程称为“Reader进程”,其他进程则为“Writer进程”。允许多个进程同时读取一个共享对象,但不允许Writer进程和其他Reader进程或Writer进程同时访问共享对象

              Reader进程和Writer进程可以设置一个互斥信号量wmutex,另外设置一个读进程数量变量readcount,又应为Reader进程在对readcount进行操作时,需要同步处理,则为它设置了一个互斥信号量rmutex.

int rmutex=1,wmutex=1;
int readcount=0;
void reader(){
  do{
    wait(rmutex);
    if(readcount==0)     //无论有多少读进程,保证只上一次锁
      wait(wmutex);
    readcount++;
    signal(rmutex);
    ...
    perform read operation;
    ...
    wait(rmutex);
    readcount--;
    if(readcount==0)
      signal(wmutex);      //无论有多少读进程,保证只解一次锁
    signal(rmutex);
  }while(True);
}

void writer(){
  do{
    wait(wmutex);
    perform write operation;
    signal(wmutex);
  }while(True);
}
void main(){
  conegin
  reader();
  writer();
  coend
}

6.线程的概念

       为了进一步提高程序的并发执行的程度,人们提出了比进程更小的基本单位——线程(Threads)。开始线程之前先回顾一下进程的两个基本属性:进程是一个可拥有资源的独立单位;进程同时也是一个可独立调度和分派的基本单位。程序在并发过程中包括创建进程、撤销进程、进程切换付出了较大的时空开销。者限制了系统中所设置的进程数目,而且进程切换也不应该太过频繁。所有将线程作为调度和分派的基本单位则会减少进程的切换次数。

       线程也称为轻量级进程,当进程被调度时,需要进行上下文切换,而线程切换只需保存和设置少量寄存器内容,代价远低于进程,在同一进程中,线程切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程的线程时,会发生进程切换。

       在引入线程的操作系统中,不仅进程之间可以并发执行,同一进程的线程之间也可以并发执行,具有更好的并发性,有效的提高系统资源的利用率和系统的吞吐量。

       进程拥有资源,而线程本身不拥有资源,而是仅有一点必不可少,能保证独立运行的资源。多个线程可以共享该进程拥有的资源。

       同一进程之间的线程的独立性要比不同进程之间的独立性低。这是因为进程之间拥有独立的地址空间和其他资源,但同一进程的线程为了提高并发性往往相互之间合作而创建,它们共享进程的内存地址和资源。

       在创建和撤销进程时,系统都要为之分配和回收PCB、其他资源。明显大于线程的开销。

       支持多处理机系统,之前对于传统的进程,无论有多少处理机,一个进程只能在一个处理机运行,但对于多线程进程,可以将线程分配到不同的处理机上,使它们并发执行。

7.线程的实现方式

       内核支持线程:内核支持线程是在内核支持下运行的,它的创建、阻塞、撤销和切换等都是在内核中完成的,在内核空间为每一个内核线程设置了一个线程控制块。

              优点:

              (1)在多处理器系统中,内核能够同时调度同一进程的多个线程并行执行。

              (2)如进程的一个线程阻塞了,内核可以调度该进程的其他线程占有处理机运行,也可运行其他进程的线程。

              (3)线程切换较快,开销小。

              (4)内核本身也采用多线程技术,可以提高执行速度和效率。

       用户级线程:是在用户空间下实现的,对线程的操作无需内核的支持。设置了用户级线程的系统,其调度仍是以进程为单位进行的,采用轮转调度算法时,各进程轮转执行一个时间片。

              优点:

              (1)线程切换不需要转换到内核空间。

              (2)调度算法可以是进程专用的。

              (3)用户级线程的实现与OS平台无关,因为线程管理的代码属于用户程序。

              缺点:

              (1)系统调用阻塞问题。在基于进程机制的OS中,大多数系统调用都会使进程阻塞,所有当一个线程执行系统调用时,不仅该线程被阻塞,进程内所有的线程都会被阻塞。而内核支持线程方式中,其他进程仍然可以运行。

              (2)在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理,因为内核只会为一个进程分配一个CPU,只能有一个线程执行,其他等待。

       组合方式:将两种方式结合起来,在组合方式中,内核支持多个内核支持线程的建立、调度、管理,同时,也允许用户应用程序建立、调度、管理用户级线程。形成了三种模型:多对一、一对一、多对多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值