题意:

模拟n个程序运行

格式一共有5种:var = constant(赋值);print var(打印);lock;unlock;end,

上述5种语句分别需
要t1、t2、t3、t4、t5单位时间

运行态的程序每次最多运行Q个单位时间(称为配额)

一个程序的配额用完之后,把当前语句(如果存在)执行完之后该程序会被插入一个等待队
中,然后处理器从队首取出一个程序继续执行。

lock的作用是申请对所有变量的独占访问。lock和unlock总是成对出现,并且不会嵌套。
lock总是在unlock的前面。当一个程序成功执行完lock指令之后,其他程序一旦试图执行lock
指令,就会马上被放到一个所谓的阻止队列的尾部(没有用完的配额就浪费了)。当unlock
执行完毕后,阻止队列的第一个程序进入等待队列的首部。

输出运行程序的print

分析:

这道题题目很长,理解会有点困难, 没看过原题做的话会有挺多坑。

1.executed when the time quantum expires will be allowed to complete.

就是如果执行完当前指令后Q<0, 那么这个程序仍然可以运行, 之后就会结束运行

2.独占访问我一开始理解为如果被一个程序lock了, 那么只有这个lock程序可以修改变量, 其实并不是, lock后其他程序仍然可以修改变量。

3.那么这题就可以看成2个队列的模拟题了, 一个等待队列deque, 一个阻止队列queue。

4.一开始将所有数据先输入一个数组中, 然后用一个数组记录每个程序的初始行号, 这样模拟会比较方面。

5.找出不同指令的不同点, 用switch一次判断出来。

#include <bits/stdc++.h>
using namespace std;
const int maxl = ;
char pg[maxl][];
int n, quan, locked,t[], pgline[maxl];
int val[];
deque<int> Wait;
queue<int> Block;
void run(int num)
{
int q = quan;
while(q > ){
char *str = pg[pgline[num]];
switch(str[]){
case '='://var
val[str[] - 'a'] = isdigit(str[]) ?(str[] - '') * + str[] - '': str[] - '';
q -= t[];
break;
case 'i':// print
printf("%d: %d\n", num + , val[str[]-'a']);
q -= t[];
break;
case 'c': // lock
if(locked){
Block.push(num);
return;
}
locked = ;
q -= t[];
break;
case 'l': // unlock
locked = ;
if(!Block.empty()){
Wait.push_front(Block.front());
Block.pop();
}
q -= t[];
break;
case 'd': // end
return;
}
pgline[num] ++;
}
Wait.push_back(num);
} int main()
{ int T;
scanf("%d", &T);
while(T--){
int line = ;
memset(pgline,,sizeof(pgline));
memset(pg,,sizeof(pg));
memset(val,,sizeof(val));
scanf("%d %d %d %d %d %d %d ", &n, &t[], &t[], &t[], &t[], &t[], &quan);
for(int i = ; i < n; i++){
gets(pg[line++]);
pgline[i] = line - ;
while(pg[line-][] != 'd')
gets(pg[line++]); Wait.push_back(i);
} locked = ;
while(!Wait.empty()){
int pick = Wait.front();
Wait.pop_front();
run(pick);
}
if(T)
printf("\n");
}
return ;
}

UVa 210 并行程序模拟(deque)的更多相关文章

  1. uva 210 - Concurrency Simulator (并行程序模拟)

    from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...

  2. 6-1 并行程序模拟 uva210

    用到了 deque 和queue 操作说明: queue  qu:      qu.push(x); int d=qu.front(); qu.pop();        和栈一样只有push和pop ...

  3. 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)

    任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...

  4. 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计

    基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...

  5. WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

    原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...

  6. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师链接:https://www.zhihu.com/question/27654579/answer/1 ...

  7. N体运动的程序模拟

    这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引 ...

  8. C程序模拟实现银行家算法

    C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...

  9. JAVA并行程序基础

    JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级 ...

随机推荐

  1. Redis操作命令大全

    一.key pattern 查询相应的key (1)redis允许模糊查询key 有3个通配符  *.?.[] (2)randomkey:返回随机key (3)type key:返回key存储的类型 ...

  2. 团队作业-项目Alpha版本发布

    一. 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cn ...

  3. LightOj 1074 Extended Traffic (spfa+负权环)

    题目链接: http://lightoj.com/volume_showproblem.php?problem=1074 题目大意: 有一个大城市有n个十字交叉口,有m条路,城市十分拥挤,因此每一个路 ...

  4. _bzoj1026 [SCOI2009]windy数【数位dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位dp果断记忆化搜索,代码量少~ 程序里我用11代表前导零. #include &l ...

  5. bzoj 1858: [Scoi2010]序列操作 || 洛谷 P2572

    记一下:线段树占空间是$2^{ceil(log2(n))+1}$ 这个就是一个线段树区间操作题,各种标记的设置.转移都很明确,只要熟悉这类题应该说是没有什么难度的. 由于对某区间set之后该区间原先待 ...

  6. selenium通过autoit实现上传和下载

    autoit安装目录如下: AutoIt Windows Info   用于帮助我们识Windows控件信息. Compile Script to.exe 用于将AutoIt生成 exe 执行文件. ...

  7. poj3735Training little cats

    链接 构造矩阵 快速幂求解 构造矩阵a[i]为每个cati所拥有的花生总数 这里多加一维用来求和,具体是怎么求得可以看下面的一组例子 假设有3个cat a[] = {1,0,0,0} 构造单位矩阵来保 ...

  8. MYSQL5.7 忘记ROOT密码/初始化ROOT密码

    编辑my.cnf允许空密码登录 [root@7Core ~]# vi /etc/my.cnf #在[mysqld]下加入一行 skip-grant-tables=1 重新启动Mysql服务 [root ...

  9. quazip非静态成员。。错误

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7147155.html 问题:quazip非静态成员..错误 解决方案:quazip_global.h  第42 ...

  10. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...