操作系统第二章进程管理内容概述以及总结,包括进程控制,管程,进程通信,线程等

本文深入解析进程的基本概念,包括进程的定义、特征、状态转换,以及进程控制、同步、通信和线程的基础知识。探讨了进程控制原语,如创建、终止、阻塞和唤醒,以及信号量和管程在进程同步中的应用。

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

一,进程基本概念

1.原因:        因为程序的并发执行的特征,引入了进程的概念。

2.首先程序有两种执行方式:顺序执行   并发执行

顺序执行时的特征:

顺序性:处理机的操作严格按照程序所规定的顺序执行

封闭性:   程序运行时占用处理机的全部资源,只有该程序才能改变本机的资源状态

可在现性:只要改程序的初始条件相同并且所处的环境不变,不管该程序重复执行多少次,最后的结果是相同的

并发执行时的特征:

间断性:由于程序并发的原因,A程序可能会受到B程序的影响

失去封闭性:系统的资源不再是只供一个程序使用,而是多个程序共享资源

不可再现性:由于程序在执行过程中会受到其他程序的影响,所以结果会受到一定的影响

进程定义:就是为了解决程序并发执行时的不可再现性引入了进程的概念,并且对并发的程序加以描述和控制

特征:

结构特征:PCB  数据块  程序块

动态性, 并发性, 独立性, 异步性

进程是进程实体的运行过程,是系统进行资源分配和调度的一个基本单位 

三种基本状态:就绪   执行  阻塞

就绪----调度----->执行    执行----时间片完------>就绪

执行-----I/O请求------>阻塞    阻塞---事件完成------->就绪

还有  挂起   激活   创建    终止

进程控制块(PCB):

其实就是一个数据结构,是进程实体的一部分。

内容:记录了OS所需要的,用于描述进程当前情况以及控制进程运行的全部信息

作用:让一个进程与其他进程并发运行

信息:进程标识符,处理及状态,进程调度信息,进程控制信息

组织方式:链接,索引

 

二,进程控制

是进程管理中最基本的功能

原语:若干条指令组成,用于完成一个功能的过程。

进程创建(create()):

1.申请空白PCB

2.为进程分配资源

3.初始化PCB信息

4.将进程插入就绪队列

引起创建的原因:

1.用户登录

2.作业调度

3.提供服务

4.应用请求

进程终止():

1.查看PCB中进程当前状态

2.若是执行状态,则改为终止,并设调度为真,以便调度其他进程

3.看他有没有子进程或父进程,若有子进程则终止

4.归还资源给系统或父进程

5.将PCB移除队列

引起终止的原因:

1.正常结束

2.异常结束

3.外界干预     比如:父进程要求,父进程终止, OS干预等

进程阻塞(block()):

1.查看进程当前状态,如是执行状态,改为阻塞

2.将PCB插入阻塞队列

3.保存进程当前运性的处理机状态(PCB),设调度为真

引起阻塞的原因:

1.新数据未到达

2.无新任务做

3.启动某种操作

4.OS要求

进程唤醒(wokeup()):

与阻塞相反

进程挂起(suspend()):

1.查看进程状态,若为执行,改为静止就绪。若为就绪,改为静止就绪。若为阻塞,就改为静止阻塞

2.保存PCB

3.设调度为真

激活与之相反 

三,进程同步

使并发的进程能有效地共享资源,相互合作,相互协调,实现可再现性

进程之间的两种关系:

间接制约关系:两进程共享临界资源

直接制约关系:两进程之间合作

临界资源:进程之间采用互斥方式,共享资源

临界区:访问临界资源的那段代码成称为临界区

同步的原则:

1.空闲等待

2.忙则等待

3.有限等待

4.让权等待

解决同步问题的方法(实际上是解决共享临界资源的问题):信号量机制

1.整形信号量         表示资源的数目

2.记录型信号量       除了表示资源数目外,还有进程链表指针L,用于链接上述所有进程

3.AND型信号量       同时申请多个临界资源

4.信号量集              同时申请多个临界资源且每一个临界资源都申请多个

利用信号量实现资源互斥

管程:另一种解决同步问题的方法

由于信号量机制的两个缺点:

1.麻烦       大量同步操作分散在各进程中

2.死锁        因为同步操作不当引起死锁

引入新的同步工具:管程

一、     管程的概念

  1. 管程可以看做一个软件模块,它是将共享的变量和对于这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,进程可以调用管程来实现进程级别的并发控制。
  2. 进程只能互斥得使用管程,即当一个进程使用管程时,另一个进程必须等待。当一个进程使用完管程后,它必须释放管程并唤醒等待管程的某一个进程。
  3. 在管程入口处的等待队列称为入口等待队列,由于进程会执行唤醒操作,因此可能有多个等待使用管程的队列,这样的队列称为紧急队列,它的优先级高于等待队列。

