c语言进程管理,OS进程管理模拟(C语言实现)
实验原理和方法
1.
进程(Process)是计算机中的程序关于其数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
1)动态性、并发性、独立性、异步性。
2)程序是静态的概念,进程是程序在处理机上的一次执行过程,它是一个动态的概念。
3)进程由程序、数据和进程控制块PCB三部分组成。
4)运行中的进程可能具有以下三种基本状态:就绪、运行、等待。
2. 进程控制是进程管理中最基本的功能。它用于创建一个进程,终止或撤销一个进程,还负责进程运行过程中的状态转换。
3.
实验是模拟性质的实验,即不以真实的操作系统的系统调用及其各种数据结构进行操作。在程序中创建一个记录数组以作为进程的PCB结构来进行有关的操作。通过模拟进程的创建、初始化、修改进程控制块的状态标志,实现对进程管理的简单模拟。
4. 实验采用的进程调度策略:简单的时间片轮转算法RR。
1)时间片轮转算法RR:每个进程被分配一个时间段,又称为时间片,也就是该进程允许运行的时间。如果在时间片结束时,进程还没运行完,则CPU被分派给另一个就绪的进程。如果运行中的进程在时间片结束前被等待或运行结束,则CPU进行切换。
主要数据结构的定义和描述
//计时器
typedef struct _time {
int seconds; //秒
int minutes; //分
int hours; //时
}TIME,*LPTime;
//进程控制块
typedef struct Node{
int pid;
int time_need;
int time_used;
char status;
struct Node *pNext;
}Node,*PCB;
程序模块构成
1)时间控制模块。
2)进程变迁模块。
3)输出模块。
主要算法的模型或描述
运用一个计时器(秒表)来记录时间,每三秒生成若干进程(可以不生成)。
程序主体:
for(;;) {//死循环来记录时间
special = random(5);//特殊事件
wakeup = random(5);//唤醒事件
UpdateTime(systemtime);//不断更新时间
if(pReady->pNext == NULL && pRun->pNext == NULL
&& pBlock->pNext == NULL){//就绪、运行、阻塞队列全空,退出程序
exit(1);
}
//每三秒创建若干进程
if(miao % 30 == 0){
update_ready(pReady);
}
//运行队列空,就绪队列进程被调度
if(pRun->pNext == NULL && pReady->pNext != NULL
){
ready_run(pReady,pRun);
run(pRun);
}
//时间片消耗
if(pRun->pNext != NULL){
pRun->pNext->time_used ;
//时间片耗完
if(pRun->pNext->time_used % 60 == 0){
timeout(pReady,pRun);
ready(pReady);
}
//进程完成
if( pRun->pNext->time_used >=
pRun->pNext->time_need){
run_finish(pRun,pFinish);
finish(pFinish);
}
}
//特殊事件发生,进程等待事件
if(special == 0 && pRun->pNext != NULL ){
run_block(pRun,pBlock);
block(pBlock);
}
//唤醒事件发生,阻塞进程被唤醒
if(wakeup == 1 && pBlock->pNext != NULL){
Block_ready(pBlock,pReady);
ready(pReady);
}
//每1/10s执行依次循环
Sleep(100);
}
程序运行的主要画面截图及其说明
初始状态:5个就绪进程(图1)。
图 1
当运行队列为空时,发生调度。就绪队列对头自动进入运行队列,随之发生状态改变(r->e)图2)。
图 2
时间片消耗完,运行进程进入就绪队列,随之状态改变(e->f)(图3)
图 3
当发生特殊事件时(如请求I/O),运行进程进入阻塞队列,随之发生状态改变(e->b)
(图4,图 5)。.
图4
图 5
每三秒生成若干进程(生成了1个进程)(图6)
图 6
当发生唤醒事件时,阻塞进程进入就绪队列,随之发生状态改变(b->r)
图 7
程序执行完成(图8)。
图 8
源程序代码
#include
#include
#include
#include
#include
#include
#include
int id = 1;
int miao = 0; //该时间用来记录每3S生成若干进程
int timeSlice = 0; //该时间 用来记录时间片
int special = 0; //特殊事件(请求I/O等)
int wakeup = 0; //唤醒事件
//时间
typedef struct _time {
int seconds;
int minutes;
int hours;
}TIME,*LPTime;
//进程
typedef struct Node{
int pid;
int time_need;
int time_used;
char status;
struct Node *pNext;
}Node,*PCB;
//初始化时间表
LPTime InitTime(LPTime time)
{
time=(LPTime)malloc(sizeof(TIME));
if (!time)
{
printf("Error!!!\n");
exit(0);
}
time->hours =0;
time->minutes =0;
time->seconds =0;
return time;
}
//更新时间
void UpdateTime(LPTime time)
{
time->seconds ;
timeSlice ;
miao ;
timeSlice ;
if(time->seconds==10)
{
time->seconds=0;
time->minutes ;
}
if(time->minutes==60)
{
time->minutes=0;
time->hours ;
}
}
//显示时间
void ShowTime(LPTime time)
{
printf("d:",time->hours);
printf("d:",time->minutes);
printf("d\r",time->seconds);
}
//产生随机数
int random(int a){
int i;
srand((int)time(0));
return
rand() % a;
}
//创建进程
PCB fork(int n)
{
int
i, len, val;
PCB
pHead = (PCB)malloc(sizeof(Node));
len
= n;
PCB
pTail = pHead;
pTail->pNext
= NULL;
for(i=0;
i
{
PCB
pNew = (PCB)malloc(sizeof(Node));
pNew->pid
= id ;
pNew->status
= 'r';
pNew->time_need
= random(20);
pNew->time_used
= 0;
pTail->pNext
= pNew;
pNew->pNext
= NULL;
pTail
= pNew;
}
return
pHead;
}
//显示进程队列
void view(PCB pHead)
{
PCB
p = pHead->pNext;
while(p
!= NULL) {
printf("
%d %d %d %c\n",
p->pid,p->time_need,p->time_used,p->status);
p
= p->pNext;
}
printf("\n");
return;
}
void viewShow(PCB pReady, PCB pRun, PCB pBlock,PCB
pFinish)
{
printf(" id time_need time_used status\n");
printf("Ready:
\n");
view(pReady);
printf("Run:
\n");
view(pRun);
printf("Block:
\n");
view(pBlock);
printf("Finish:
\n");
view(pFinish);
printf("\n");
}
//创建若干新的进程(可以不创建进程)
void update_ready(PCB pHead){
PCB p = pHead;
while(p->pNext != NULL) p = p->pNext;
PCB pNew = (PCB)malloc(sizeof(Node));
pNew = fork(random(3));
if (!pNew) return;
else p->pNext = pNew->pNext;
}
//进程调度
void ready_run(PCB pReady,PCB pRun){
PCB p = pReady;
PCB q = pRun;
if(p == NULL) return;
else{
PCB pNew = (PCB)malloc(sizeof(Node));
while(q->pNext != NULL) q = q->pNext;
pNew = p->pNext;
p->pNext = pNew->pNext;
pNew->pNext = NULL;
q->pNext = pNew;
}
}
//时间片到
void timeout(PCB pReady,PCB pRun) {
PCB p = pReady;
PCB q = pRun;
if(q == NULL) return;
else{
PCB pNew = (PCB)malloc(sizeof(Node));
while(p->pNext != NULL) p = p->pNext;
pNew = q->pNext;
q->pNext = pNew->pNext;
pNew->pNext = NULL;
p->pNext = pNew;
}
}
//进程等待事件
void run_block(PCB pRun,PCB pBlock){
PCB p = pRun;
PCB q = pBlock;
if(p == NULL) return;
else {
while(q->pNext != NULL) q = q->pNext;
q->pNext = p->pNext;
p->pNext = NULL;
}
}
//唤醒事件
void Block_ready(PCB pBlock, PCB pReady) {
PCB p = pBlock;
PCB q = pReady;
if(p == NULL) return;
else{
PCB pNew = (PCB)malloc(sizeof(Node));
while(q->pNext != NULL) q = q->pNext;
pNew = p->pNext;
p->pNext = pNew->pNext;
pNew->pNext = NULL;
q->pNext = pNew;
}
}
//进程完成
void run_finish(PCB pRun,PCB pFinish){
PCB p = pRun;
PCB q = pFinish;
if(p == NULL) return;
else{
while(q->pNext != NULL) q = q->pNext;
q->pNext = p->pNext;
p->pNext = NULL;
}
}
//进程就绪
void ready(PCB pReady){
PCB p = pReady->pNext;
while(p != NULL){
p->status = 'r';
p = p->pNext;
}
}
//进程运行
void run(PCB pRun){
PCB p = pRun->pNext;
p->status = 'e';
}
//进程完成
void finish(PCB pFinish){
PCB p = pFinish->pNext;
while(p != NULL){
p->status = 'f';
p = p->pNext;
}
}
//进程等待
void block(PCB pBlock){
PCB p = pBlock->pNext;
while(p != NULL){
p->status = 'b';
p = p->pNext;
}
}
int main(){
PCB pReady,pRun,pBlock,pFinish; //声明就绪,运行,阻塞,完成队列
pReady = pRun = pBlock = pFinish = NULL;
pReady = fork(5);//创建就绪队列
pRun = fork(0);//创建运行队列
pBlock = fork(0);//创建等待队列
pFinish = fork(0);//创建完成队列
viewShow(pReady,pRun,pBlock,pFinish);
LPTime systemtime=0;//初始化时间
systemtime=InitTime(systemtime);
//程序运行,时间开始
for(;;) {
special = random(10);//特殊事件
wakeup = random(5);//唤醒事件
UpdateTime(systemtime);//不断更新时间
if(pReady->pNext == NULL && pRun->pNext == NULL
&& pBlock->pNext == NULL){
exit(1);
}
//每三秒创建若干进程
if(miao % 30 == 0){
update_ready(pReady);
viewShow(pReady,pRun,pBlock,pFinish);
getchar();
}
//运行队列空,就绪队列进程被调度
if(pRun->pNext == NULL && pReady->pNext != NULL
){
ready_run(pReady,pRun);
run(pRun);
viewShow(pReady,pRun,pBlock,pFinish);
getchar();
}
//时间片消耗,6S
if(pRun->pNext != NULL){
pRun->pNext->time_used ;
//时间片耗完
if(pRun->pNext->time_used % 60 == 0){
timeout(pReady,pRun);
ready(pReady);
viewShow(pReady,pRun,pBlock,pFinish);
getchar();
}
//进程完成
if( pRun->pNext->time_used >=
pRun->pNext->time_need){
run_finish(pRun,pFinish);
finish(pFinish);
viewShow(pReady,pRun,pBlock,pFinish);
getchar();
}
}
//特殊事件发生,进程等待事件
if(special == 0 && pRun->pNext != NULL ){
run_block(pRun,pBlock);
block(pBlock);
viewShow(pReady,pRun,pBlock,pFinish);
getchar();
}
//唤醒事件发生,阻塞进程被唤醒
if(wakeup == 1 && pBlock->pNext != NULL){
Block_ready(pBlock,pReady);
ready(pReady);
viewShow(pReady,pRun,pBlock,pFinish);
getchar();
}
Sleep(100);
}
return 0;
}
c语言进程管理,OS进程管理模拟(C语言实现)相关推荐
- 【Linux】Linux进程的理解 --- 进程描述符、状态、优先级、切换…
如果不改变自己,就别把跨年搞的和分水岭一样,记住你今年是什么吊样,明年就还会是什么吊样!!! 文章目录 一.冯诺依曼体系结构(硬件) 二.操作系统(软件) 1.操作系统是什么? 2.如何理解管理(管理 ...
- c 语言 多进程,VC++中进程与多进程管理的方法详解
本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. ...
- go linux下进程守护,Linux系统进程管理-Go语言中文社区
一.进程基础知识 1.1 Linux进程的概念 Process:是运行中的程序的一个副本,是被载入内存的一个指令集合.进程ID(Process ID,PID)号码被用来标记各个进程 UID.GID.和 ...
- Linux进程管理+内存管理:进程切换的TLB处理(ASID-address space ID、PCID-process context ID)
目录 一.前言 二.单核场景的工作原理 1.block diagram 2.绝对没有问题,但是性能不佳的方案 3.如何提高TLB的性能? 4.特殊情况的考量 4.进一步提升TLB的性能 - ASID( ...
- 虚拟存储页面置换算法c语言,虚拟存储器管理页面置换算法模拟实验.doc
虚拟存储器管理页面置换算法模拟实验 淮海工学院计算机工程学院 实验报告书 课程名:< 操作系统原理A > 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 软件*** 学 号: 2 ...
- supervisor 守护多个进程_supervisor守护进程管理实操笔记
2020年年后工作中需开发一支持多数据源自动上报业务数据的程序,程序开发完部署上线时需要对其进程进行自动管理,不然哪天程序down了还不知,可就麻烦了,所以这里选用了强大的supervisor,以下文 ...
- 使用pm2启动node文件_使用 PM2 管理nodejs进程
pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...
- Android系统中的进程管理:进程的创建
对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...
- Linux进程 管理,Linux进程查看与管理以及作业控制
Linux进程查看与管理 静态结构:重底层开始往上 底层:硬件 kernel(OS):各硬件接口封装成简洁的接口 库:将内核功能封装成功能模块,供程序员研发使用 OS的基本功能:文件系统.网络功能.进 ...
最新文章
- [LeetCode]: 96: Unique Binary Search Trees
- 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。...
- DFS、栈、双向队列:CF264A- Escape from Stones
- 后门技术(HOOK篇)之DT_RPATH
- 实现页面打开后滚动到最底端的效果(转)
- 009_JMS中的事务
- Linux export 命令用法
- SAP Cloud Application Programming 介绍(2021 更新版)
- 数据结构实验:一元多项式计算器
- 程序猿 自己所擅长的还是码代码 请远离 业务。
- “参与 Debian 项目 20 年后,被降级的我选择退出”
- Java集合(十三)Iterator和Enumeration的区别和对比
- android dts播放器下载,安卓dts音效apk安装包
- html bootstrap主题,10大的 Metro 风格的 Bootstrap 主题和模板
- 数据结构与算法——先导篇
- 你没有见过的6个创意CSS链接悬停效果
- 高级数据结构1—初识树状数组—快速求得前缀和和修改某一元素值
- 【netcore】 docker 读写文件问题 报错Gdip
- 华大HC32F460芯片
- 电脑上被误删的文档怎么恢复?4个实用妙招解决
热门文章
- 初创企业如何做高效持续交付
- 【仿淘宝首页】前端网页模板,大学生前端作业分享,html5+css电商网站模板,包含js动效
- 中科大2021计算机考研分数线,中国科学技术大学2021年考研复试各科分数线_中国科大考多少分能进复试-聚创中国科大考研网...
- 红红火火恍恍惚惚(bfs_plus.2)(知道吉米你很急!)
- 提高vivado编译速度
- Word中Endnote加载项不见处理办法
- 支付宝二维码支付文档,找了好久,记在这里
- 一元二次方程求解的实现
- VUE踩坑——this.$nextTick、头条小程序组件传值报错问题
- Python Web框架 Django项目搭建与测试详解