操作系统进程同步实验

2024-05-31

操作系统进程同步实验(共6篇)

篇1:操作系统进程同步实验

进程同步练习题

1.在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。

司机 售票员 启动车辆 关车门 正常行车 售票 到站停车 开车门

司机和售票员工作流程图

① 约束:怎么密切配合协调工作才能保证安全呢?

a)关车门之后再启动车辆;利用前驱图解释 b)到站停车之后再开车门; ② 根据约束定义信号量;

关车门和启动车辆需要一个信号量进行同步S1;到站停车和开车门之间需要一个信号量进行同步S2; ③ 建立几个进程呢?

a)为司机建立一个进程Driver; b)为售票员建立一个进程Conductor; Driver:

Repeat

启动车辆;

正常行驶;

到站停车;

Until false;Conductor:

Repeat 关车门;

售票;

开车门;

Until false;

④ 加入同步关系:

Var s1,s2:semorphore=0,0;

Driver:

Repeat

Wait(s1);

启动车辆;

正常行驶;

到站停车;

Signal(s2)Until false;Conductor:

Repeat 关车门;

Signal(s1);

售票; Wait(s2)

开车门;

Until false;main(){

Driver();

Conductor();} 2.桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们之间的同步机制。分析: ①约束:

a)爸爸和妈妈竞争盘子,往盘子放水果,爸爸在放时,妈妈等待,或者相反; b)爸爸和女儿要同步,即爸爸放完苹果之后通知女儿来吃;同时女儿吃完之后要通知盘子可用;

c)妈妈和儿子要同步,即妈妈放完橘子之后通知儿子来吃;同时儿子吃完之后要通知盘子可用;

② 经上述分析可知:

需要3个信号量:S1表示临界资源盘子,初值1;爸爸和女儿需要一个信号量进行同步S2=0 妈妈和儿子需要一个信号量进行同步S3=0;③ 建立进程?

爸爸:

妈妈:

女儿:

儿子:

Repeat

repeat

repeat

repeat

取一个苹果;

取一个橘子;

从盘子取一个苹果;

从盘子取一个橘子;

放入盘子;

放入盘子

吃苹果;

吃橘子;

Until false;

Until false;

Until false;

Until false;④ 加入同步关系。

爸爸:

妈妈:

女儿:

儿子:

Repeat

repeat

repeat

repeat

wait(S2);

wait(S3);取一个苹果;

取一个橘子;

从盘子取一个苹果;

从盘子取一个橘子;

Wait(S1);

Wait(S1);

signal(S1);

signal(S1);

放入盘子;

放入盘子

吃苹果;

吃橘子;

Signal(S2);

Signal(S3);

Until false;

Until false;

Until false;

Until false;

3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待;

(2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入;

(3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。

请用信号量为工具,对ab段实现正确管理以保证行驶安全。分析: ① 约束:

a)ab两点的单行车道是一种临界资源;两端的车辆对该资源进行竞争; b)同步关系:(1),(3); ② 经上述分析可知:

首先,设置互斥信号量Sab=1,用于a、b点的车辆互斥进入ab段;

然后,分别设置共享变量ab=0用于记录当前ab段上由a点进入的车辆数量;共享变量ba=0用于记录当前ab=段上由b点进入车辆的数量;

最后,设置互斥信号量S1=1用于ab段的车辆互斥访问共享变量ab;设置互斥信号量S2=1用于ba段的车辆互斥访问共享变量ba ③建立进程?

semaphore S1=1,S2=1,Sab=1;int ab=ba=0;Pab:

pba: Repeat

repeat Wait(S1)

Wait(s2)

abcount=abcount+1;

bacount=bacount+1;if abcount==1 then wait(sab)

if bacount==1 then wait(sab)signal(S1)

signal(s2)进入车道行驶;

进入车道行驶; Wait(s1)

Wait(s2)abcount=abcount-1;

bacount=bacount-1;if abcount==0 then signal(sab)

if bacount==0 then signal(sab)signal(s1)

signal(s2);

until false;

until false;main(){

Pab();

Pba();}

5.一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。分析: ① 约束:

a)桥属于临界资源,两岸的人对该资源进行竞争;

b)桥上的人数是有限制的,设这个桥由N个桥墩构成,桥上同时只能有N个人过桥,其它人要进行等待。相当于共享资源数。

② 设置信号量

信号量s:互斥使用桥,初值为1 变量count1:方向1上过河人计数器 变量count2:方向2上过河人计数器

信号量scount1:对方向1上过河人计数器count1的互斥使用,初值为1 信号量scount2:对方向2上过河人计数器count2的互斥使用,初值为1 信号量scount:代表桥上过河人的计数信号量,初值为桥墩个数N ③ 建立进程

Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0;

void direct1(int i){ wait(scount1);count1++;if(count1==1)

wait(s);signal(scount1);

wait(scount);

上桥,过桥,下桥; signal(scount);

wait(scount1);count1--;if(count1==0)

signal(s);signal(scount1);}

void direct2(int i){ wait(scount2);count2++;if(count2==1)

wait(s);signal(scount2);

wait(scount);上桥,过桥,下桥; signal(scount);

wait(scount2);count2--;if(count2==0)

signal(s);signal(scount2);}

main(){

cobegin{

direct1(1);

direct1(n);

direct2(1);

direct2(m);

} } 6.有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);

(2)-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用同步算法描述产品A与产品B的入库过程。分析: ① 约束:

a)仓库是一种临界资源,两种产品为之竞争;

b)A产品数量不能比B产品数量多M个以上即A产品数量比B产品数量最多多M-1个;A产品数量不能比B产品数量少N个以上即B产品数量比A产品最多多N-1个。② 设置信号量

设置互斥信号量mutex互斥使用仓库; 设置两个信号量来控制A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量(当前允许A产品入库数量); sb表示当前允许B产品比A产品多入库的数量(当前允许B产品入库数量)。

初始时,sa为M一1,sb为N一1。当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。

③ 建立进程

semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1)

{ 取一个产品;

wait(sa);wait(mutex);将产品入库;

signal(mutex);signal(sb);}

} process putb(){ while(1)

{ 取一个产品;

wait(sb);wait(mutex);将产品入库;

signal(mutex);signal(sa);

} } main(){ cobegin{ puta();putb();} }

