题意:

模拟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. python产生时间

    原来Python在1991年就产生了,google最开始也是两个斯坦福的研究生用Python写的爬虫构建的

  2. 标准字符cp功能

    #include<stdio.h> #include<fcntl.h> int main(int argc,char *argv[]) { FILE *src_fp,*des_ ...

  3. 436 Find Right Interval 寻找右区间

    给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”.对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着 ...

  4. 202 Happy Number 快乐数

    写一个算法来判断一个数是不是“快乐数”.一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或是无限循环但始终变不到 1.如 ...

  5. [译]curl_multi_add_handle

    NAMEcurl_multi_add_handle - add an easy handle to a multi session添加easy handle到multi session中 SYNOPS ...

  6. VS打包后生成快捷方式:目标指向错误、Icon图标分辨率有误问题解决方案

    1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式,将目标-->指向exe文件,位置Ctrl+v. ...

  7. 纯CSS写的对勾样式

    & .cicle{          position: relative;          float: right;          margin-right: -1rem;      ...

  8. Unity中,保存在OnInspectorGUI中改变的值

    using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor( typeof( MessageLog ) ...

  9. 从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)

    随着业务发展,公司需要提高数据安全与性能需求,所以需要对新技术预研(先采坑),做技术积累: 了解相关AlwaysOn 故障转移集群(热备),数据路由(ICX),Moebius(莫比斯数据路由) 决定测 ...

  10. pythno学习小结-替换python字典中的key值

    源: d={'a':1,'b':2,'c':3} 目标:key:'b'替换为'e' d={'a':1,'e':2,'c':3} 方法: d['e']=d.pop('b')