用c++STL实现进程管理
项目要求:
设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制,其进程调度采用时间片轮转算法。每个进程用一个PCB表示,其内容根据具体情况设置。各进程之间有一定的同步关系(可选)。系统在运行过程中应能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。
时间片轮转法(Round-Robin,RR)主要用于分时系统中的进程调度。为了实现轮转调度,系统把所有就绪进程按先入先出的原则排成一个队列。新来的进程加到就绪队列末尾。每当执行进程调度时,进程调度程序总是选出就绪队列的队首进程,让它在CPU上运行一个时间片的时间。时间片是一个小的时间单位,通常为10~100ms数量级。当进程用完分给它的时间片后,系统的计时器发出时钟中断,调度程序便停止该进程的运行,把它放入就绪队列的末尾;然后,把CPU分给就绪队列的队首进程,同样也让它运行一个时间片,如此往复。
我们使用queue和priority_queue分别模拟就绪队列run和阻塞队列wait,每次CPU处理的即为就绪队列run的队头。
pcb进程块包含name-进程名;runtime-进程剩余时间;runedtime-占用CPU的总时间;killtime-单次占用CPU的时间;waitpoint-每次减时间片,当不大于0时将进程加入阻塞队列;waittime-等待时长;
项目代码:
#include<bits/stdc++.h>
using namespace std; struct PCB{
int name;
int runtime;
int runedtime;
int state;
int killtime;
int waitpoint;
int waittime;
}; struct cmp{
bool operator()(PCB a,PCB b){
return a.waittime>b.waittime;
}
}; int n=,timeslice=; queue<PCB> run; priority_queue<PCB,vector<PCB>,cmp> wait; void Init(){
srand((unsigned)time(NULL));
for(int i=;i<n;i++){ PCB temp;
temp.name=i;
temp.runtime=rand()%+;
temp.runedtime=;
temp.killtime=;
temp.waitpoint=rand()%+;
temp.waittime=rand()%+;
//cout<<temp.runtime<<" "<<temp.waitpoint<<" "<<temp.waittime<<endl;
run.push(temp);
cout<<"name "<<temp.name<<","<<"runtime="<<temp.runtime<<","<<"runedtime="
<<temp.runedtime<<","<<"killtime="<<temp.killtime<<","<<"waitpoint="<<
temp.waitpoint<<","<<"waittime="<<temp.waittime<<endl;
}
cout<<"以上为各进程初始参数"<<endl;
cout<<endl;
} void Run(){
while(run.size()>||wait.size()>){
if(run.size()){
PCB temp=run.front();
run.pop();
temp.waitpoint-=timeslice;
if(temp.waitpoint>){//不阻塞
temp.runtime-=timeslice;
if(temp.runtime<=){
temp.killtime=temp.runtime+timeslice;
temp.runedtime=temp.runedtime+temp.killtime;
temp.runtime=; cout<<"name "<<temp.name<<","<<"runtime="<<temp.runtime<<","<<"runedtime="
<<temp.runedtime<<","<<"killtime="<<temp.killtime<<","<<"waitpoint="<<
temp.waitpoint<<","<<"waittime="<<temp.waittime<<endl<<"进程"<<temp.name<<"已结束"<<endl;
}
else{
temp.runedtime+=timeslice;
temp.killtime=timeslice;
run.push(temp); cout<<"name "<<temp.name<<","<<"runtime="<<temp.runtime<<","<<"runedtime="
<<temp.runedtime<<","<<"killtime="<<temp.killtime<<","<<"waitpoint="<<
temp.waitpoint<<","<<"waittime="<<temp.waittime<<endl;
}
}
else{
cout<<"进程"<<temp.name<<"产生阻塞"<<endl;
temp.waitpoint=;
wait.push(temp);
}
}
while(wait.size()){
PCB temp;
temp=wait.top();
wait.pop();
temp.waittime-=timeslice;
if(temp.waittime>){
wait.push(temp);
break;
}
else{
cout<<"进程"<<temp.name<<"即将被唤醒"<<endl;
run.push(temp);
}
}
cout<<endl;
}
cout<<endl<<endl<<endl<<"***********END***********"<<endl;
cout<<"****Designed by Kiven****"<<endl;
} int main(){
ios::sync_with_stdio(false);
Init();
Run();
return ;
}
用c++STL实现进程管理的更多相关文章
- 《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...
- 进程管理三大扩展工具htop
三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...
- Linux进程管理子系统分析【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51298732 Linux进程管理: 进程与程序: 程序:存放在磁盘上的一系列代码 ...
- Linux下取代top的进程管理工具 htop
一.htop 简介 This is htop, an interactive process viewer for Linux. It is a text-mode application (for ...
- Linux进程管理
一.进程管理简介 进程是正在执行的程序或命令,每一个进程都是一个运行实体,都有自己的地址空间,并占用一定的系统资源. 进程管理的作用: 1.判断服务器的健康状态 2.查看系统中的所有进程 3.杀死进程 ...
- C++ Windows进程管理
功能: 1.各个进程启动.挂起.恢复.停止等 2.监听进程的运行状态,进程退出(正常.非正常)时,通知用户 3.异步队列 4.线程安全 进程管理器类: #ifndef __ProcessManager ...
- 12个Linux进程管理命令介绍(转)
12个Linux进程管理命令介绍 [日期:2015-06-02] 来源:Linux中国 作者:Linux [字体:大 中 小] 执行中的程序在称作进程.当程序以可执行文件存放在存储中,并且运行的 ...
- 理解Docker容器的进程管理
摘要: Docker在进程管理上有一些特殊之处,如果不注意这些细节中的魔鬼就会带来一些隐患.另外Docker鼓励"一个容器一个进程(one process per container)&qu ...
- Android内存进程管理机制
参考文章: http://www.apkbus.com/android-104940-1-1.htmlhttp://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.h ...
随机推荐
- MongoDB学习笔记<六>
继续mongoDB的学习 --索引具体解释 --索引管理 --空间索引 1.创建简单索引 (1)先准备20万条数据 for(var i = 0;i< 200000;i++){ db.books. ...
- ViewPager总结
https://github.com/youth5201314/banner compile 'com.youth.banner:banner:1.4.9' private void setBanne ...
- C#多线程学习(六) 互斥对象
如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...
- 关于-O0、O1、O2、O3优化
少优化->多优化: O0 -->> O1 -->> O2 -->> O3 -O0表示没有优化,-O1为缺省值,-O3优化级别最高 整理自网络,仅供参考 1.- ...
- Linux Tomcat的安装
inux版本:CentOS 6.2 iso文件下载地址:http://mirrors.163.com/centos/6.2/isos/i386/CentOS-6.2-i386-bin-DVD1.iso ...
- 【模板】P3806点分治1
[模板]P3806 [模板]点分治1 很好的一道模板题,很无脑经典. 讲讲淀粉质吧,很营养,实际上,点分治是树上的分治算法.根据树的特性,树上两点的路径只有一下两种情况: 路径经过根\((*)\) 路 ...
- 洛谷3243 [HNOI2015]菜肴制作
题目戳这里 Solution 错误的想法:正向建图,然后从入度为0的点选出最小u的开始输出,然后找出u连接的点v,并把v的度数减一,再次把入度为0的点加入小根堆,这样显然有错,因为只能局部保证最小,后 ...
- Ceph集群rbd-mirror A、B区域备份实施方案
Ceph集群rbd-mirror A.B区域备份实施方案 备注:首先准备两个集群, 并确认其状态,集群的准备过程在这就不做陈述 1.查看集群状态 A区域 [root@ceph2111 ceph]# c ...
- 使用了Tomcat JDBC连接池不能重连的问题
在项目中用到了tomcat 的jdbc连接池,发现一个问题是,当数据库重启时,服务没有重新的去连接数据库,需要将部署的项目重新启动才能连接到数据库.经过测试对配置做一下修改: 在配置dataSourc ...
- Java for LeetCode 136 Single Number
Given an array of integers, every element appears twice except for one. Find that single one. Note: ...