4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P、V操作正确实现“读者”与“写者”的同步。(第二类读者写者问题,信号量解决方法)

分析: ① 约束:

a)写者与写者之间需要互斥访问;

b)读者与写者之间需要互斥;(有一个读者在读就让写者等待),因此,此时需要一个计数变量记录读者的数量。c)允许多个读者同时读数据;

d)一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。

② 建立进程 Write: Repeat 执行读操作 Until false;Read: Repeat 执行写操作; Until false;③ 设置信号量

a)设置互斥信号量mutex=1实现写者与写者之间的互斥访问; Write: Repeat

Wait(mutex)

执行读操作;

Signal(mutex);Until false;

b)实现读者与写者之间的互斥,设置整型变量readcount=0记录读者数量,if readcount==1 then wait(mutex)Read: Repeat readcount++;if(readcount==1)wait(mutex);

执行读操作;

readcount--;if(readcount==0)signal(mutex);

until false;由于readcount 是共享变量,所以读者之间要互斥访问,因此设置一个互斥信号量rmutex=1.Read: Repeat Wait(rmutex)readcount++;if(readcount==1)wait(mutex);signal(rmutex)执行读操作; Wait(rmutex)readcount--;if(readcount==0)signal(mutex);signal(rmutex)until false;

c)要想实现d)的互斥,需让读者和写者再共享一个互斥信号量s,因此设置互斥信号量s=1,一旦有写者等待时,就wait(s)让读者等待。Write: Repeat wait(wmutex);writecount++;if(writecount==1)wait(s);signal(wmutex);

Wait(mutex)

执行读操作;

Signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);

Until false;Read:

Repeat

Wait(s);Wait(rmutex)readcount++;if(readcount==1)wait(mutex);signal(rmutex)signal(s);执行读操作; Wait(rmutex)readcount--;if(readcount==0)signal(mutex);signal(rmutex)until false;

④ 完整代码 Process reader(){ while(1)

{ wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s);

perform read operation;

wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);} } Process writer(){ while(1)

{ wait(wmutex);writecount++;

if(writecount==1)wait(s);signal(wmutex);

wait(mutex);perform write operation;signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin

{ reader();

writer();

} }

1、在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。

司机 售票员 启动车辆 关车门 正常行车 售票 到站停车 开车门

司机和售票员工作流程图

【答案】

设置两个资源信号量:S1、S2。S1表示是否允许司机启动汽车,其初值为0;S2表示是否允许售票员开门,其初值为0.semaphoere S1=S2=0;void Driver(){

while(1)

{

wait(S1);

启动车辆;

正常行车;

到站停车;

signal(S2);

} } void Busman(){

while(1)

{

关车门;

signal(S1);

售票;

wait(S2);

开车门;

}

} main(){

cobegin{

Driver();

Busman();

} } 2.桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用PV操作实现他们之间的同步机制。

【答案】

信号量S用来实现盘子的互斥访问,S1表示盘子中苹果个数,S2表示盘子中橘子的个数。

semaphore S=1,S1=S2=0;void father(){

while(1)

{

准备苹果;

wait(S);

将苹果放在盘子内;

signal(S1);

} } void mother(){

while(1)

{

准备橘子;

wait(S);

将橘子放在盘子内;

signal(S2);

} } void daughter(){

while(1)

{

wait(Sl);

从盘子里拿走苹果;

signal(S);

吃苹果;

} } void son(){

while(1)

{

wait(S2);

从盘子里拿走橘子;

signal(S);

吃橘子;

} } main(){

cobegin{

father();

mother();

daughter();

son();

} }

3.a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:(1)当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待;

(2)当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入;

(3)当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。

请用信号量为工具,对ab段实现正确管理以保证行驶安全。【答案】

此题是读者-写者问题的变形。设置3个信号量S1、S2和Sab,分别用于从a点进入的车互斥访问共享变量ab(用于记录当前ab段上由a点进入车辆的数量),从b点进入的车互斥访问共享变量ba(用于记录当前ab段上由b点进入车辆的数量)和a、b点的车辆互斥进入ab段。3个信号量的初值分别为1、1和1,两个共享变量ab和ba的初值分别为0、0。

semaphore S1=1,S2=1,Sab=1;int ab=ba=0;void Pab(){

while(1)

{

wait(S1);

if(ab==0)

wait(Sab);

ab=ab+1;

signal(S1);

车辆从a点驶向b点;

wait(S1);

ab=ab-1;

if(ab==0)

signal(Sab);

signal(S1);

} } void Pba(){

while(1)

{

wait(S2);

if(ba==0)

wait(Sab);

ba=ba+1;

signal(S2);

车辆从b点驶向a点;

wait(S2);

ba=ba-1;

if(ba==0)

signal(Sab);

signal(S2);

} } main(){

cobegin{

Pab();

Pba();

} }

4.将只读数据的进程称为“读者”进程,而写或修改数据的进程称为“写者”进程。允许多个“读者”同时读数据,但不允许“写者”与其他“读者”或“写者”同时访问数据。另外,要保证:一旦有“写者”等待时,新到达的“读者”必须等待,直到该“写者”完成数据访问为止。试用P、V操作正确实现“读者”与“写者”的同步。(第二类读者写者问题,信号量解决方法)

【答案】

为了使写者优先,可在原来的读优先算法的基础上增加一个互斥信号量s,初值为1,使得当至少有一个写者准备访问共享对象时,它可以使后续的读者进程等待;

整型变量writecount,初值为0,用来对写者进行计数;

互斥信号量wmutex,初值为1,用来实现多个写者对writecount进行互斥访问。Process reader(){ while(1)

{ wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s);

perform read operation;

wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);

} } Process writer(){ while(1)

{ wait(wmutex);if(writecount==0)wait(s);writecount++;signal(wmutex);

wait(mutex);perform write operation;signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin

{ reader();

writer();

} }

5.一条河上架设了由若干个桥墩组成的一座桥。若一个桥墩只能站一个人,过河的人只能沿着桥向前走而不能向后退。过河时,只要对岸无人过,就可以过。但不允许河对岸的两个人同时过,以防止出现死锁。请给出两个方向的人顺利过河的同步算法。

【答案】

信号量s:互斥使用桥,初值为1 信号量scount1:对方向1上过河人计数器count1的互斥使用,初值为1 信号量scount2:对方向2上过河人计数器count2的互斥使用,初值为1 信号量scount:代表桥上过河人的计数信号量,初值为桥墩个数N 变量count1:方向1上过河人计数器

变量count2:方向2上过河人计数器 Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0;

void direct1(int i){ wait(scount1);if(count1==0)

wait(s);count1++;signal(scount1);

wait(scount);

上桥,过桥,下桥; signal(scount);

wait(scount1);count1--;if(count1==0)

signal(s);signal(scount1);}

void direct2(int i){ wait(scount2);if(count2==0)

wait(s);count2++;signal(scount2);

wait(scount);上桥,过桥,下桥; signal(scount);

wait(scount2);count2--;if(count2==0)

signal(s);signal(scount2);} main(){

cobegin{

direct1(1);

direct1(n);

direct2(1);

direct2(m);

} }

6、有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);(2)-N<A产品数量-B产品数量<M。其中,N和M是正整数。试用同步算法描述产品A与产品B的入库过程。

