操作系统-进程的描述与控制

第二章 进程的描述与控制

Summary:In the Traditional operating system,in order to improve resource utilization and system throughout,multi-program technology is usually adopted to load multiple programs into memory at the same time and make them run concurrently.In the traditional sense programs can no longer run independently.At this point,this basic unit of resource allocation and independent operation is the process.

*前驱图和程序执行

前驱图,是指有向无循环图(Directed Acyclic Graph),用于描述进程之间执行的先后顺序。例Pi额Pj存在着前驱关系,记为Pi->Pj;程序顺序执行,Ii->Ci->Pi(输入计算打印),顺序性(操作的顺序),封闭性(程序运行时独占全机资源),可再现性(程序执行环境和初始条件相同);程序并发执行,间断性,失去封闭性,不可再现性(存在间接制约或直接制约关系)

 

*进程的描述

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位;系统利用进程控制块PCB描述进程的基本情况和活动过程,进而控制和管理进程,由程序段,相关的数据段和PCB三部分构成了进程实体

进程的特征 动态性(由创建而产生,由调度而执行,由撤销而灭亡),并发性(多个进程同存于内存中),独立性(进程实体是一个能独立运行,独立获得资源和独立接受调度的基本单位),异步性(独立,不可预知的速度推进,配置相应的进程同步机制)

进程的基本状态及转换

就绪状态(进程分配到除CPU意外的所有必要资源),执行状态(进程获得CPU),阻塞状态(I /O请求、申请缓冲区失败);三种基本状态的转换,进程通过进程调度又就绪态到执行态,通过I/O请求由执行态到阻塞态,I/O完成后进入就绪态,当时间片用完时,从执行态过度到就绪态;创建进程,申请空白PCB,为该进程分配运行所需资源,安插于就绪队列中;终止进程,将PCB清零,返还系统

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

I/O速度慢于CPU的运算速度,出现CPU等待I/O的情况,即要将主存中的进程对换至外存;(1)终端用户的需要:修改、检查进程,(2)父进程的需要、协调子进程,(3)对换的需要:缓和内存,(4)符合调节的需要:保证实时任务的执行;挂起(Suspend)和激活(Active)的作用下,进程的就绪,阻塞存在四种状态转变;由于性能,内存,进程总数等原因,系统会限制并发进程总数

进程管理中的数据结构

1.数据结构:内存表,设备表,文件表,用于进程管理的进程表(PCB),即是对资源或进程的标识、描述、状态等信息以及一批指针

2.PCB作用:使一个在多道程序环境下不能独立运行的程序(含数据)成为一个独立运行的基本单位,一个能与其他进程并发执行的进程。Ⅰ.作为独立运行基本单位的标志;Ⅱ.能实现间断性运行方式;Ⅲ.提供进程管理所需要的信息;Ⅳ.提供进程调度所需要的信息;Ⅴ.实现与其它进程的同步与通信

3.PCB信息:进程标识符(父进程子进程用户标识,进程序号),处理机状态(处理机各种寄存器中的内容组成),进程调度信息(进程状态,进程优先级,进程调度算法,事件),进程控制信息(程序数据地址,进程同步通信机制,除CPU外的资源清单,链接指针)

4.PCB组织方式:线性方式(因扫描整张表,适合进程数目不多的系统);链接方式(就绪队列,若干个阻塞队列,空白队列,按优先级从高到低排序);索引方式(根据进程状态的不同,建立的几张索引表)

*进程控制
操作系统内核

保护系统数据,处理机的执行状态分为两种:系统态,即管态,内核态,执行一切指令,访问所有寄存器和存储区;用户态:执行权和访问权有所限制

支撑,中断处理(内核进程的转出),时钟管理(时间片轮转,用完产生中断信号),原语操作(要么全做,要么全不做,多条指令用于完成过程,常驻内存);资源管理,进程管理(调度与分派,创建与撤销),存储器管理(逻辑地址转换为内存空间的物理地址,内存分配与回收);设备管理,驱动,缓冲,设备分配和设备独立性

进程的创建与终止

四类进程创建另一个进程的事件,用户登录(为终端用户创建进程),作业调度(为批处理作业创建进程),提供服务(为用户程序创建进程),应用请求(为使应用进程并发执行创建进程);申请空白PCB->为新进程分配运行所需资源->初始化PCB->插入就绪队列;进程的终止,正常结束,异常结束,外界干预

进程的阻塞与唤醒

