并行程序模拟

任务介绍

你的任务是模拟n个程序的并行运算。(按照输入编号为1~n)的并行执行。

代码实现

#define LOCAL
#include<bits/stdc++.h>
using namespace std;
int main(){
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    #endif // LOCAL
    int n,t[5],Q;
    scanf("%d%d%d%d%d%d%d",&n,&t[0],&t[1],&t[2],&t[3],&t[4],&Q);
    unordered_map<char,int>variable;//变量与其值的映射关系
    deque<int>block,wait;//阻塞队列、等待队列
    bool lock=false;//锁
    vector<deque<string>>program(n+1);//每个程序
    for(int i=1;i<=n;++i){//读取每个程序代码
        wait.push_back(i);//。初始等待队列包含按输入顺序排列的各个程序
        string line;
        while(getline(cin,line)&&line!="end")
            program[i].push_back(line);
        program[i].push_back("end");
    }
    while(!wait.empty()){//等待队列不空就继续循环
        int cur=wait.front();//读取当前运行的程序
        wait.pop_front();
        if(program[cur].empty())//当前程序已运行完毕,不再执行任何操作
            continue;
        wait.push_back(cur);//将当前运行的程序插入到等待队列末尾
        for(int time=0;time<Q;){//当前程序运行时间小于配额时继续执行
            string s=program[cur].front();//读取需要执行的指令
            program[cur].pop_front();//弹出队首指令
            if(s[2]=='='){//是赋值指令
                variable[s[0]]=stoi(s.substr(4));//更新或插入变量及其对应值
                time+=t[0];//更新当前程序运行时间
            }else if(s[2]=='i'){//是print指令
                printf("%d: %d\n",cur,variable[s[6]]);//打印
                time+=t[1];//更新当前程序运行时间
            }else if(s[2]=='c'){//是lock指令
                if(lock){//已经上锁了
                    program[cur].push_front(s);//当前指令重新压回队首
                    block.push_back(cur);//当前程序插入到阻塞队列队尾
                    wait.pop_back();//将当前程序从等待队列末尾中删除
                    break;//不再执行其他指令
                }//没有上锁过
                lock=true;//上锁
                time+=t[2];//更新当前程序运行时间
            }else if(s[2]=='l'){//unlock指令
                lock=false;//解除上锁
                time+=t[3];//更新当前程序运行时间
                if(!block.empty()){//阻塞队列不空
                    wait.push_front(block.front());//将阻塞队列队首程序插入到等待队列队首
                    block.pop_front();//弹出阻塞队列队首程序
                }
            }else if(s[2]=='d')//end指令
                break;//直接跳出循环
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10461554.html

时间: 2024-10-26 01:26:20

并行程序模拟的相关文章

6-1 并行程序模拟 uva210

一个较难得模拟题 用到了 deque 和queue 操作说明: queue  qu:      qu.push(x); int d=qu.front(); qu.pop();        和栈一样只有push和pop操作,front是看第一个!   栈里面是top deque de:    de.push_front(x); de.push_back(x); int x=de.front(); de.pop_front(); de.back_front();//push 和pop 加上后缀 检

编程序模拟银行家算法

一.编程序模拟银行家算法 1)对用银行家算法来避免死锁的方法有较深入的了解,给出系统的初始状态,模拟避免死锁的动态过程. 2)银行家算法中的数据结构 (1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.Available[j]=K,则表示系统中现有Rj类资源K个. (2)最大需求矩阵Max.这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对

JAVA并行程序基础

JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级的进程,是程序执行的最小单位.(PS:使用多线程去进行并发程序的设计,是因为线程间的调度和切换成本远小于进程) 线程的状态(Thread的State类): NEW–刚刚创建的线程,需要调用start()方法来执行线程: RUNNABLE–线程处于执行状态: BLOCKED–线程遇到synchroni

rabbitmq的安装和命令介绍及python程序模拟生产者和消费者

[介绍] RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. RabbitMQ是流行的开源消息队列系统,用erlang语言开发 RabbitMQ是AMQP(高级消息队列协议)的标准实现 官网:http://www.rabbitmq.com/ [安装] 方式:yum/rpm 系统环境 [[email protected]_server scripts]# ifconfig | sed -n 's#.*inet addr:

1.4.3 编写有效的并行程序

函数式编程可以更方便编写并行程序,这可能是你打算阅读这本书的原因.在本节,我们将用几个示例来演示函数式程序如何使并行更容易.在前两个示例中,我们将使用 Parallel Extensions to .NET(.NET 的并行扩展),这是微软的一项新技术,用于编写并行化的应用程序,是 .NET 4.0  的一部分.如你所料,ParallelExtensions to .NET 非常好地适合于函数式代码.我们并不更多地涉及细节,只想演示使函数式程序并行化,是极其简单,而更重要的是,比命令式代码更少出

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

基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户自定义新的数据类型,又称派生类型(类似定义结构体类型,但是比结构体复杂,需要考虑<类型,偏移量>两方面的内容) (2)数据的打包和解包(将不连续的数据给压缩打包到连续的区域,然后再发送:接受到打包数据后,先解包再使用) 这样做的好处,我猜一个是可以有效减少通信的次数,提高程序效率:另一方面可以减轻

《Java程序性能优化》学习笔记 Ⅲ 并行程序优化

第四章 并行程序优化4.1 并行程序设计模式4.2 JDK多任务执行框架4.3 JDK并发数据结构4.4 并发控制方法4.5 锁的性能和优化4.6 无锁的并行计算 1.非阻塞同步避免了基于锁的同步的缺陷,无锁算法没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销.CAS算法:包含3个参数CAS(v,e,n).V表示要更新的变量,E表示预期值,N表示新值2.JDK的java.util.concurrent.atomic包下,有一组使用无锁算法实现的原子操作类,如AtomicInteger/A

java程序模拟浏览器访问Web服务器的处理过程

import java.net.*; import java.io.*; /* * 演示浏览器访问Web服务器的处理过程 */ public class WebServerDemo { public static void main(String[] args)throws IOException{ ServerSocket ss=new ServerSocket(10000); Socket s=ss.accept(); byte[] bytes=new byte[1024]; int len

多核下写高性能并行程序

什么样的程序执行效率高? 程序的数据和指令都在cache中,没有cache miss出现. 所以如何让并行程序性能高基本可以演变成 如何减少cache miss? 尤其是多核下,并行程序cache的问题已经无法回避了,否则并行的效率还没有一个线程高. 写程序的时候MESI协议要时刻浮现在眼前. 借用一句歌词:现在不是从前了,兔子比狐狸狡猾了. 1.绞尽所有的脑汁,避免使用全局变量,尤其是程序运行过程中可能修改的变量.所有线程只读的变量可以放松一丁点儿要求. 2.per thread per co