210 - Concurrency Simulator
Concurrency Simulator
PS:这道题目,看懂题意就费了好大功夫。跟着RuJia的程序走了一遍,调试了一遍才明白个大概,只能说基础不是很好,还需要大量的时间学习。
PS:因为该题排版较麻烦,这里给出OJ网址:UVa210 - Concurrency Simulator
你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行。每个程序包含不超过25条语句,格式一共有5种:
- var = constant(赋值);
- print var(打印);
- lock;
- unlock;
- end。
变量用单个小写字母表示,初始为0,为所有程序公有(因此在一个程序里对某个变量赋值可能会影响另一个程序)。常数是小于100的非负整数。
每个时刻只能有一个程序处于运行态,其他程序均处于等待态。上述5种语句分别需要t1、t2、t3、t4、t5单位时间。运行态的程序每次最多运行Q个单位时间(称为配额)。当一个程序的配额用完之后,把当前语句(如果存在)执行完之后该程序会被插入一个等待队列中,然后处理器从队首取出一个程序继续执行。初始等待队列包含按输入顺序排列的各个程序,但由于lock/unlock语句的出现,这个顺序可能会改变。
lock的作用是申请对所有变量的独占访问。lock和unlock总是成对出现,并且不会嵌套。lock总是在unlock的前面。当一个程序成功执行完lock指令之后,其他程序一旦试图执行lock指令,就会马上被放到一个所谓的阻止队列的尾部(没有用完的配额就浪费了)。当unlock执行完毕后,阻止队列的第一个程序进入等待队列的首部。
/**pid:进程编号id[pid]:该进程执行到的指令位置prog[id[pid]]:该指令位置对应的指令内容
**/
#include <cstdio>
#include <queue>
#include <cstring>
#include <cctype>
using namespace std;const int maxNum = 1005;// n个进程
int n;
// 表示5个指令所花的时间
int times[5];
// 周期时间
int quantum;
// 26个变量
int val[26];
// 指令
char prog[maxNum][10];
// 值为进程运行在指令的位置
int id[maxNum];
// 就绪队列
deque<int> readyQ;
// 阻塞队列
queue<int> blockQ;
// 锁
bool locked;// 执行指令
void run(int pid) {// 周期时间int q = quantum;while(q > 0) {// 获取指令char *p = prog[id[pid]];switch(p[2]) {// 举例 a = 22case '=' : {// 常量为正整数,且小于100val[p[0] - 'a'] = isdigit(p[5]) ? (p[4] - '0') * 10 + (p[5] - '0') : p[4] - '0';q -= times[0];break;}// 举例 print acase 'i' : {printf("%d: %d\n", pid + 1, val[p[6] - 'a']);q -= times[1];break;}// 举例 lockcase 'c' : {// 已lock,则将进程加入阻塞队列if(locked) {blockQ.push(pid);return;}// 上锁locked = true;q -= times[2];break;}// 举例 unlockcase 'l' : {// 解锁locked = false;// 当阻塞队列不为空,则将阻塞队列的第一个加入到就绪队列的第一个if(!blockQ.empty()) {int pid2 = blockQ.front();blockQ.pop();readyQ.push_front(pid2);}q -= times[3];break;}// endcase 'd' : {return;}}// 找到该进程的下一条指令id[pid]++;}// 将该进程加入到执行队列最后readyQ.push_back(pid);
}int main() {// T组用例int T;scanf("%d", &T);while(T--) {scanf("%d%d%d%d%d%d%d\n", &n, ×[0], ×[1], ×[2], ×[3], ×[4], &quantum);memset(val, 0, sizeof(val));// 表示第几行指令int line = 0;// 为每个进程提供一些指令for(int i = 0; i < n; i++) {// 读取一行放入指令数组fgets(prog[line++], maxNum, stdin);// 初始化每一个进程在指令数组的开始位置id[i] = line - 1;// 指令不为end,再读取一行指令while(prog[line - 1][2] != 'd') {fgets(prog[line++], maxNum, stdin);}// 放入进程编号readyQ.push_back(i);}// 先置锁为未上锁状态locked = false;// 就绪队列不为空while(!readyQ.empty()) {// 获取就绪队列最前面的进程编号int pid = readyQ.front();readyQ.pop_front();// 执行指令run(pid);}if(T) {printf("\n");}}return 0;
}
210 - Concurrency Simulator相关推荐
- 【日常学习】【双端队列】 Uva - 210 Concurrency Simulator题解
ruka也的确是个小恶魔一般的东西,双端队列竟然只提了一句让我们自己去查TUT比人痛心疾首学习了众多网上神犇们的文章,终于知道了个大概.有几篇整理得非常精妙的文章,在这里给大家分享一下. http:/ ...
- UVA - 210:Concurrency Simulator
题目链接:https://vjudge.net/problem/UVA-210 题目分析 就是一道模拟题,但是细节有点多. 写代码两个小时,调试代码用了两天...很长时间不刷题了,这道虽然算法简单但是 ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- ICPC程序设计题解书籍系列之一:刘汝佳:《算法竞赛入门经典》(第2版)
题是书中的题,部分解法参照了书中的解法,不少解法都做了简化和改进. 做程序,就要努力做到自己的程序是最好的! 第3章 数组和字符串(例题) POJ1488 UVA272 UVALive5381 TEX ...
- c 语言写数独游戏,经典数独游戏+数独求解器—纯C语言实现
[转]NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直 ...
- 《算法竞赛入门经典(第2版)》——学习记录
前言: 这里主要记录本人在学习紫书过程中充分理解过的题目的AC代码,便于以后回顾时查找代码和思路,毕竟看别人的真的有点难懂.此外,本书甚至是本书之外的相关知识学习也可能在此留下记录. 作为一只 ...
- Autoware 1.14(WSL2) 与LG SVL Simulator(Win11)联合仿真
参考Couldn't find executable named rqt_lgsvl_simulator_configurator below /home/autoware/Autoware/ros/ ...
- 并发 vs 并行 (Concurrency Is Not Parallelism)
前言 不知你是否曾经下列这些疑问? 并发与并行性有何关系? 什么是同步和异步执行? 如何区分并发与并行? 线程如何与所有这些概念一起使用? 并发 并发性意味着应用程序同时(并发地)在多个任务上取得进展 ...
- autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)
autoware安装与使用:LGsvl Simulator 2021.2.1版(windows10)(九) 介绍如何在windows下安装LGsvl Simulator 2021.2.1版 环境:wi ...
最新文章
- 用命令行非交互改密码
- QueryRunner 错误
- python写学生系统-用python编写学生管理系统
- java在类中创建一个对象_在另一个类中创建类对象
- 【MySQL】Path does not chain with any of the trust anchors
- Linux调度器 - deadline调度器
- 试卷分析计算机基础,计算机基础试卷分析.doc
- java封装与调用方法_java方法和封装
- docker 启动时错误docker: Cannot connect to the Docker daemon
- 人体3D重建-ICON论文解读
- 天猫双十一自动刷喵币
- 微信小程序开发初体验
- 中国区GPS偏移纠正(适用于Google地图)
- 关于Springboot中跨域问题的解决(Response to preflight request doesn‘t pass access control check)
- LintCode 2017 光棍节
- 针织厂计算机社会实践报告,大学生寒假针织厂打工实践报告
- Angular常用ng指令详解
- msvcp120.dll一键下载修复-提示找不到msvcp120.dll的解决方法
- mysql drop后回收站怎么恢复_回收站清空了怎么恢复
- Windows7共享WIFI上网
热门文章
- ERROR: Unrecognized command line argument: #39;use#39;
- while语句的使用
- 前端 网络安全 前端优化 代码架构 笔记
- 漫画 |《程序员十二时辰》,内容过于真实 ...
- C 语言实例 -求分数数列1/2+2/3+3/5+5/8+...的前n项和
- 百度在线解析站不限速下载
- C#LeetCode刷题之#409-最长回文串(Longest Palindrome)
- C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)
- git命令升级版用法
- 云服务器 存放 文件夹,云服务器 存放 文件夹