请求共享资源失败(无足够资源分配给他,进程不能运行而阻塞),等待某种操作结束完成(I /O操作的完成才将进程唤醒),新数据尚未到达(数据的并发先后顺序),等待新任务到达(完成任务即阻塞,等待新任务);block原语和wakeup原语是一对作用刚好相反的原语,须成对使用

进程的挂起与激活

挂起,suspend()是活动到静止处理的过程,复制此进程的PCB于指定的内存区域,若被挂起的进程正在执行,则转向调度程序重新调度;激活,active()是静止到活动处理的过程,若采用抢占调度策略,当新进程进入就绪队列时,检查是否进行重新调度

*进程同步

进程同步机制的主要任务,是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源;间接制约,竞争独占分配到的部分或全部共享资源,直接制约,协作等待来自其他进程的信息;临界资源,一次只允许一个进程使用的资源,生产者-消费者问题;

//数组单元指针in指向暂存,out指向取走(均初始化为0),buffer为具有n个缓冲区的缓冲池
int in = 0,out = 0,count = 0;
item buffer[n];
//生产者
void producer(){
    while(1){
        produce an item in nextp;
        ...
        //满则不产 
        while(counter==n)
        ;
        buffer[in] = nextp;
        //这里的buffer使被组织成循环缓冲的
        in = (in+1)%n;
        counter++;
    }
};
//消费者
void consumer(){
    while(1){
        //空则不出
        while(counter==0)
        ;
        nextc = buffer[out];
        out = (out+1)%n;
        counter--;
        consumer the item in nextc;
    }
}

临界区,进程中访问临界资源的一段代码;之前加上进入区,之后加上推出区,不属于前面区块的称为剩余区;

同步机制应遵循的规则:空闲让进忙则等待有限等待让权等待(解决共享变量的完整性和正确性,简单、有效,适用于多处理机)

关中断实现互斥的最简单方法之一(不适用于多CPU系统);Test-and-Set,并发进程共享布尔型变量lock,用于表示资源的状态,初始值为false,表示资源可用

bool TS(boll *lock){
    bool old;
    old = *lock;
    //资源正在被使用
    *lock = 1;
    return old;
}
do{
    ...
    while TS(&lock);
    critical section;
    lock = 0;
    remainder section;
}while(1);

Swap指令,每个临界资源设置一个全局布尔型变量lock,初始值为false,每个进程有一个局部布尔型变量key

void swap(bool *a,bool *b){
    bool temp;
    tamp = *a;
    *a = *b;
    *b = temp;
}
do{
    key = 1;
    do{
        swap(&lock,&key);
    }while(key!=0);
    //临界区操作
    lock = 0;
    ...
}while(1);

信号量机制,标识可供并发进程使用的资源实体数或等待使用临界区的进程数;Ⅰ整型信号量,P(wait)V(signal)操作,执行不可中断;Ⅱ记录型信号量,采用记录型的数据结构,当请求资源时,有S -> value--,当释放资源时,有S -> value++;

//包含两个数据项
typedef struct{
    int value;
    struct process_control_block *list;
}semaphore;
//wait(S)
wait(semaphore *S){
    S->value--;
    //资源分配完毕,自我阻塞,放弃处理机
    if(S->value<0)
        block(S->list);
}
//signal(S)
signal(semaphore *S){
    S->value++;
    //唤醒list中第一个等待进程
    if(S->value<=0)
        wakeup(S->list);
}

AND型信号量,两个及两个以上记录型信号量,一次性全部分配给进程,待进程使用完后再一起释放(注意临界资源分配方式可能产生死锁);信号量集,用于同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的处理;wait(mutex)和signal(mutex)成对出现

管程包含,管程的名称,局部于管程的共享数据结构说明,对该数据结构进行操作的一组过程,对局部于管程的共享数据设置初始值的语句;将共享变量以及对共享变量能够进行的所有操作集中在一个模块中

*经典进程的同步问题

Ⅰ.生产者-消费者问题

