操作系统 进程管理 总结

本文详细介绍了操作系统中的进程管理,包括程序的并发执行、进程的概念、状态及其转换、进程控制原语,以及进程间的互斥与同步。文章还讨论了死锁的概念、原因和消除方法,提供了防止和解决死锁的策略。
摘要由CSDN通过智能技术生成

第一部分

一、程序的并发执行

1 程序的顺序执行

  我们把一个具有独立功能的程序独占处理机直到最终结束的过程叫做程序的顺序执行。
  程序的顺序执行具有以下特点:
  1. 顺序性
  2. 封闭性
  3. 可再现性

2 多道程序系统中的程序执行环境

  这样的执行环境具有以下3个特点:
  1. 独立性
  2. 随机性
  3. 资源共享性

3 并发执行

两种情况:

第一种:多道程序系统的程序执行环境变化所引起的多道程序的并发执行。
第二种:在某道程序的几个程序段中(例如几个程序)包含着一部分可以同时执行或顺序颠倒执行的代码。

多道程序的并发执行在宏观上是同时进行的,但在微观上仍是顺序执行的。

程序的并发执行可以总结为:一组在逻辑上互相独立的程序或程序段在执行过程中,其执行时间在客观上相互重叠,即一个程序段的执行尚未结束,另一个程序段的执行已经开始的这种执行方式。

注意:程序的并发执行不同与程序的并行执行。程序的并行执行是指一组程序按独立的、异步的速度执行。并行执行不等于时间上的重叠。

1966年Bernstein提出了两个相邻语句可以并发执行的条件:若两个语句没有读写、写写冲突,则两个语句可以并发执行。如果满足Bernstein的3个条件,则认为并发执行不会对程序执行结果的封闭性和可再现性产生影响。

二、进程

由操作系统控制和协调并发程序之间的资源共享和竞争,避免发生预料之外的错误。
我们需要一个能够描述程序的执行过程且能用来共享资源的基本单位,这个基本单位被称为进程(或者任务)。

进程:

  1. 进程是可以并发执行的计算部分。
  2. 进程是一个独立的可以调度的活动。
  3. 进程是一个抽象实体,当它执行某个任务时,将要分配和释放各种资源。
  4. 行为的规则称为程序,程序在处理机上执行时的活动称为进程。
  5. 一个进程是一系列逐一执行的操作,而操作的确切含义则有赖于以何种详尽程度来描述进程。
    可以看到,我们要注重进程是一个动态的执行过程这一概念。我们可以这样定义进程:并发执行的程序在执行过程中分配和管理资源的基本单位。

进程和程序的联系与区别:

  1. 进程是一个动态的概念,而程序则是一个静态概念。
  2. 程序是指令的有序集合,而进程强调执行过程。
  3. 进程具有并发特征(独立性和异步性),而程序没有。
  4. 进程是竞争计算机系统资源的基本单位。
  5. 不同的进程可以包含同一程序,只要该程序多对应的数据集不同。

进程的描述
进程的静态描述由三部分组成:进程控制块(PCB)、有关程序段和该程序段对其进行操作的数据结构集。

PCB
PCB集中反映一个进程的动态特征。进程的PCB是系统感知进程的唯一实体。
创建一个进程时,应首先创建其PCB,然后才能根据PCB中的信息对进程实施有效的管理和控制。当一个进程完成其功能之后,系统则释放PCB,进程也随之消亡。

PCB的内容

  1. 描述信息:(1)进程名或进程标识号;(2)用户名或用户标识号;(3)家族关系。
  2. 控制信息:(1)进程当前状态;(2)进程优先级(包括:占有CPU时间、进程优先级偏移、占据内存时间,等等);(3)程序开始地址;(4)各种计时信息;(5)通信信息。
  3. 资源管理信息:(1)占用内存大小及其管理用数据结构指针;(2)在某些复杂系统中,还有对换或覆盖用的有关信息;(3)共享程序段大小及起始地址;(4)输入输出设备的设备号,索要传送的数据长度、缓冲区地址、缓冲区长度及所用设备的有关数据结构指针等;(5)指向文件系统的指针及有关标识等。
  4. CPU现场保护结构。

进程上下文
进程上下文实际上是进程执行过程中顺序关联的静态描述。进程上下文是一个与进程切换和处理机状态有关的概念。
进程上下文是一个抽象的概念,它包含了每个进程执行过的、执行时的以及待执行的指令和数据,在指令寄存器、堆栈(存放各调用子程序的返回点和参数等)和状态字寄存器等中的内容。

已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为上文,正在执行的指令和数据在寄存器与堆栈中的内容称为正文 ,待执行的指令和数据在寄存器与堆栈中的内容称为下文
进程的系统级上下文又分为静态与动态部分。动态部分是与寄存器上下文相关联的。

进程上下文切换
进程上下文切换发生在不同的进程之间而不是同一个进程内。
进程上下文切换过程一般包含3个部分:(1)保存被切换进程的正文部分(或当前状态)至有关存储区;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)进程的软中断通信 #include #include #include #include int wait_flag; void stop(); main( ) { int pid1, pid2; // 定义两个进程号变量 signal(2,stop); // 或者 signal (14,stop); while((pid1 = fork( )) == -1); // 若创建子进程1不成功,则空循环 if(pid1 > 0) { // 子进程创建成功,pid1为进程号 while((pid2 = fork( )) == -1); // 创建子进程2 if(pid2 > 0) { wait_flag = 1; //sleep(1); // 父进程等待5秒 kill(pid1,SIGUSR1); // 杀死进程1 kill(pid2,SIGUSR2); // 杀死进程2 wait(0); wait(0); printf("\n Parent process is killed !!\n"); exit(0); // 父进程结束 } else { wait_flag = 1; signal(SIGUSR2,stop); // 等待进程2被杀死的中断号17 printf("\n Child process 2 is killed by parent !!\n"); exit(0); } } else { wait_flag = 1; signal(SIGUSR1,stop); // 等待进程1被杀死的中断号16 printf("\n Child process 1 is killed by parent !!\n"); exit(0); } } void stop() { wait_flag = 0; } (2)进程的管道通信 #include #include #include int pid1,pid2; // 定义两个进程变量 main( ) { int fd[2]; char OutPipe[100],InPipe[100]; // 定义两个字符数组 pipe(fd); // 创建管道 while((pid1 = fork( )) == -1); // 如果进程1创建不成功,则空循环 if(pid1 == 0) { lockf(fd[1],1,0); // 锁定管道 sprintf(OutPipe,"\n Child process 1 is sending message!\n"); write(fd[1],OutPipe,50); // 向管道写入数据 sleep(5); // 等待读进程读出数据 lockf(fd[1],0,0); // 解除管道的锁定 exit(0); // 结束进程1 } else { while((pid2 = fork()) == -1); // 若进程2创建不成功,则空循环 if(pid2 == 0) { lockf(fd[1],1,0); sprintf(OutPipe,"\n Child process 2 is sending message!\n"); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); // 等待子进程1 结束 read(fd[0],InPipe,50); // 从管道中读出数据 printf("%s\n",InPipe); // 显示读出的数据 wait(0); // 等待子进程2 结束 read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0); // 父进程结束 } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值