用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 ...
随机推荐
- PHP错误调试
一:错误类型举例 1.语法错误:一般是语句最后缺少分号.缺少单引号或双引号.for循环或函数缺少花括号.缺少变量标示符$ 2.定义错误:一般是调用不存在的变量.调用不存在的函数或者类 3.逻辑错误:代 ...
- whl文件下载
到哪找.whl文件?http://www.lfd.uci.edu/~gohlke/pythonlibs/
- 【BZOJ3291】Alice与能源计划 二分图最大匹配
[BZOJ3291]Alice与能源计划 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星 ...
- Greedy Function Approximation:A Gradient Boosting Machine
https://statweb.stanford.edu/~jhf/ftp/trebst.pdf page10 90% to 95% of the observations were often de ...
- yarn_action
https://maprdocs.mapr.com/home/AdministratorGuide/ResourceAllocation-YARNContainer.html yarn.schedul ...
- HTML 学习笔记 JQueryUI(Interactions,Widgets)
Draggable 允许使用鼠标移动元素(拖动) demo <html> <head> <meta charset="UTF-8" ...
- MySQL修改配置 区分大小写
在使用mysql的时候,数据库名,表名,字段名等有大小写的区分,这个可以通过配置文件设置.如果设置了严格区分大小写,在访问表的时候没有注意到表名的大小写,将会报出表不存在的错误.下面是修改配置文件: ...
- web 全栈 学习 2 一个好的页面是如何炼成的
第一章:Web页面内容的构成2.Web内容的分工一个Web页面可能的构成(视觉上看):①文字.链接.标题②交互入口(表单元素)③图片(哪些类型)④动画 Flash动画 HTML5 CSS3 动画⑤音视 ...
- redhat5.1上安装oracle 10.2g客户端及配置使用
一)安装 1.命令 rpm -q gcc make binutils setarch compat-db compat-gcc compat-gcc-c++ compat-libstdc++ comp ...
- 【LeetCode】最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...