社区
C++ 语言
帖子详情
怎样在C语言中编写让多个程序并发执行的程序
wzyu
2003-09-21 09:25:20
谢谢了!
...全文
758
10
打赏
收藏
怎样在C语言中编写让多个程序并发执行的程序
谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
单任务操作系统下不能并发执行.
多任务操作系统下通过系统调用并发.
操作系统课程设计银行家算法
C语言
操作系统 课程设计任务书 银行家算法 1)了解多道
程序
系统
中
,
多个
进程
并发
执行
的资源分配。 2)掌握银行家算法,了解资源在进程
并发
执行
中
的资源分配情况。 3)掌握预防死锁的方法,系统安全状态的基本概念。 设计一个n个
并发
进程共享m个系统资源的
程序
以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用和剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 4) 撤销作业,释放资源。
编写
和调试一个系统动态分配资源的简单模拟
程序
,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。
c语言
多进程多线程编程.pdf
进程是一个具有独立功能的
程序
关于某个数据集合的一次而可以
并发
执行
的运行活动,是处于活动状态的计算机
程序
。进程作为构成系统的基本细胞,不仅是系统内部独立运行的实体,而且是独立竞争资源的基本实体。 进程是资源管理的最小单位,线程是
程序
执行
的最小单位。进程管理着资源(比如cpu、内存、文件等),而将线程分配到某个cpu上
执行
。再操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器系统和减小上下文件切换开销。
现代C++
并发
编程-初级篇
本课程是现代C++
并发
编程的初级篇,在这部分课程
中
,你会学习pthread线程管理多进程编程现代C++
中
线程管理锁的正确使用事件机制时间库等讲解在这里,我们可以从0到1实现一个Thread类,我们可以看看gcc内部是如何实现std::unique_lock等。学会初级篇,我们可以利用锁来
编写
基本的多线程
程序
。
操作系统银行家算法避免进程死锁问题
安全性算法,银行家算法,避免进程死锁的问题,这是我用
C语言
编的
程序
,运行通过。
(Linux C)利用多进程或多线程模拟实现生产者/消费者问题
Linux
C语言
实现利用多进程或多线程模拟实现生产者/消费者问题。 (站在巨人的肩膀上) Linux
C语言
实现利用多进程或多线程模拟实现生产者/消费者问题。 (站在巨人的肩膀上)
C++ 语言
64,681
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章