int in = 0,out = 0;
item buffer[n];
//mutex为1,两进程均未进入临界区;为0一个进入临界区运行,另一个等待;为-1一个正在临界区运行,另一个因等待阻塞在信号量队列中;empty,full表示空/满缓冲区
semaphore mutex = 1,empty = n,full = 0;
void producer(){
    do{
        producer an itemm nextp;
        ...
        wait(empty);
        wait(mutex);
        //Swait(empty,mutex);
        buffer[in]=nextp;
        in=(in+1)%n;
        signal(mutex);
        signal(full);
        //Ssignal(mutex,full);
    }while(1);
}
void consumer(){
    do{
        wait(full);
        wait(mutex);
        //Swait(full,mutex);
        nextc=buffer[out];
        out=(out+1)%n;
        signal(mutex);
        signal(empty);
        //Ssignal(mutex,empty);
        consumer the item in nextc;
        ...
    }while(1);
}
void main(){
    cobegin
        producer(); 
        consumer();
    coend
}

PC管程过程,cwait(condition),csignal(condition)

Monitor prodecerconsumer{
    item buffer[N];
    int in,out;
    condition notfull,notempty;
    int count;
    public:
    void put(item x){
        if(count>=N)
            cwait(notfull);
        buffer[in]=x;
        in=(in+1)%N;
        count++;
        csignal(notempty);
    }
    void get(item x){
        if(count<=0)
            cwait(notempty);
        x=buffer[out];
        out=(out+1)%N;
        count--;
        csignal(notfull);
    }
    {
        in = 0;out = 0;count = 0;
    }
}

Ⅱ.哲学家进餐问题

//五个信号量构成信号量数组,均被初始化为1
semaphore chopstick[5] = {11111};
do{
    //保证左边和右边执行完成
    wait(chopstick[i]);
    wait(chopstick[(i+1)%5]);
    //Swait(chopstick[(i+1)%5],chopstick[i]);
    ...
    //eat
    ...
    
    signal(chopstick[i]);
    signal(chopstick[(i+1)%5]);
    //Ssignal(chopstick[(i+1)%5],chopstick[i]);
    ...
    //think
    ...
}

Ⅲ.读者-写者问题

//wmutex因读写互斥而产生,rmutex因临界资源readcount可被多个Reader进程访问
semaphore 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(1);
}
void Writer(){
    do{
        wait(wmutex);
        perform write operation;
        signal(wmutex);
    }while(1);
}
void main(){
    cobegin()
        Reader();
        Writer();
    coend
}
*进程通信

进程间的信息交换 共享存储器系统,基于数据结构(低级通信),存储区(高级通信);管道通信系统(互斥,同步,确定对方是否存在);消息传递系统(直接通信方式,间接通信方式);客户机-服务器系统(套接字,远程过程调用和远程方法调用)

*线程

1.进程是系统资源分配的单位,线程是处理器调度的单位;

2.线程表示进程的一个控制点,可以执行一系列的指令。通常,和应哟个程序的一个函数相对应

3.进程分解为线程还可以有效利用多处理器和多核计算机

本章习题小结:

2.5 在操作系统中为什么要引入进程的概念?它会产生什么样的影响?

为了使程序在多道程序环境下能并发执行,并对并发执行的程序加以控制和描述,使程序的并发执行得以实行。

2.7 试说明PCB的作用具体表现在哪几个方面?为什么说PCB使进程存在的唯一标志?

PCB使进程实体的一部分,是操作系统中最重要的记录型数据结构。作用是使一个在多道程序环境下不能独立运行的程序,成为一个能独立运行的基本单位,成为能与其他进程并发执行的进程。OS使根据PCB对并发执行的进程进行控制和管理的。

2.16 在创建 一个进程时所要完成的主要工作是什么? Ⅰ.OS发现请求创建新进程事件后,调用进程创建原语Create();

Ⅱ.申请空白PCB;

Ⅲ.为新进程分配资源;

Ⅳ.初始化进程控制块;

Ⅴ.将新进程插入就绪队列。

2.17 在撤销一个进程时所要完成的住哟啊工作是什么?

Ⅰ.根据被终止进程标识符,从PCB集中检索出进程PCB,读出该进程状态;

Ⅱ.若被终止进程处于执行状态,立即终止该进程的执行,置调度标志真,指示该进程被终止后重新调度;

Ⅲ.若该进程还有子进程,应将所有子孙进程终止,以防止它们成为不可控进程;

Ⅳ.将被终止进程拥有的全部资源,归还给父进程,或归还给系统;

Ⅴ.将被终止进程PCB从所在队列或列表中移出,等待其它程序搜集信息。

2.19 为什么要在OS中引入线程?

在操作系统中引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性,提高CPU的利用率。。进程是分配资源的基本单位,而线程则是系统调度的基本单位。

原文地址:https://www.cnblogs.com/SHNLQS-1273196803/p/11026053.html