【答案】

A产品的数量不能比B产品的数量少N个以上,A产品的数量不能比B产品的数量多M个以上.

设置两个信号量来控制A、B产品的存放数量,sa表示当前允许A产品比B产品多入库的数量(当前允许A产品入库数量),即在当前库存量和B产品不入库的情况下,还可以允许sa个A产品入库;

sb表示当前允许B产品比A产品多入库的数量(当前允许B产品入库数量),即在当前库存量和A产品不入库的情况下,还可以允许sb个B产品入库。

初始时,sa为M一1,sb为N一1。当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。

semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1)

{ 取一个产品;

wait(sa);wait(mutex);将产品入库;

signal(mutex);signal(sb);}

} process putb(){ while(1)

{ 取一个产品;

wait(sb);wait(mutex);将产品入库;

signal(mutex);signal(sa);

} } main(){ cobegin{ puta();putb();} }

篇2:操作系统进程同步实验

-------售票员和汽车司机的进程同步问题

一、设计分析

司机与售票员要协同工作:一方面只有售票员把门关好之后司机才能开车,因此售票员关好门之后要通知司机开车;另一方面,也只有司机把车停下之后售票员才能开门让乘客下车和上车,此时司机应通知售票员。汽车当前正在始发站停车让乘客上车。因此,必须设置一定的信号量来实现他们之间的同步问题。

把司机与售票员的信号量设置为全局变量,并把客车上的人数:现在人数、下车人数、上车人数设置为全局变量;设置司机与售票员各自的线程。考虑到第一站和最后一站的问题,应单独处理,故在各自的线程中分情况讨论:

由于下车的人数是随机的,设计时考虑到了人数可能会超过客车的最大上限的问题。具体的思路是下面的图示。

二、算法实现(源代码)

#include #include #include #include #include #define total_num 88

//假设汽车的最大容量为88 #define total_pork 9

//总的站数

int recent_num=0;

//某一时刻的客车上的人数 int get_on_num;

//上车的人数 int get_off_num;

//下车的人数 int pork=1;

//赋初始值 HANDLE SJ;

//司机的信号量 HANDLE SPY;

//售票员的信号量

int Get_random(int min, int max)

//产生一定范围的随机数,可避免下面程序的判断超出客车的最大容量问题{ int a;srand((int)time(0));

while(1){ a=rand()%(total_num+1);if(a>=min && a<=max)return a;} } //司机的线程

