操作系统原理与实践(邹鹏)--第二章知识点(上)

本文详细阐述了进程的概念、特性、状态转换,以及进程与线程的区别,强调了进程控制、同步与互斥的重要性,包括信号量在进程间通信中的应用,如生产者消费者问题和理发师问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,进程

(一),进程概念

1,进程的意义

        为提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术,使多个程序同时在系统中存在并运行,在多道程序系统中,各个程序之间并发执行(并发:两个或多个事件在同一时间间隔内发生),共享系统资源,CPU需要在各个运行程序之间来回切换,采用进程便于,描述这些多道的并发活动,进程是一个正在执行的程序

2,进程组成

进程分为用户进程和系统进程

一个进程包括:

        ·程序的代码

        ·程序的数据

        ·PC中的值,用来指示下一条将运行的指令

        ·一组通用的寄存器的当前值,堆,栈

        ·一组系统资源

#进程 != 程序:程序是静态文本,描述语句;进程是正在执行的程序(动态),含有上下文信息

#一个程序可以对应多个进程,一个进程只能对应一个程序(即一个进程只能执行一个程序)

3,进程概念

        进程是具有一定功能的程序在一个数据集合上的运行过程,它是系统进行资源分配和调度管理的一个可并发执行的基本单位

        ·进程是程序的一次执行

        ·进程是可以与其他计算并发执行的计算

        ·进程是一个程序及其数据在处理器上顺序执行时发生的活动

        ·进程是进程实体的一次活动

        ·进程是支持程序运行的机制

(二),进程特性

1,动态性

        进程的实质是程序一次执行过程,是动态产生,动态消亡的,进程在其生命周期内,在三种基本状态之间转换

2,并发性

        任何进程都可以同其他进程一起向前推进

3,独立性

        进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位

4,异步性

        由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的,不可预知的速度向前推进

5,结构特性

        为控制和管理进程,系统为每个进程设立了一个进程控制块——PCB,系统中运行的实体通常由程序,数据和一个PCB三部分组成

(三),进程状态和转换

        ·就绪(Ready)状态:进程一旦获得CPU就可以投入运行的状态

        ·执行(Running)状态:进程获得CPU正在执行的状态

        ·阻塞(Blocked)状态:进程由于等待资源或者某个事件的发生而暂停执行的状态

     

(四),进程的组成

 1,程序

2,数据

3,进程控制块(PCB)

        ·一个进程只有一个PCB

        ·PCB是进程存在与否的唯一标记

PCB中的基本信息有:描述信息和管理信息

        ·进程状态标识信息

        ·进程状态

        ·进程特征

        ·进程位置及大小信息

        ·处理器现场保留区

        ·进程资源清单

        ·进程同步与通信机制

        ·进程间联系

(五),进程队列

1,线性方式

2,链接方式

3,索引方式

(六),进程控制

1,进程控制的主要任务

        控制系统中所有进程从产生,存在,到消亡的全过程,进程控制一般由操作系统内核来实现,内核在执行操作时,是通过原语(操作系统内核中用于完成特定功能的一个过程,此过程在执行过程中呈原子特征,不可中断)来进行的

2,进程控制原语

        ·进程创建原语

        ·进程撤销原语

        ·阻塞原语

        ·唤醒原语

(1),进程创建的主要过程

        a,创建一个PCB

        b,赋予一个统一的进程标识符

        c,为进程映像分配空间

        d,初始化进程控制块(许多默认值,如:状态为new,无I/O设备或文件等)

        e,设置相应链接(如:把新进程加到就绪队列的链表中)

创建原语的实现过程

 (2),引起撤销的原因

        ·正常结束

        ·异常结束(越界错,保护错,特权指令错,非法指令,运行超时,I/O故障等)

        ·外界干预(操作员干预,死锁,父进程请子进程终止)

撤销原语的实现过程

(3),进程阻塞原语

        ·停止调用进程的执行变为等待

        ·入口信息:可省

阻塞原语的实现过程

 (4),进程唤醒原语

        ·功能:唤醒某一处于等待队列当中的进程

        ·入口信息:被唤醒进程的名字

        ·引起唤醒的原因:系统服务得不到满足,I/O完成,新数据到达,进程提出新请求(服务)

唤醒原语的实现过程

二,线程

(一),线程引入

1,进程的两个基本属性

        ·资源的拥有者:给每个进程分配一虚拟地址空间,保存进程映像,控制一些资源(文件,I/O设备),有状态,优先级,调度

        ·调度单位:进程是一个执行轨迹

2,对进程系统必须完成的操作

        ·创建进程

        ·撤销进程

        ·进程切换

3,线程概念

