操作系统-进程和线程介绍、死锁处理

操作系统中的进程和线程
死锁与死锁处理

进程和线程

进程

创建进程

进程执行过程中通过进程创建系统调用创建新进程,每个进程有唯一进程标识符pid,通常是一个整数值;Windows中使用CreateProcess()与
fock()中父进程生成子进程类似;

    然而父进程创建子进程两种执行可能:父进程与子进程并发执行;父进程等待,直到某个或者全部子进程结束;
    新进程的地址空间也有两种可能:子进程是父进程的复制品(相同的程序和数据);子进程装入另一个新程序;

    为了说明这些不同实现,看一下Unix系统,在Unix中,每个进程都用一个唯一的整数形式的进程标识符来标识,通过fork()系统调用
    可创建新进程,新进程赋值原来进程的地址空间而成。这种机制允许父子进程方便通信。两个进程都继续执行位于系统调用fork()之后
    的指令,但是有一点不同,子进程系统调用fork()返回值0,而父进程则返回值为子进程的标识符(非零);
    通常,在系统调用fork()之后,一个进程会使用系统调用exec(),以用新程序来取代进程的内存空间,系统调用exec()将二进制文件装
    入内存(消除了原来包含系统调用exec()的程序的内存映射),并开始执行,采用这种方式,两个进程能互相通信,并按各自的方法执行。
    父进程能创建更多的子进程,或者如果在子进程运行时没什么可做,那么它采用系统调用wait()把自己移出就绪队列来等待子进程的终止;

进程状态

新的:进程正在被创建
运行:指令正在被执行
等待:进程等待某个事件的发生(如i/o完成或收到信号)
就绪:进程等待分配处理器、终止:进程完成执行

进程状态转换图:
操作系统-进程和线程介绍、死锁处理_第1张图片
从左到右,新的-终止,中间就绪和运行,然而就绪和运行存在等待,几个状态互相转化;

进程控制块PCB

能感知进程的存在,是进程存在的唯一标识,包含许多与一个特定进程的相关信息,如进程状态,进程编号,程序计数器,CPU寄存器,内存界限,
CPU调度信息,内存管理信息等;

程序计数器:进程要执行的下个指令的地址;

CPU寄存器:根据计算机体系结构的不同,寄存器数量和类型也不同,它们包括累加器,索引寄存器,堆栈指针,通用寄存器和其他条件码信息
寄存器,与程序计数器一起,这些状态信息在出现中断时也需要保存,以便进程以后能正确的继续执行;

CPU调度信息:这类信息包括进程优先级、调度队列的指针和其他调度参数;内存管理信息,根据操作系统使用的内存系统,这类信息包括基址
和界限寄存器的值、页表和段表;

记账信息:这类信息包括CPU时间,实际使用时间、时间界限、记账数据、作业或进程数量等;i/o状态信息,这些信息包括分配给进程的i/o设备
列表,打开的文件列表等;
简言之,PCB简单的作为这些信息的仓库,在不同进程间,信息不同;

进程调度

进程进入系统,会被加到作业队列中,该队列包括系统中所有进程,队列使用链表实现,头结点指向链表的第一个和最后一个PCB的指针,每个
PCB包括一个指向就绪队列的下一个PCB指针域;

线程

线程是CPU使用的基本单元,由线程ID、程序计数器、寄存器集合和栈组成,属于同一个进程的其他线程共享代码段、数据段、和其他操作系统资源;
多线程编程优点:响应度高、资源共享、经济(内存和资源分配)、多处理器体系结构的利用;

区别

进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。
所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。

线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和
转换只需要较小的系统开销。

死锁的发生与处理

死锁条件

四种条件同时满足则发生死锁:
    正常情况下,进程只能 申请-使用-释放 来使用资源,死锁的必要条件:
    1、互斥:至少有一个资源出于非共享模式,即一次只有一个进程使用,如果一个进程想要申请该资源,则需要等到该资源被释放; 
    2、占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,且该资源为其他进程占有; 
    3、非抢占:资源不能被抢占,资源只能在进程完成任务后自动释放; 
    4、循环等待:一组等待进程,前一个进程等待的资源被后一个占有,然后最后一个进程等待的资源被第一个占有;
    这四个条件同时满足,则死锁,

死锁处理

三种:
1、使用协议预防或避免死锁,确保系统不会进入死锁状态;
2、允许系统进入死锁状态,然后检测死锁,并加以恢复;
3、忽视这个问题,认为死锁不可能在系统里发生;

死锁预防或者死锁避免:确保死锁的必要条件不全部成立;

对于互斥来说:非共享资源,必须要有互斥条件,共享资源不要求互斥访问;

对于占有占有等待来说:当一个进程申请一个资源时,它不能占有其他资源,一种可以使用的协议就是每个进程在执行前申请并获得所有资源,可以实现
要求申请资源的系统调用在所有其他系统调用之前进行;另一种协议就是允许进程在没有资源时才可以申请资源,也就是他可以使用资源并再申请,但是
需要等他先把自己本来的资源释放才能申请;

对于非抢占:为了保证这条不成立,那么可以使用这样的协议:如果一个进程占有资源并申请另一个不能立即分配的资源,那么其现在已分配的资源都可
以被抢占,只有当进程获得其原有资源和所申请的资源时,进程才能重新执行;换句话说,如果一个进程申请一些资源,那么先检查资源是否可用,可用
就分配,如果不可用,那么就检查这些资源是否已经分配给其他等待额外资源的进程,如果是,那么就抢占;

对于循环等待:要保证系统不出现循环等待,可以对所有资源类型进行完全排序,然后要求每个进程按照递增顺序来申请资源。就是比较资源的先后顺
序,每个进程按照递增顺序申请资源,如果需要同一资源的到某个实例,那么必须一起申请,然后想要申请低等级资源,那么先释放所有比该等级高的资
源;

总结

网上关于操作系统进程线程死锁这一块的说法大同小异,上述笔记来源于学校(SDU)使用教材
【OPERATING SYSTEM CONCEPTS(Seventh Edition)郑扣根 译】。另一文讲述关于操作系统的进程调度(CPU调度算法)。

你可能感兴趣的:(操作系统)