DWORD WINAPI Thread_Driver(LPVOID Driver){ while(pork<=total_num){ if(pork==total_pork){ WaitForSingleObject(SJ,INFINITE);cout<<“到达总站,欢迎您下次乘坐**路公交车”<

{ ReleaseSemaphore(SPY,1, NULL);WaitForSingleObject(SJ,INFINITE);cout<<“汽车启动”<

} Sleep(1000);} return 0;} //售票员的线程

DWORD WINAPI Thread_Conductor(LPVOID SPY){ while(1){

if(pork

cout<<“这是第”<

WaitForSingleObject(SPY,INFINITE);if(pork==1){

cout<<“SPY开始售票”<

get_on_num=Get_random(0,total_num-recent_num);

cout<

recent_num+=get_on_num;cout<<“共有”<

{

cout<<“SJ停好车,乘客开始上下车”<

get_off_num=Get_random(0,recent_num);

cout<Sleep(1000);recent_num-=get_off_num;cout<<“SPY开始卖票”<cout<<“此时车上总共有”<

return 0;} //主函数

int main(){ HANDLE SJ;HANDLE SPY;SJ=CreateSemaphore(NULL,0,1,“semaphore_driver”);//创建司机的信号量 SPY=CreateSemaphore(NULL,0,1,“semaphore_conductor”);//创建售票员的信号量

SJ=CreateThread(NULL,0,Thread_Driver,&SJ,0,NULL);//创建司机的线程 SPY=CreateThread(NULL,0,Thread_Conductor,&SPY,0,NULL);//创建售票员的线程 CloseHandle(SJ);CloseHandle(SPY);while(1);system(“pause”);return 0;}

三.实现结果

四、心得体会

1、因为司机与售票员是两条单独处理的线程。程序先对司机的线程进行设计,接着再进行售票员的线程设计。因为两者是需要相互协调,又先后顺序的,所以编起程序来比较复杂,而且很乱,尤其对于第一次接触的我们而言。

2、上下车的人数是随机的,所以,我们在编程序时必须注意使程序能够判断所出现的随机数在汽车可以承载的最大容量之内。

篇3:操作系统进程同步实验

1 进程的同步与互斥

操作系统内部存在着许许多多的并发活动:相对独立的多个用户进程可以并发运行;操作系统本身的许多不同功能的进程也可并发执行;在进程并发执行时,由于资源共享和进程之间的合作,使处于同一系统中的进程之间可能产生两种形式的制约关系,即直接制约和间接制约。而这两种关系,通常表现在两类问题上:同步和互斥。

进程互斥:它主要源于对临界资源共享,多个进程竞争使用临界资源时产生的关系,是进程间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源(如外设、共享代码段、共享数据结构)为临界资源,每个进程中访问临界资源的那段程序叫临界区。进程互斥就是保证每次只有一个进程使用临界资源。这些使用临界资源的进程在逻辑上完全独立,本无关系,但是由于竞争同一临界资源而产生了相互制约的关系,即一个进程使用临界资源时,其他使用临界资源的进程只能等待。

进程同步:它主要源于相互协作的进程,是多个进程相互合作共同完成一项任务时发生的关系。是进程间的直接制约关系。相互合作的进程具有伙伴关系,为了保证执行结果的正确性,在执行时间上必须遵循确定的规律。具体的说,一个进程运行到某一点时要求另一伙伴进程为它提供消息,在未获得消息之前,该进程处于等待状态,获得消息后被唤醒进入就绪态。在多道环境下,这种进程间在执行次序上的协调是必不可少的。为了能够正确控制进程的并发执行,操作系统必须提供相应的同步机构以协调这些制约关系。

同步机构的主要任务就是使并发执行的进程之间能有效地共享资源和相互合作,从而使程序的执行能够有序的进行。1965年,荷兰学者Dijkstra提出信号量机制,就是一种卓有成效的实现进程同步机制。

2 信号量和P、V操作

信号量机制由“信号量”和“P操作、V操作”两部分组成的,每个信号量s除一个整数值外s.count,还有一个进程等待队列s queue,其中是阻塞在该信号量的各个进程的标识

信号量只能通过初始化和两个标准的原语来访问--作为OS核心代码执行,不受进程调度的打断。初始化时指定一个非负整数值,表示空闲资源总数(又称为“资源信号量”)--若为非负值表示当前的空闲资源数,若为负值其绝对值表示当前等待临界区的进程数。

3 用PV操作实现进程互斥问题

3.1 问题的分析

用PV操作解决互斥问题时,可以使用锁机制的方法来分析,更有利于我们有效的解决互斥问题。在互斥问题中,系统中通常有需要我们互斥访问的临界资源。因此在利用PV操作解决互斥问题时,要找到系统中的临界资源,并为其设置信号量。

用锁机制理解信号量:为临界资源设置信号量,并赋初值为1。因为是临界资源一次只允许一个进程访问。因而我们设初值为1。当信号量的值为1时表示开锁状态,此时系统允许一个进程通过P操作进入临界区访问临界资源;当信号量的值小于1时为关锁状态,此时任何一个进程都不能通过P操作进入临界区访问临界资源。

P操作相当于上锁:P操作将系统可用资源数减1,由于信号量的初值为1,当某个进程首次调用P操作后,信号量的值变为0,表示系统中再无空闲的该类资源,其他进程在该进程之后再访问资源时,会因为该类资源已无空闲,而无法通过P操作,最终会被挂在等待使用该资源的s.queue队列上,因而首次执行P操作的进程,相当于为临界资源上锁的过程。上锁后其他进程无法访问临界资源。

V操作相当于开锁:V操作将系统可用资源数加1,加1后如果系统中信号量的值是小于等于0的,表示有等待使用该资源的进程,V操作会调用唤醒原语唤醒等待使用该资源的进程。被唤醒的进程可以进入临界区使用临界资源;加后1如果大于0,表示系统中没有需要使用该资源的进程信号量为1,相当于为临界资源开锁的过程,开锁后其他进程才可能通过P操作进入临界区访问临界资源。

3.2 具体实现步骤

采用锁机制的观点利用PV操作解决互斥问题,具体操作和分析可按如下步骤进行

1)找出系统中的临界资源,并为其设置信号量,设初值为1,

2)找到访问临界资源的代码,即临界区。

3)在这段代码前加入P操作,在代码后加入V操作。

3.3 具体实例

例读者-写者问题(the readers-writers problem)

读者-写者问题是一个著名的进程互斥访问有限资源的同步问题,例如:一个航班预定系统有一个大型数据库,很多竞争进程要对它进行读、写。这里大型数据库可以看作多个读者和写者共享的资源。

问题描述:对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许多个――“读-写”互斥,“写-写”互斥,“读-读”允许。

采用信号量机制分析:

首先找到临界资源,系统中很显然多个读写者要对公用共享数据区进行读写。这个数据区就是临界资源,因此我们设置信号量Wmutex表示“允许写”,初值是1。对于写者在访问数据区时我们要首先上锁。访问结束后开锁。对应的写者为

对于读者,由于我们允许多个读者同时读,这时第一个进入的读者就需要判断公共数据区是否上锁,而后续的读者无需做此判断,因为有读者在意味着数据区已被上锁无写者进入的可能,读者可以进入;而最后一个离开的读者,当其离开时已无读者在读,公共数据区无需上锁。这时要开锁。因此对读者计数设置公共变量Rcount表示“正在读”的进程数,初值是0;对应的读者为

这里我们仔细分析,我们用于为读者计数的变量Rcount多个读者都有访问,也是一个临界资源,因此我们还要设置另一个信号量,来保证对计数量的互斥访问。Rmutex表示对Rcount的互斥操作,初值是1。程序改写为

4 用PV操作实现进程同步

4.1 问题的分析

在解决进程的同步问题时,采用用资源的观点进行分析,有利于我们有效的解决同步问题。

用资源的观点理解信号量:信号量代表系统中的某类资源,初始化时信号量的值代表系统中该类资源的个数。随着系统中进程对该类资源的申请和释放,信号量的值会发生改变。某一时刻信号量的值代表该类资源的使用和需求情况。

信号量的值大于0,表示系统中现有空闲的该类资源的个数。进程能够申请到该类资源。

信号量的值等于0,表示系统中已无空闲的该类资源,但也没有等待使用该资源的进程。

信号量的值小于0,表示系统中已无空闲的该类资源,并且有等待使用该资源的进程,等待使用该资源的进程均被挂到进程等待队列s.queue上,此时信号量的绝对值表示等待使用该资源进程的个数。

用资源的观点理解P操作:P操作相当于申请资源的过程,申请时首先将系统可用资源数减1,当这时系统可用资源数仍大于等于0,意味着原来的可用资源是大于1,执行P操作的进程申请到需要的资源,申请成功该进程通过P操作;否则,申请不成功系统将调用阻塞原语将执行P操作的进程阻塞,并将其挂入等待队列s.queue上去。

用资源的观点理解V操作:V操作相当于释放资源的过程,释放时首先将系统可用资源数加1,这时系统可用资源数仍大于0,意味着原来的可用资源是大于等于0的,系统没有等待使用该资源的进程。资源释放成功V操作通过。否则,代表系统中有等待使用该资源的进程,V操作调用唤醒原语唤醒等待使用该资源的进程。

4.2 具体实现步骤

采用资源的观点利用PV操作解决同步问题,具体操作和分析可按如下步骤进行

1)首先找出同步对象,

2)然后考察每个同步对象在执行过程中需要哪些资源,根据系统拥有资源的情况设置信号量,并赋初值。

3)接下了确定同步时机,即同步对象什么时候需要那类资源,什么时候操作结束释放那类资源。最后根据同步时机在进程的程序序列中加入PV操作。问题的关键是同步时机的寻找一定要准确,才能在合适的位置上添加PV操作。