由于进程时间空间开销大,限制并发度的提高,引入线程

        ·线程是进程中实施调度和分派的基本单位

        ·线程优势:响应度高,资源共享,经济,效能高

4,线程状态

        ·运行状态

        ·阻塞状态

        ·就绪状态

        ·终止状态

5,线程管理

        ·线程创建

        ·线程终止

        ·线程等待

        ·线程让权

6,线程和进程的关系

        ·一个进程对应多个线程活动;一个线程只能在一个进程的地址空间内活动

        ·资源分配给进程;同一进程的线程共享资源

        ·CPU分配给线程

        ·线程在执行过程中需要协作同步;不同进程则利用通信实现同步

7,线程的实现

        ·用户级线程与核心级线程

        ·用户级线程与核心级线程的比较

8,线程池 

        ·定义:将多个线程放在一个池中

        ·优势:服务更快,限定了线程的数量

        ·设计原则:CPU数量,物理内存容量,并发用户数量

三,同步

(一),进程同步和进程间通信

1,进程间相互关系

        ·同步:同步是指一组相互协同的进程,在完成同一任务,对某些共享资源进行操作时,为协调资源占用而相互等待,相互交换信息所产生的制约关系

        ·互斥:互斥是指并发进程间因相互竞争使用独占资源所产生的制约关系

        ·通信:进程间交换信息称为通信

2,临界资源与临界区

        ·临界资源:一次只能允许一个进程使用的资源

        ·临界区:每个进程中访问或者使用临界资源的代码称为临界区

        ·进程的通用结构:

                Repeat

                entry section        进入区

                critical section        临界区

                exit section          退出区

                remainder section        剩余区

3,使用临界区的规则

        ·空闲让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入

        ·忙则等待:不允许两个以上的进程同时进入互斥区

        ·有限等待:任何进入互斥区的要求应该在有限时间内得到满足

        ·让权等待:处于等待状态的进程应放弃占用CPU,以使其他进程有机会得到CPU的使用权

(二),互斥的实现方式

解决进程互斥进入临界区有两种方式:

        ·硬件解决方式:禁止中断,专用机器指令

        ·软件算法实现:进入区,退出区,剩余区

四,信号量

(一),整型信号量

1,性质

(1),信号量可以初始为一个非负值

(2),只能由P和V操作来访问信号量

        ·P操作:测试;DOWN操作

        ·V操作:增加;UP操作

        ·P(S):  while S<= 0 do no-op;

                    S:= S-1;

        ·V(S):S:= S+1;

        ·进程Pi利用信号量实现伪代码形式:信号量为mutex,并初始化为1

        do{

                P(mutex)

                临界区(Critical Section)

                V(mutex)

                剩余区(remainder sdction)

}while(1);          

(二),记录型信号量

为解决忙等待问题引入记录型信号量

1,定义

由两个成员组成的数据结构,其中一个成员是整型变量,表示该信号量的值;另一个是指向PCB的指针。当多个进程都要等待同一信号量时,它们就排成一个队列,由信号量的指针项指示该队列的队首,进程控制块PCB是通过PCB自身所包含的指针项进行链接的,最后一个PCB(队尾)的链接指针为0。

2,使用

信号量被描述为一个记录(或者结构)

记录型信号量值和相应资源有关

        ·大于0:表示当前可用资源数量

        ·小于0:绝对值表示等待进程个数

        ·P(S)操作

Void P(S){

S.value --;

if(S.value <0){

将这个进程加到S.list队列;

block();

}

}

        ·V(S)操作

Void V(S){

S.value ++;

if(S.value <= 0)

从S.list队列中将Q移走;

wakeup(Q);

}

}

(三),信号量的应用

1,用信号量实现进程的互斥

        ·设置一个互斥信号量mutex,其初值为1。P1(分配进程)和P0(释放进程)的临界区代码可描述为:

2,用信号量实现进程间同步

例:短信缓冲池的同步使用

规定S1和S2的初值分别为1和0,对缓冲池的供者进程和取者进程的同步关系用下述方式实现:

3,信号量还可以描述程序或语句之前的前驱关系

Var a, b, c, d, e, f, g:  semaphore: = 0, 0, 0, 0, 0, 0, 0, 0

begin

parbegin

begin S1; V(a);  V(b); end;

begin P(a); S2; V(c); V(d); end;

begin P(b); S3; V(e); end;

begin P(c); S4; V(f); end;

begin P(d); S5;V(g); end;

begin P(e); P(f); P(g); S6; end;

parend

end

(四),经典同步问题

1,生产者消费者问题

描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息

        ·同步

        ·互斥

        ·问题限制

