[[NOTE]进程和进程管理

顺序程序和并发

顺序程序

开始-计算-输出

  • 顺序性
  • 封闭性
  • 可再现性

并发程序

在这里插入图片描述

一个程序段执行未结束另外一个已经开始.

并行记号

cobegin
	...
coend

性质:无封闭性和可再现性

公共变量(临界资源会对执行产生影响

一个程序可以有多个计算段和IO段

进程

所谓进程,就是一个具有独立功能的程序关于某个数据集 合的一次运行活动.

  1. 程序是静态的概念,进程是动态的概念;
  2. 进程是一个独立运行的活动单位;
  3. 进程是竞争系统资源的基本单位;
  4. 一个程序可以对应多个进程,一个进程包含一个程序。

进程的基本状态

  • Running
  • Wait
  • Ready

进程的转换

在这里插入图片描述

进程描述(*)

  • 进程控制块:描述进程和其他资源的关系
  • 程序和数据

进程控制块PCB

  1. 进程标识符PID
  2. 进程状态(Run,Ready,Wait)
  3. 队列指针(队列是相同状态的进程)
  4. 优先级
  5. CPU保护信息
  6. 进程间通讯信息
  7. 资源占用清单

进程管理

进程状态的变化

  1. 创建->撤销
  2. 运行->等待
  3. 等待->就绪

进程控制原语

进程创建原语

创建一个具有指定标识符的进程,建立进程的PCB结构

进程撤销原语

当进程完成任务后希望终止自己时使用进程撤消原语

撤消当前运行的进程。将该进程的PCB结构归还到PCB资源池,所占用的资源归还给父进程,从总链队列中消除它,然后转进程调度程序

kill() & exit()

进程等待原语

当进程需要等待某一事件完成时,它可以调用等待原语挂起自己

susp()

进程唤醒原语

当处于等待状态的进程所期待的事件来到时,由发现者进程使用唤醒原语叫唤醒

进程互斥

临界资源

多个进程共享的资源

  • 硬件:IO设备
  • 软件:公共变量等

互斥

当一个进程访问临界区域时不允许其他的进程访问.

同步

进程间在一些节点时需要进行通信

进程同步管理

See: https://blog.csdn.net/qicheng777/article/details/77432129

进程锁

用变量w代表某种资源的状态,w称为“锁” 。

上锁操作和开锁操作

进程及进程管理——进程同步机构
检测w的值 (是0还是1);
如果w的值为1,继续检测;
如果w的值为0,将锁位置1 (表示占用资源),进入临界区执行。 (此为上锁操作)
临界资源使用完毕,将锁位置0。 (此为开锁操作)

  • 上锁原语:lock(w)
  • 开锁原语:unlock(w)

信号灯(*)

信号灯是一个确定的二元组 (s,q),s是一个具有非负初值 的整型变量,q是一个初始状态为空的队列。操作系统利用信号灯的状态对并发进程和共享资源进行控制和管理。

变量值 ≥ 0 时,表示绿灯,进程执行;

变量值 < 0 时,表示红灯,进程停止执行

注意:创建信号灯时,应准确说明信号灯 s 的意义和初值

P:-1

如果**=<0**,置等待状态

V:+1

如果**>0**,进入就绪状态

See: https://blog.csdn.net/XiaoBuHome/article/details/50223879

互斥的实现范式:

main( )
{ 
int mutex=1; ∕* 互斥信号灯 *//初始设置为1
cobegin
pa( )pb( );
coend 
}

pa( )
{
p(mutex);
//...
v(mutex);
}
pb()
{
	p(mutex);
	//...
	v(mutex);
}

合作进程的执行实现(*)

在这里插入图片描述

类似这样的合作进程,实现分析如下:

  • 先执行pa

  • 执行完毕后打开b,c信号

  • 执行bc

  • 一开始只有a可以执行

  • a执行完之后才能执行bc

碎碎念:code段中是不是三个p是同一级别,只看信号灯调动??

范式:

main()
{
	sig2=0;
	sig3=0;
	code begin
	p1();
	p2();
	p3();
	code end
}
p1()
{
	//...
	v(sig2);
	v(sig3);
}
p2()
{
	p(sig2);
	//...
}
p3()
{
	p(sig3);
	//...
}

在这里插入图片描述

范式:

main()
{
	sig3=-1;
	code begin
	p1();
	p2();
	p3();
	code end
}
p1()
{
	//...
	
	v(sig3);
}
p2()
{
	
	//...
	v(sig3)
}
p3()
{
	p(sig3);
	//...
}

共享缓冲区的同步

计算进程 cp和打印进程 iop公用一个单缓冲,为了完成正确的计算与打印,试用信号灯的p、v操作实现这两个进程的同步。

也就是计算部分将数据存放进缓冲区buf中,由打印进程取出并输出.

  • 当cp进程把计算结果送入buf时,iop进程才能从buf中取出结 果去打印,否则必须等待。
  • 当iop进程把buf中的数据取出打印后,cp进程才能把下一个 计算结果数据送入buf中,否则必须等待。

信号灯设置

  • sa:表示缓冲区中是否有可供打印的计算结果,其初值为0。

  • sb:表示缓冲区有无空位置存放新的信息,其初值为1。
    在这里插入图片描述

进程描述

cp:

  1. 产生数据
  2. p(sb)//标识无空位(sb-1)
  3. 放入数据
  4. v(sa)//标识有数据(sa+1)

iop:

  1. p(sa)//标识无数据
  2. 取出数据
  3. v(sb)//标识有空位
  4. 打印

范式

main( )
{
int sa=0; ∕* buf isdata*int sb=1; ∕* buf isempty*∕
cobegin
cp( )iop( );
coend
}
cp()
{
	while(not finished)
	{
		get_result;
		p(sb);
		push;
		v(sa);
	}
}
iop()
{
	while(not_finished)
	{
		p(sa);
		get_from_buffer;
		v(sb);
		output;
	}
}

出数据
3. v(sb)//标识有空位
4. 打印

范式

main( )
{
int sa=0; ∕* buf isdata*int sb=1; ∕* buf isempty*∕
cobegin
cp( )iop( );
coend
}
cp()
{
	while(not finished)
	{
		get_result;
		p(sb);
		push;
		v(sa);
	}
}
iop()
{
	while(not_finished)
	{
		p(sa);
		get_from_buffer;
		v(sb);
		output;
	}
}
发布了80 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/POTASSIUM711/article/details/102614889