4.3 实例

生产者-消费者问题(the producer-consumer problem)

问题描述:若干进程通过有限的共享缓冲区交换数据。其中,“生产者”进程不断写入,而“消费者”进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。如下图1生产者和消费者问题所示。

采用信号量机制分析:

同步对象:生产者和消费者。

设置信号量:生产者生产时需要“空”缓冲区资源;消费者消费时需要”满”缓冲区资源。full是“满”缓冲区数目,初值为0,empty是“空”缓冲区数目,初值为N。

确定同步时机:生产者生产前需要”空”缓冲区资源,用P操作申请空缓冲区资源。生产结束后,将缓冲区填满,这时生产出满缓冲区资源,因此用V操作释放满缓冲区资源;消费者在消费前需要满缓冲区资源,用P操作申请满缓冲区资源,消费结束后,缓冲区也被取空。这时产生空的缓冲区资源,用V操作释放空缓冲区资源。对应的程序段。

由于缓冲区可由多个生产者和消费者同时访问是临界资源,为了保证对临界资源的正确使用;设置信号量mutex用于访问缓冲区时的互斥,初值是1

注意:私用信号量(private semaphore)和公用信号量

私用信号量:指只与制约进程和被制约进程有关的信号量,通常指用于实现同步的信号量;

公用信号量:指与一组并发进程有关的信号量,通常指用于实现互斥的信号量);

对于信号量的使用通常是先私后公,因此加入对公用信号量后,程序段改写为:

5 结束语

总之,在使用P、V操作实现进程同步与互斥时,首先要深刻理解信号量和PV操作的含义。在进行分析时应遵循以下步骤:

1)分析进程间的制约关系(同步或互斥关系),根据关系确定信号量种类,对于互斥关系,首先找到临界资源,为其设置代表互斥的信号量;然后再找同步关系,首先找到同步对象,再根据同步对象运行时所需资源设置信号量。

2)为信号量赋初值,互斥信号量的初值一般为1,同步信号量的初值与其代表资源的数量有关。

3)在实现互斥时将P操作放到临界区前,V操作放到临界区后;实现同步时,要找到同步时机,在对应的程序段中加入PV操作。

4)同一信号量的P、V操作要成对出现:互斥信号量的P、V操作要成对出现于同一程序中;而同步信号量的P、V操作要(8)成对(9)出现于不同的程序中,进而实现进程间的通信。

5)在同一进程中,若同时存在着互斥信号量和同步信号量的P操作,要采用先私后公的原则即应先执行同步信号量的P操作再执行互斥信号量的P操作,但对V操作的顺序不做限制。

信号量机制应用范围很广,它不但可以解决进程管理当中的互斥和同步问题,在交通运输和经济生产中也可应用信号量机制解决相关领域的问题。所以此类题型通常与实际应用相联系,在分析时可以采用上面介绍的方法,可以很快找到解题思路,提高解题效率。

摘要:该文讨论了操作系统中各种情况下基于P、V原语和信号量机制的解决方案,在介绍了信号量机制的基础上引入PV操作,给出了用PV操作实现进程互斥与同步的基本方法。同时提出了分析和解决此类问题的方法和规律。

关键词:进程,同步,互斥,信号量机制

参考文献

[1]汤小丹,梁红兵,哲凤屏,等.计算机操作系统(修订版)[M].西安:西安电子科技大学出版社,2003.

[2]William Stallings.操作系统——精髓与设计原理[M].5版.北京:电子工业出版社,2006.

篇4:操作系统进程同步实验

关键词:上机实验 同步协同上机实验系统 实验评价 学习评价

中图分类号:G434文献标识码:A文章编号:1673-8454(2007)11-0017-03

一、引言

上机实验是高校实践教学的重要环节。以同步协同上机实验系统作为支撑环境的上机实验打破了教师规定实验题目和步骤,学生按部就班进行实验的传统模式。基于同步协同上机实验系统的上机实验完全以学生为主体,教师只起组织和引导作用;实验内容完全开放;学生在交流和协作中,进行研究性自主学习;实验学习成绩的评定不再单纯根据实验结果或实验报告,实现了实验学习评价的多元化和智能化。因此,研究基于同步协同上机实验系统的实验学习评价对于提高上机实验的教学质量非常重要。

二、同步协同上机实验系统简介

同步协同上机实验系统的目标是适应不同层次学生的需要,实现教学内容的开放性;促进学生之间交流和协作,以及教学双方的有效交流与互动;实现实验学习评价的多元化和智能化。系统的功能和模块结构划分如图1所示,包括协同上机实验、实验成绩管理、实验教学管理和系统管理四个模块。