缓冲池中有n个缓冲区,每个缓冲区存放一个消息,可利用互斥信号量mutex使各进程对缓冲池实现互斥访问;利用empty 和full 两个计数信号量分别表示空缓冲及满缓冲的数量。又假定这些生产者和消费者相互等效,只要缓冲池未满,生产者可以将消息送入缓冲池;只要缓冲池未空,消费者可以从缓冲池取走一个消息。

        ·生产者进程(Producer)

                while(true){

                        P(empty);

                        P(mutex);             

                产品放入缓冲区buffer(in);

                 in = (in +1)mod N;  #以N为模

                        V(mutex);

                        V(full);

}

消费者进程(Consumer)

        while(true){

                P(full);

                P(mutex);

        缓冲区取出一产品buffer(out);

                out = (out+1) mod N; #以N为模

                        V(mutex);

                        V(empty);

}

注意:1,每个进程先执行P操作,后执行V操作

            2,同步信号量的PV操作要成对出现;应该在不同的进程中;

            3,两个进程的P操作次序不能颠倒

2,读者写者问题

        ·两组并发线程:读者和写者共享一组数据区

        ·要求:可以有多个读者同时进行读操作,读者写者操作不能同时进行,不允许多个写者同时操作。

        ·分析:如果读者来:

                (1)无读者,写者,新读者读

                (2)有写者等,其他读者读,新读者也可以读

                (3)有写者写,新读者等

                    如果写者来:

                (1)无读者,新写者写

                (2)有读者,新写者等·

                (3)有其他写者,新写者等

int readcount = 0 #读者计数器,整型变量,初值为0
int rmutex = 1 #读互斥信号量,用于进程互斥访问readcount,初值为1
int wmutex = 1 #写互斥信号量,用于保证一个写者与其他用户互斥地访问共享资源,初值为1

#读者
while(true){
    P(rmutex)
    readcount++;
    if readcount == 1:
        P(wmutex)
    V(rmutex)
    P(rmutex) #读
        readcount --;
        if  readcount == 0:
            V(wmutex)
        V(rmutex)
}
#写者
while(true){
    P(wmutex)
    V(wmutex) #写
}

  3,理发师问题

问题描述:理发店里有一位理发师,N张椅子,无顾客时理发师在椅子上休息,顾客来到理发店时,需要叫醒理发师,理发师在理发时顾客到店则在椅子上休息,若椅子不足,则顾客离开

int waiting = 0 #记录等候理发的顾客数,初值为0
int customers = 0 #记录等候理发的顾客数(不包括正在理发店顾客),并用作阻塞理发师进程,#初值为0
int barbers = 0 #记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0
int mutex = 1 #用于互斥,初值为1

Procedure barber{
    while(true) #理完一人,是否还有顾客
    P(customers) #若无顾客理发师休息
    P(mutex) #进程互斥
    waiting = waiting-1 #等候顾客数少一个
    V(barbers) #理发师去为一个顾客理发
    V(mutex) #退出临界区
    cut_hair #正在理发
}

Procedure customer{
    P(mutex) #进程互斥
    if(waiting<chairs){
        waiting = waiting +1 #等待顾客数加一
        V(customers) #必要的话唤醒理发师
        V(mutex) #退出临界区
        P(barbers) #无理发师,顾客坐椅子等待
        get_haircut() #顾客理发
}else
V(mutex)#无椅子顾客离开
}

     (五),信号量,P,V原语小结

对信号量和P,V原语的使用,可以归纳为三种情形:

1,把信号量视为一个加锁标志位,其目的是为了实现对某个唯一的共享数据的互斥访问,如数据库中的某个记录,各个进程间的某个共享变量。该共享数据的取值与信号量本身的取值并没有什么直接关系,信号量的作用仅仅是作为一个加锁标志位,其特征是信号量的初始值为1,然后在一个进程内部对它进行配对的P,V操       

                P(mutex); // mutex的初始值为1

                访问该共享数据

                V(mutex);

                 非临界区

2,把信号量视为是某种类型的共享资源的剩余个数,其目的是为了实现对这种类型的共享资源的访问,如各种I/O设备。信号量的取值具有实际的意义,就等于空闲资源的个数,多个进程可以同时使用这种类型的资源,直到所有空闲资源均已用完。其特征是信号量的初始值为N(N>1),然后在一个进程内部对它进行配对的PV操作

                P(resource) //resource初始值为1

                使用资源

                V(resource)

                非临界区

3,把信号量作为进程间同步的工具,利用它来设定两个进程在运行时的先后顺序,比如说,它可以是某个共享资源的当前个数,但是由一个进程负责生成该资源,而另一个进程负责消费该资源,由此引发了两个进程之间的先后顺序。其特征是信号量的初始值为N,(N>0),然后在一个进程里面对它使用V原语,减少资源个数,从而实现两个进程之间的同步关系。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值