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 ...
最新文章
- java_codereview随笔
- 宝塔需在php设置中安装redis扩展,wordpress开启Redis扩展教程
- angularjs中 $watch 和$on 2种监听的区别?
- java 窗口线程_Java 窗体与线程问题
- 案例 宠物医生给小动物看病 c# 1614100379
- STM32工作笔记0037---STM32时钟系统精讲-M3
- 欠20万信用卡卡奴自救方法
- android 右边抽屉,android – 抽屉在右侧抽屉中切换
- 终于有人把深度学习讲明白了!
- 智能优化算法(源码)-飞蛾扑火优化算法(MFO)
- iText实现html转pdf
- IDEA 实用小技巧:万能的临时文件
- 六一儿童节海报合集,一起重拾童年吧~
- 安装win7时,显示缺少所需的CD/DVD驱动器设备驱动程序
- asterisk注册河南联通ims
- zookeeper-集群-选举机制
- 谢烟客---------Linux之用户
- SSL证书的申请流程
- 使用Python连接crossbar.io 报错 could not create serializer for “cbor“ (available: [‘json‘])
- matlab d函数,Matlab常用函数
热门文章
- 使用adduser命令在Debian Linux中创建用户
- 如何在六个月或更短的时间内成为DevOps工程师(三):版本控制
- OSPF——优化技术(含配置)
- CCNA初认识——OSPF(开放式最短路径优先协议)配置命令
- TCP/IP五层模型(五层因特网协议栈)||| OSI参考模型|||数据的封装与解封装
- (草稿)如何判断一名UiPath开发人员是否合格?
- C#LeetCode刷题之#20-有效的括号(Valid Parentheses)
- 命令行部署程序保存pid到文件
- 从MySql 数据库中导出数据并生成指定格式xml文件
- Python heapq模块