采用同步协同上机实验系统作为支撑环境的上机实验过程一般是:(1)学生根据课程的进度预约实验;预约成功后,得到实验的时间、地点、目标要求和可选的实验任务;然后收集资料,自主学习准备实验。(2)在上机实验时,学生首先登录同步协同上机实验系统,协同完成实验任务,评价其他同学的实验方案、算法或运行结果;遇到问题可到讨论区求助;教师引导、辅助学生完成实验任务,评价实验任务。(3)在上机实验结束时,学生提交自我评价,系统辅助生成实验报告,并结合同学评价和教师评价成绩得出学生的上机实验成绩。

这种上机实验确定了具体的实验教学目标,并分解出了用于实验考核的基本实验教学目标。另外,根据实验目标设计了多项实验任务,供学生选择和修改;每项实验任务能够达到一项或多项实验目标。

三、上机实验学习评价的目的、功能和特点

上机实验学习评价是实验教学环节的重要组成部分,其目的在于促进学生学习。因此,上机实验学习评价旨在增强学生对于操作技能和理论知识的掌握和应用水平的了解;激励学生上机实验的积极性和主动性;端正学生的实验态度。基于同步协同上机实验系统的上机实验学习评价具有以下特点:

1.具有人文特性

基于同步协同上机实验系统的实验学习评价是体现“以人为本”的主体性评价,即“人文性”评价。因此,能最大限度地激发学生的内部动力,促进学生的自我发展。

2.形成性评价与总结性评价相结合

对学习结果的评价有助于帮助学生总结实验过程中的多种收获与体验,强化学生通过实验掌握的知识;而对学习过程的评价,可在不同程度上激发学生上机实验的积极性和主动性,帮助学生不断调整和改善实验过程,保证上机实验的学习质量。因此,不仅要重视学生的上机实验结果,而且要注意学生上机实验的整个过程。另外形成性评价应贯穿于上机实验的全过程,注重成绩背后的动机取向和努力程度,反映学生的操作能力、知识应用能力、协作能力、组织能力和创新能力等,以促进各种能力的培养。在不同课程的上机实验中,还应注重形成性评价与总结性评价各自权重的探索。

3.评价主体的多元性

评价是一种价值判断过程,这种价值是多元的。在评价情境中,不论评价者还是被评价者,不论教师还是学生,都是平等的主体。评价的主客体也应是多元的。[1] 因此基于同步协同上机实验系统的实验学习评价包括互相评价、自我评价、小组评价和教师评价四个部分。

互相评价是指学生在上机实验过程中,参考或验证其他同学的实验方案、算法和运行结果后给出的评价。其目的在于发现其他同学的优点及促进同学间的交流。

自我评价包括在实验准备阶段和在上机实验过程中的自我评价,以及在上机实验结束时提交的自我评分。

小组评价是指组长对于组内成员的评价。协同任务组是学生自发形成的;任务组的学生可以相互交流与协作共同完成一个任务;一个学生可以参加多个任务组。

教师评价指辅导教师在实验过程中,对于实验任务或学生的评价。对于每个学生和实验任务,教师评价不是必需的,其目的是通过评价引导上机实验的进行。

4.评价手段的数字化

在基于同步协同上机实验系统的上机实验中,学生通过同步协同上机实验系统进行交流与协作。辅导教师可以面对面辅导,也可以通过同步协同上机实验系统完成应答提问、删除与实验无关的讨论、删除不符合实验要求的任务和发布公开消息等辅导任务。因此大部分实验教学活动都基于同步协同上机实验系统完成,数字化信息是上机实验的重要载体。评价的表达以及数据的收集和整理呈现出数字化特征。

5.评价方式的开放性

基于同步协同上机实验系统的上机实验内容是开放的;不仅可以选择和修改,还可以自己设计实验任务。实验学习评价的内容也具有适当的开放性,而且评价既要适合于课程,又不局限于课程,能够体现学生在上机实验中的能力培养。通过评价不仅促进学生的学习,还要促进学生学会如何学习。

6.评价形式和标准的多样化

相对于一元智力理论和智力评价理论,多元智能理论能够更为准确地描绘和评价人类能力。[2] 实验教学在培养学生的动手能力和独立分析问题、解决问题的能力等方面起着决定性的作用。[3] 这决定了上机实验评价必须对学生进行多层面能力的考核,因此,评价形式和标准应该是多元的。在基于同步协同上机实验系统的上机实验中,可以针对实验任务的设计、实验方案的设计、程序运行情况、提出的问题、以及解决的问题进行多种形式的评价,各种评价贯穿于整个实验过程中。实验学习评价改变了单纯用实验数据结果和实验报告来衡量学生的成绩的方式,注重学生个体的实际情况和差异性。

四、上机实验评价的实施

同步协同上机实验系统作为上机实验的支撑环境,对上机实验的评价提供全方位的支持。基于同步协同上机实验系统的实验学习评价实施,一般要经过以下五个环节:

1.确定实验目标和可选的实验任务

实验目标作为实验评价的基础,根据实验教学大纲确定。为便于评价,实验目标必须详细、明确而具体。在此基础上,从中分解出基本目标。基本目标指学生通过实验最低限度掌握的知识点和基本技能或具备的基本能力。

实验教师根据实验目标设计多项实验任务,每项任务对应一个或多个实验目标。学生可以从中选择或修改实验任务,也可以自己设计实验任务;但是实验任务与实验目标的对应关系必须合理,否则会影响评价结果,甚至被辅导教师删除。

2.构建实验学习评价的评价模型

评价模型作为评价的依据和前提,应围绕实验目标的完成和多层次能力的培养来构建,旨在促进学生的发展。评价模型主要包括评价指标、质量等级和评分方法三个部分。评价指标反映达到实验目标和具备能力的各个方面;质量等级描述评价指标在质量上从好到差的档次,一般为优、良、及格和不及格;评分方法指整体评分和分项评分的计算方法,包括各个评价指标的标准分值。评价模型由实验教师根据学科特点和上机实验经验,与学生共同商定。在与学生共同商量的过程中,让学生掌握每项指标的含义,以及互相评价和自我评价的方法。例如基于同步协同上机实验系统的《VB程序设计》上机实验的自我评价表见表1,其中总分S=1.0a+0.8b+0.6c+0.4d(其中a、b、c、d分别是等级A、B、C、D对应指标的标准分值之和)。对于表1的评价结果,系统自动计算总分为:

