UVa 210 并行程序模拟(deque)
题意:
模拟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)的更多相关文章
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
- 6-1 并行程序模拟 uva210
用到了 deque 和queue 操作说明: queue qu: qu.push(x); int d=qu.front(); qu.pop(); 和栈一样只有push和pop ...
- 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)
任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...
- 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计
基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...
- Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师链接:https://www.zhihu.com/question/27654579/answer/1 ...
- N体运动的程序模拟
这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引 ...
- C程序模拟实现银行家算法
C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...
- JAVA并行程序基础
JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级 ...
随机推荐
- poj 2632 Crashing Robots 模拟
题目链接: http://poj.org/problem?id=2632 题目描述: 有一个B*A的厂库,分布了n个机器人,机器人编号1~n.我们知道刚开始时全部机器人的位置和朝向,我们可以按顺序操控 ...
- JDK6中System.getProperties返回键值说明
JDK6中java.lang.System.getProperties()方法返回键值说明. 键 相关值的描述 java.version Java 运行时环境版本 java.vendor Java 运 ...
- Activity的onSaveInstanceState和onRestoreInstanceState触发的时机
转自:http://www.cnblogs.com/heiguy/archive/2010/10/30/1865239.html 1.原文 先看Application Fundamentals上的一段 ...
- Oracle代码 规则 创建表 表空间 用户等
-----创建表空间----------create tablespace bdccslogging datafile 'D:\oracle\product\10.2.0\oradata\bdccs\ ...
- hdu 5036 Explosion bitset优化floyd
http://acm.hdu.edu.cn/showproblem.php?pid=5036 题意就是给定一副有向图,现在需要走遍这n个顶点,一开始出发的顶点是这n个之中的随便一个. 如果走了1,那么 ...
- spark测试脚本-笔记
1)Spark配置&启动脚本分析 http://www.cnblogs.com/riordon/p/5732208.html
- CAS server 连接mysql的deployerConfigContext.xml配置
1.deployerConfigContext.xml配置 <?xml version="1.0" encoding="UTF-8"?> <b ...
- linux下mysql开启可访问
修改mysql配置连接信息 将bind-address注释 vim /etc/my.cnf 修改mysql用户授权 mysql>GRANT ALL PRIVILEGES ON *.* TO ' ...
- iOS---数据离线缓存
离线缓存 为了用户的体验,不需要每次打开App都加载新数据,或者重新请求数据,因此需要把每次浏览的数据保存起来,当下次打开软件时,首先从沙盒中加载数据:或者当软件未联网时,也只能从沙盒中加载旧数据. ...
- vba,excel,身份证,照片
Sub 插入图片() '调整单元格大小,以适应图片大小 功能 插入身份证照片打印 - 正面在单元格d6 反面单元格d10 ActiveSheet.Pictures.Delete '清理过期 ...