用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 ...
随机推荐
- PostgreSQL 封装操作数据库方法
/// <summary> /// 模块名:操作postgres数据库公共类 /// 作用:根据业务需求对数据库进行操作. /// 注:系统中的公共方法,根据需要,逐一引入 /// 作者: ...
- Docker基础原理
前言 Docker是一个开源的软件项目,让用户程序部署在一个相对隔离的环境运行,借此在Linux操作系统上提供一层额外的抽象,以及操作系统层虚拟化的自动管理机制.需要额外指出的是,Docker并不等于 ...
- 补充ajax分页的代码
1.主页代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- 九度OJ 1064:反序数 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3758 解决:2773 题目描述: 设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321) 求N的值 输入: 程序无任 ...
- 在java项目中使用protobuf
1 通用方式 第一步,定义数据结构 第二步,使用protoc.exe生成java代码 第三步,序列化 第四步,反序列化 2 grpc方式 grpc官方推荐的方式,通过maven插件来生成java代码. ...
- adaptive heuristic critic 自适应启发评价 强化学习
https://www.cs.cmu.edu/afs/cs/project/jair/pub/volume4/kaelbling96a-html/node24.html [旧知-新知 强化学习:对 ...
- 快速学习Symfony4,Symfony4教程
快速学习Symfony4,Symfony4教程https://symfony.com/doc/current/index.html 关注公众号回复Symfony4教程,Symfony4教程视频,或访问 ...
- import org.marker.weixin.DefaultSession; import org.marker.weixin.HandleMessageAdapter; import org.marker.weixin.MySecurity; import org.marker.weixin.msg.*;
需要以下微信包可以添加我的微信公众号 回复“微信api”即可得到jar链接,以及maven添加本地jar方法,以及更改后的源代码 import org.marker.weixin.DefaultSes ...
- PR 批量导入
REPORT ZMM_UPLOAD_PR. DATA: BEGIN OF GT_DATA1 OCCURS 0, BSART TYPE STRING, "凭证类型 ...
- API的理解和使用——字符串的命令
字符串的命令复习表 命令 作用 set setex setnx get mset mget incr decs incrby decrby incrbyfloa ...