S=1.0×(30+30+2)+0.8×(6+3+2+4)+0.6×(6+6+2)+0.4×9=86

3.在上机实验中不断进行评价

在上机实验过程中,学生要参考其他同学的实验内容或查阅问题的回答,系统强制必须在继续其它工作前进行评价;学生也可以自觉对其他同学的提问、问题的回答、任务设计、实验方案、算法和运行情况等进行评价。为了保证评价的公正性,系统仅显示每个同学的网名;为了激励学生的实验,学生可以随时查看自己当前的总评结果。辅导教师也可以对提问、问题的回答、任务设计、实验方案、算法和运行情况等进行评价,但不是必需的。学生在实验结束提交时,系统强制学生提交自我评价信息。

4.系统自动进行公正的评定与分析

在全部学生提交实验后,系统自动根据评价模型计算评价结果,并对评价结果进行分析,为每个学生提供改进性建议。

5.对评价结果进行反思

实验结束后,学生可以随时登录系统,查阅自己的实验成绩和改进建议,反思自己的行为。通过反思了解自己有哪些不足,哪些方面需要继续努力,促进实验学习。

五、结论

文章探讨了基于同步协同上机实验系统的实验学习评价,指出了评价的目标、应具备的特点和实施过程。这种实验学习评价能够激发学生在上机实验中进行创新性自主学习的积极性和主动性;有利于培养学生的多种能力、协作和创新精神;实现了实验成绩评定的多元化和智能化,降低了辅导教师的工作量;适合进行实验教学的多种改革研究。[4][5][6] 实践证实,基于同步协同上机实验系统的实验学习评价可操作性强,节约了辅导教师和学生的大量时间。

参考文献:

[1]赵蓉. 改进课堂学习评价的对策[J]. 思想政治课教学, 2006.1:81-83.

[2]任一波. 由多元智能理论引发对高职生学习评价的思考[J]. 浙江工商职业技术学院学报, 2006.1(5):91-93.

[3]原丕业,杜秀云,王军英. 高校实验教学改革初探[J]. 中国成人教育,2004.8:52-53.

[4]郑胜林,潘保昌, 徐杜等. 互动式实验教学模式之研究[J].高教探索,2004.1:80-81.

[5]贾雪枫. 创造性研究型教学模式初探[J]. 教育探索,2004.1:18-21.

篇5:进程调度实验报告

实验类型:实验名称:实验地点:

学生姓名:班 级:

操作系统 实验报告

必 修 实验日期:2014年4月18日进程调度 二实验楼504 李帅帅 指导教师:张 磊 计科一班 计算机科学与技术系

天津大学仁爱学院——计算机科学与技术系——李帅帅

实验报告内容:

1)实验目的

用c语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。

2)实验器材和设备

硬 件: 二实验楼504计算机

开发工具: Microsoft Visual C++ 6.0

3)实验任务

本实验模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解。用c语言编写和调试一个进程调度的算法程序,有一些简单的界面,能够运行,仿真操作系统中进程调度的原理和过程。通过对调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度

4)实验原理

无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。

基本状态:1.等待态:等待某个事件的完成;

2.就绪态:等待系统分配处理器以便运行; 3.运行态:占有处理器正在运行。

运行态→等待态 往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。

等待态→就绪态 则是等待的条件已满足,只需分配到处理器后就能运行。运行态→就绪态 不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。

就绪态→运行态 系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态

5)实验过程描述

a)打开Microsoft Visual C++ 6.0,创建工程。

b)根据要求用 c语言代码实现应用程序,并调试完成。c)运行程序,根据提示输入相应的字符。

d)输入实验测试内容,并观察执行窗口显示的过程。

天津大学仁爱学院——计算机科学与技术系——李帅帅

q=(struct pcb *)malloc(sizeof(pcb));

cin>>q->name;

cin>>q->needtime;

q->cputime=0;

q->priority=P_TIME-q->needtime;

q->process=ready;

q->next=NULL;

if(i==0)

{

p=q;

t->next=q;

}

else

{

q->next=t->next;

t=q;

q=p;

}

i++;} return p;}