二、     管程的特征

  1. 模块化。

管程是一个基本的软件模块,可以被单独编译。

  1. 抽象数据类型。

管程中封装了数据及对于数据的操作,这点有点像面向对象编程语言中的类。

  1. 信息隐藏。

管程外的进程或其他软件模块只能通过管程对外的接口来访问管程提供的操作,管程内部的实现细节对外界是透明的。

  1. 使用的互斥性。

任何一个时刻,管程只能由一个进程使用。进入管程时的互斥由编译器负责完成。

 

四,进程通信

进程通信(IPCInter-Porcess Communcation)是进程进行通信和同步的机制。

IPC提供两个基本操作:发送(send message)接收(receive message

进程通信流程:在通信进程之间建立通信链路通过send/receive交换信息

进程通信方式:直接通信: 进程必须正确命名对方,比如sendpmessage)向p发送信息,receiveqmessage)从q中接收信息 

通信链路有如下属性:自动建立连接;一条链路恰好对应一对通信进程;每对进程之间只有一个链接存在;链路可以是单向的,但是通常为双向的

间接通信: 通过OS维护的消息队列实现进程之间的通信(接收发送信息) 每个消息队列都有一个唯一标识,只有共享了相同消息队列的进程才能够通信 

五,线程

线程是指进程内的一个执行单元,也是进程内的可调度实体。每个进程至少需要一个线程。

与进程的区别:

地址空间:进程内的一个执行单元,进程至少一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间。

资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程资源。(线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(寄存器,栈,程序计数器),但是它可与同一个进程的其他线程共享进程所拥有的全部资源)

线程是处理器调度的基本单位,但进程不是。

二者皆可并发执行(一个线程可以创建和撤销另一个线程,同一个进程中的多线程之间可以并发执行)

线程不可独立执行,进程可以独立执行

 

 

 

实验目的 设计一个有 N个进程并行的进程调度程序。采用最高优先级优先的调度算法进行进程调度的模拟。 实验要求 设计一个有 N个进程并行的进程调度程序。采用最高优先级优先的调度算法进行进程调度的模拟。 实验原理 每个进程用一个进程控制块( PCB)表示。进程控制块可以包含进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。进程名、优先级、需要运行时间通过键盘输入。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,否则将进程的优先级减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。 重复以上过程,直到所有进程都完成为止。 实验仪器 PC及其LINUX操作系统 实验步骤 调度算法的流程图如下 : 实验内容 程序部分: #include "stdio.h" #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 struct pcb { /* 定义进程控制块PCB */ char name[10]; char state; int super; int ntime; int rtime; struct pcb* link; }*ready=NULL,*p; typedef struct pcb PCB; sort() /* 建立对进程进行优先级排列函数*/ { PCB *first, *second; int insert=0; if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/ { p->link=ready; ready=p; } else /* 进程比较优先级,插入适当的位置中*/ { first=ready; second=first->link; while(second!=NULL) { if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ { /*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else /* 插入进程优先数最低,则插入到队尾*/ { first=first->link; second=second->link; } } if(insert==0) first->link=p; } } void input() /* 建立进程控制块函数*/ { int i,num; //clrscr(); /*清屏*/ printf("\n 请输入进程号?"); scanf("%d",#); for(i=0;iname); printf("\n 输入进程优先数:"); scanf("%d",&p->super); printf("\n 输入进程运行时间:"); scanf("%d",&p->ntime); printf("\n"); p->rtime=0;p->state='w'; p->link=NULL; sort(); /* 调用sort函数*/ } } int space() { int l=0; PCB* pr=ready; while(pr!=NULL) { l++; pr=pr->link; } return(l); } void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ { printf("\n qname \t state \t super \t ndtime \t runtime \n"); printf("|%s\t",pr->name); printf("|%c\t",pr->state); printf("|%d\t",pr->super); printf("|%d\t",pr->ntime); printf("|%d\t",pr->rtime); printf("\n"); } void check() /* 建立进程查看函数 */ { PCB* pr; printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p); pr=ready; printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/ while(pr!=NULL) { disp(pr); pr=pr->link; } } void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ { printf("\n 进程 [%s] 已完成.\n",p->name); free(p); } void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else { (p->super)--; p->state='w'; sort(); /*调用sort函数*/ } } void main() /*主函数*/ { int len,h=0; char ch; input(); len=space(); while((len!=0)&&(ready!=NULL)) { ch=getchar(); h++; printf("\n The execute number:%d \n",h); p=ready; ready=p->link; p->link=NULL; p->state='R'; check(); running(); printf("\n 按任一键继续......"); ch=getchar(); } printf("\n\n 进程已经完成.\n"); ch=getchar(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粉尘伴终生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值