怎样在C语言中编写让多个程序并发执行的程序

wzyu 2003-09-21 09:25:20
谢谢了!
...全文
758 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangning111 2003-11-07
  • 打赏
  • 举报
回复
看看《操作系统》吧
Robin 2003-11-06
  • 打赏
  • 举报
回复
走召弓虽!
wangwubian 2003-11-04
  • 打赏
  • 举报
回复
我有进程并发过程模拟实验不知符不符合老兄要求:

实验一:进程并发过程模拟
一、实验目的
练习编写系统程序,模拟信号量机制的实现,模拟进程调度时上、下文的切换,并演示特定进程的整个并发过程。
二、实验内容(供参考,可自行设计模拟内容)
1. 模拟并发进程共享的临界资源m1、m2,它联系着两个信号量sem1、sem2.
2. 模拟并发进程的运行现场:通用寄存器i,程序计数器addr.
3. 模拟三个并发进程(其程序文本附后).
三、数据结构
1. 临界资源:
int m1,m2; /*将其初始化为0*/
2. 进程现场信息:
int i; /*将其初始化为0*/
char addr; /*将其初始化为’0’*/
3. 进程控制块PCB:
struct
{
int id; /*为简单见,用1,2,3表进程名*/
char status;/*用’r’表ready,’b’表blocked*/
int waiter; /*若进程等待在信号量上,则下一个等待进程的id放在这里*/
}pcb[4];
4. 中断保护栈:
struct
{
int g; /*保存进程释放cpu时通用寄存器之值*/
char ad; /*保存进程释放cpu时的断点地址*/
}stack[4];
5. 信号量机制:
struct {
int value; /*信号量之值,初值为0*/
int waiter; /*等待队列队首进程的id*/
}sem[3];


四、系统结构图

demo


init scheduler

find

Task1 Task2 Task3


p v