void display(pcb * p){ cout<<“name”<<“ ”<<“cputime”<<“needtime”<<“ ”<<“priority”<<“ ”

<<“state”<

cout<

name;

cout<<“ ”;

cout<

cputime;

cout<<“ ”;

cout<

needtime;

cout<<“ ”;

cout<

priority;

cout<<“ ”;

switch(p->process)

{

case ready:cout<<“ready”<

case execute:cout<<“execute”<

case block:cout<<“block”<

case finish:cout<<“finish”<

}

天津大学仁爱学院——计算机科学与技术系——李帅帅

void priority_cal(){ pcb * p;system(“cls”);p=get_process();int cpu=0;system(“cls”);while(!process_finish(p)){

cpu++;

cout<<“cuptime:”<

cpuexe(p);

display(p);

Sleep(1000);} printf(“All processes have finished,press any key to exit”);getch();}

void display_menu(){ cout<<“nCHOOSE THE ALGORITHM:”<

pcb *get_process_round(){ pcb *q;pcb *t;pcb *p;int i=0;t=(struct pcb *)malloc(sizeof(pcb));p=(struct pcb *)malloc(sizeof(pcb));cout<<“input name and time”<q=(struct pcb *)malloc(sizeof(pcb));

cin>>q->name;

cin>>q->needtime;

q->cputime=0;

天津大学仁爱学院——计算机科学与技术系——李帅帅

{

} } return t;}

void set_state(pcb *p){ while(p){

if(p->needtime==0)

{

p->process=finish;//如果所需执行时间为0,则设置运行状态为结束

}

if(p->process==execute)

{

p->process=ready;//如果未执行状态则设置为就绪

}

p->next;} }//设置队列中进程执行状态 void display_round(pcb *p){ cout<<“NAME”<<“ ”<<“CPUTIME”<<“ ”<<“NEEDTIME”<<“ ”<<“COUNT”<<“ ”<<“ROUND”

<<“ ”<<“STATE”<

cout<

name;

cout<<“ ”;

cout<

cputime;

cout<<“ ”;

cout<

needtime;

cout<<“ ”;

cout<

count;

cout<<“ ”;

cout<

round;

cout<<“ ”;

switch(p->process)

{

case ready:cout<<“ready”<

case execute:cout<<“execute”<

case finish:cout<<“finish”<

天津大学仁爱学院——计算机科学与技术系——李帅帅

篇6:操作系统进程同步实验

关键词:永磁同步电机,仿真系统,实验研究

0 引言

永磁同步电动机以永磁体提供励磁, 使电动机结构较为简单, 降低了加工和装配费用, 且省去了容易出问题的集电环和电刷, 提高了电动机运行的可靠性;又因无需励磁电流, 没有励磁损耗, 提高了电动机的效率和功率密度, 因而它是近几年研究较多并在电动汽车、家用电器等领域应用越来越广泛的一种电动机[1,2,3]。在节约能源和环境保护日益受到重视的今天, 对其研究就显得尤为必要。但是, 永磁同步电机也有成本高、不易启动、外围电路复杂、控制算法复杂等问题[4]。

本文在传统的PID控制算法的理论基础上, 实现永磁同步电机的反馈控制, 然后对整个系统进行仿真, 在MATLAB中建立了永磁同步电机控制系统的仿真模型。最后基于STM32微控制器建立了永磁同步电机的实际控制系统, 通过实际测试检验永磁同步电机的运行性能。

1 仿真实验研究

利用MATLAB/SIMULINK提供的永磁同步电动机模型, 建立永磁同步电机的仿真系统。该系统主电路由模块直流电源DC、逆变器和永磁同步电动机组成, 永磁同步电动机的励磁类选择正弦波, 反馈闭环回路包括电流和转速的PID闭环反馈。仿真模型如图一所示。

图一中, ASR为转速调节器, 比例系数Kpn=11.7, 积分系数Kin=140;ACR为电流调节器, 比例系数Kpi=10.7, 积分系数Kii=80。ASR和ACR都采用了PID控制策略, 共同构成速度电流双闭环控制结构。PMSM模块参数设置为:定子电阻r=2.875Ω;励磁磁通0.175Wb;定子d轴电感Ld=0.0085H;定子q轴电感Lq=0.0085H;转动惯量J=0.008kg·m2;极对数p=1。模型中的放大器Gain1用于调整dqo-abc模块输出三相调制信号幅值, Gain2用于调整定子三相电流反馈信号的幅值, Gain3用于设定电动机的极对数, 设置直流电源DC为300V, 输入转速为ω=2000rad/s, d轴的电流i*sd=0。

经过上述参数设置后, 永磁同步电机仿真系统电流、转矩、转速响应如图二所示。图二 (a) 为转速响应, 仿真时给定速度为2000rad/s, 以空载启动, 在时刻0.1秒加载到2N·m, 转速稍有波动。由图可见, 电机的启动速度很快, 且能准确快速跟踪给定速度。图二 (b) 为三相定子的电流波形。图二 (c) 为电动机转矩的波形。图二 (d) 为定子电流的转矩分量iq和励磁分量id。仿真实验结果表明, 波形符合理论分析, 系统能平稳运行, 并具有较好的静、动态特性。

2 基于STM32的实验系统

STM32F103LD因具有以下特点使其适合于伺服电机控制场合: (1) 马达专用定时器TIM; (2) 高精度脉宽调制波PWM; (3) 多通道高精度A/D转换器; (4) 实现电流同时采样。

基于以上特点, 建立了图三所示的基于STM32的永磁同步电机控制系统。采用的永磁同步电机 (PMSM) 型号为42JSF330AS, 主要参数为额定电压24V, 额定功率32W, 额定力矩0.1NM, 额定转速3000rpm, 8磁极。STM32F103作为中央处理器完成所有的坐标变换、信号采集和算法处理等任务, 通过串口与上位机通信, 将电机工作的实时参数, 包括速度和电流等, 实时上传到PC机进行实时监控, 通过键盘设定电机的工作速度, 液晶显示屏实时显示各种参数信息, 通过霍尔HALL传感器测量电机转速, 并同时确定电机转子位置关系, 通过A/D测量系统的电压、电流和温度参数, 并对电压、电流和温度进行故障综合和故障保护。产生的PWM信号经过驱动电路放大后进入三相逆变电路, 驱动PMSM电机运转。

整个系统主要由以下部分组成:STM32主控制板、电源驱动板、下载工具J-LINK、永磁同步电机42JSF330AS、直流稳压电源、泰克双通道示波器和PC电脑。测试的典型波形如图四所示。

图四 (a) 是同时测得两相相电压的SVPWM展开示意图。通过实际观测图四 (b) 可见PWM脉宽为空间矢量调制。图四 (c) 为上位机上显示的设定速度和实时速度的采集曲线。黄色表示设定值, 红色表示实时测量速度图, 其中红色归零部分表示电机停止, 红色上升斜坡部分表示电机启动加速过程, 红黄重叠部分表示速度跟踪调节变化图。由此可见, 电机已经运行在良好的启动特性和速度跟踪特性上。

3结束语

永磁同步电机具有传统电机无可比拟的优势, 因此对永磁同步电机的研究具有重要的理论价值和实际应用价值。由于采用了ST的官方FOC磁场定向控制固件库, 可以很方便地将程序应用到自己的硬件系统当中。今后笔者将继续深入研究永磁同步电机的控制原理, 积极创造大功率永磁同步电机的开发条件, 努力掌握大功率永磁同步电机的实际应用水平。

参考文献

[1]王凤琥, 孙跃东.电动汽车传动系统方案研究[J].制造业自动化, 2012, (03) :75-78.

[2]许峻峰, 张朝阳, 冯江华, 等.电动公交车用永磁同步电机实验研究[J].大功率变流技术, 2008, (06) :38-40.

[3]张洁.简论纯电动汽车的驱动电机及其控制系统[J].国内外机电一体化技术, 2012, (03) :40-41.

上一篇:春夜喜雨作文下一篇:海南侨中体育科组2009—2010学年度第一学期工作总结