用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 ...
随机推荐
- 关于 Delphi 中流的使用(7) 压缩与解压缩(TCompressionStream、TDecompressionStream)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- Something Starts While Something Ends
(1)最终还是没能参加比赛,一次都没有机会. (2)有梦想,不到最后一刻不会放弃. (3)这里应该会搬次家,转到github上. (4)作为一个新手,什么东西都需要从头学起来,就从最基础的数据结构开始 ...
- HIbernate 注解 mappedBy 与 inverse
hibernate中 配置文件中的inverse属性意思就是放弃控制权 ,主导权由对方控制,也就是说 我方进行的删除等操作不会影响到对方 即使设置了cascadeType.ALL 这个解释其实就是hi ...
- k-anonymity
k匿名(k-anonymity)是一种常用的社交网络隐私保护技术,其思想是通过人为构造一定数量与目标节点拓扑结构相同的节点来降低用户被定位的概率 [匿名]英语怎么说_在线翻译_有道词典 http:// ...
- Android笔记之ViewModel的使用示例
依赖 implementation 'android.arch.lifecycle:extensions:1.1.1' implementation 'com.squareup.retrofit2:r ...
- Mongo 分组后排序取时间最大的一整条数据对象
db.getCollection('product_protocol_new').aggregate([ {$sort:{"end_date":-1}}, {$group:{ _i ...
- BA模型 第10章
1.BA模型BA模型就是世界坐标到像素坐标的转换过程.这里多了一个去畸变.因为归一化平面坐标在转成像素坐标的过程中会出现畸变.这里只处理了径向畸变,径向畸变包括桶形失真和枕形失真,都是由于图像放大率随 ...
- poj 3041 Asteroids(二分图 *【矩阵实现】【最小点覆盖==最大匹配数】)
Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16379 Accepted: 8930 Descri ...
- SpringBoot之外部Tomcat运行Spring Boot项目
内置tomcat8.5.28 外置的要高于此版本才OK spring boot1.5是访问不了jsp页面的 以后要以2.0版本为主流的
- oracle数据库-备份ORACLE为dmp类型数据
刘备,为自己后期脑子不灵光时可以找个可以翻阅的地方. 一.第一部分导出ORACLE数据 1.数据库地址及账号密码: 数据库地址:10.10.10.132账号密码:oracle/oracle 2.使用X ...