1. 整个程序用c语言编写,演示程序demo为主控程序, init为初始化, scheduler实现进程调度,从scheduler返回后演示结束.
2. scheduler调用find寻找一个就绪进程.
3. find采用优先权的进程调度算法,规定优先权反比于进程的id,将选中的id返回给scheduler.
4. p(se,pd,ad)
int se; /*值为1,2,分别表示sem[1],sem[2]*/
int pd; /*调用p操作的进程的id*/
char ad; /*调用p操作时现场地址*/
若p操作成功,返回值为1并继续运行原进程;
若p操作失败,阻塞当前进程,保护现场返回0值后回到scheduler重新调度.
5. v(se,pd,ad)
int se; /*表示sem1和sem2*/
int pd; /*调用v操作的进程号*/
char ad; /*调用v时的现场地址*/
若sem[se].value>0 返回1值后继续运行原进程
若 sem[se].value<0 从sem[se].waiter链中唤醒队首进程,保护当前现场后返回
0值并转由scheduler重新调度.
6. scheduler
循环调度直至进程全部阻塞后返回demo结束演示。若find返回值为i,则为task i恢复运行现场后使进程taski运行.
五、并发进程参考文本
task1()
{ if(addr==’m’) goto m;
printf(“task1 running\n”);
i=1;
a: printf(“task1 calls p on sem1\n”);
if(p(1,1,’m’)==0 return(0);
m: printf(“task1 printing m1=%d\n”,m1);
printf(“task i=%d\n”,i);
i=i+5;
goto a;
}

task2()
{ if(addr==’m’) goto m;
if(addr==’n’) goto n;
printf(“task2 running\n”);
a: printf(“task2 calls p on sem2\n”);
if(p(2,2,’m’)==0) return(0);
m: m1=2*m2;
printf(“task2 calls v on sem1 m1=%d\n”,m1);
if(v(1,2,’n’)==0) return(0);
n: printf(“task2 i=%d\n”,i);
i=i+10;
goto a;
}

task3()
{
if(addr==’m’) goto m;
if(addr==’n’) goto n;
printf(“task3 running\n);
i=1;
a: if(i>4) goto b;
m2=i;
printf(“task3 calls v on sem m2=%d\n”,m2);
if(v(2,3,’m’)==0) return(0);
m: i++;
goto a;
b: printf(“task3 calls p on sem2\n”);
if(p(2,3,’n’)==0) return(0);
n: ;
}
六、实验要求
在提交的实验报告中,必须包含如下内容:
(1) 设计思想、系统结构图、数据结构及程序流程图.
(2) 调试通过的源程序清单(含必要注释)及运行结果。
七,源程序
#include <stdio.h>
int m1,m2;
int i;
char addr;
struct
{int id;
char status;
int waiter;
}pcb[4];
struct
{int g;
char ad;
}stack[4];
struct
{int value;
int waiter;
}sem[3];
Digui (int j)
{if(pcb[j].waiter!=0) Digui(j=pcb[j].waiter);
else return j;
}
/*p操作*/
p(int se,int pd,char ad)
{sem[se].value=sem[se].value-1;
if(sem[se].value>=0) return 1;
else {stack[pd].g=i; stack[pd].ad=ad;
if(sem[se].waiter==0) sem[se].waiter=pd;
else{pcb[Digui(sem[se].waiter)].waiter=pd; pcb[pd].waiter=0;}
pcb[pd].status='b';
return 0;}
}
/*v操作*/
v(int se,int pd,char ad)
{sem[se].value=sem[se].value+1;
if(sem[se].value<0) return 1;
else if(sem[se].value>=0) {stack[pd].g=i; stack[pd].ad=ad;
pcb[sem[se].waiter].status='r'; sem[se].waiter=pcb[sem[se].waiter].waiter; pcb[sem[se].waiter].waiter=0;
return 0;}
}
task1()
{if(addr=='m') goto m;
printf("task1 running\n");
i=1;
a: printf("task1 calls p on sem1\n");
if(p(1,1,'m')==0) return (0);
m: printf("task1 printing m1=%d\n",m1);
printf("task1 i=%d\n",i);
i=i+5;
goto a;
}
task2()
{if(addr=='m') goto m;
if(addr=='n') goto n;
printf("task2 running\n");
a: printf("task2 calls p on sem2\n");
if(p(2,2,'m')==0) return(0);
m: m1=2*m2;
printf("task2 calls v on sem1 m1=%d\n",m1);
if(v(1,2,'n')==0) return(0);
n: printf("task2 i=%d\n",i);
i=i+10;
goto a;
}
task3()
{if(addr=='m') goto m;
if(addr=='n') goto n;
printf("task3 running\n");
i=1;
a: if(i>4) goto b;
m2=i;
printf("task3 calls v on sem m2=%d\n",m2);
if(v(2,3,'m')==0) return(0);
m: i++;
goto a;
b: printf("task3 calls p on sem2\n");
if(p(2,3,'n')==0) return(0);
n: ;
}
void init()
{int j;
m1=0;m2=0;
i=0;addr=0;
for(j=1;j<=3;j++) {pcb[j].id=j; pcb[j].status='r';pcb[j].waiter=0;}
for(j=1;j<=2;j++) {sem[j].value=0;sem[j].waiter=0;}
for(j=1;j<=3;j++) {stack[j].g=0;stack[j].ad='0';}
}
find()
{int j=0;
int s,first;
for(s=1;s<=3;s++) if(pcb[s].status=='b') j++;
if(j==3) return first=0;
else {first=3;
for(s=1;s<=3;s++) if(pcb[s].status=='r'&&pcb[s].id<first) first=pcb[s].id;
i=stack[first].g;addr=stack[first].ad;
return first;}
}
scheduler()
{switch(find())
{case 0 : {printf("All the process have been blocked.\n");
printf("End!\n");
return 0;}
case 1 : if(task1()==0) scheduler();return 1;break;
case 2 : if(task2()==0) scheduler();return 1;break;
case 3 : if(task3()==0) scheduler();return 1;break;
}
}
demo()
{printf("Perform begin!\n");
init();
scheduler();
}
main()
{demo();
}
八,运行结果
Perform begin!
task1 running
task1 calls p on sem1
task2 running
task2 calls p on sem2
task3 running
task3 calls v on sem m2=1
task2 calls v on sem1 m1=2
task1 printing m1=2
task1 i=1
task1 calls p on sem1
task2 i=0
task2 calls p on sem2
task3 calls v on sem m2=2
task2 calls v on sem1 m1=4
task1 printing m1=4
task1 i=6
task1 calls p on sem1
task2 i=10
task2 calls p on sem2
task3 calls v on sem m2=3
task2 calls v on sem1 m1=6
task1 printing m1=6
task1 i=11
task1 calls p on sem1
task2 i=20
task2 calls p on sem2
task3 calls v on sem m2=4
task2 calls v on sem1 m1=8
task1 printing m1=8
task1 i=16
task1 calls p on sem1
task2 i=30
task2 calls p on sem2
task3 calls p on sem2
All the process have been blocked.
End!

noscar 2003-11-02
  • 打赏
  • 举报
回复
看<process.h>
Paradise2004 2003-11-02
  • 打赏
  • 举报
回复
不妨考虑一下中断技术,我看到过的
biyuntian 2003-09-23
  • 打赏
  • 举报
回复
我觉得上面的仁兄是不是想涉及到函数再入性的问题。
skywater 2003-09-23
  • 打赏
  • 举报
回复
你指的是同一个程序的多个实例,还是不同程序的实例?
如果是前者,那么使用子进程。如果是后者,使用系统调用。
Wolf0403 2003-09-23
  • 打赏
  • 举报
回复
CreateProcess 一组4个函数
还有 Fiber 之类(不了解)
doer_ljy 2003-09-22
  • 打赏
  • 举报
回复
window下有系统API可以创建进程。
linux/unix下有fork复制进程!
kinogre 2003-09-22
  • 打赏
  • 举报
回复
单任务操作系统下不能并发执行.
多任务操作系统下通过系统调用并发.

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