实验原理和方法

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语言实现)相关推荐

  1. 【Linux】Linux进程的理解 --- 进程描述符、状态、优先级、切换…

    如果不改变自己,就别把跨年搞的和分水岭一样,记住你今年是什么吊样,明年就还会是什么吊样!!! 文章目录 一.冯诺依曼体系结构(硬件) 二.操作系统(软件) 1.操作系统是什么? 2.如何理解管理(管理 ...

  2. c 语言 多进程,VC++中进程与多进程管理的方法详解

    本文实例讲述了VC++中进程与多进程管理的方法,分享给大家供大家参考.具体方法分析如下: 摘要: 本文主要介绍了多任务管理中的多进程管理技术,对进程的互斥运行.子进程的创建与结束等作了较详细的阐述. ...

  3. go linux下进程守护,Linux系统进程管理-Go语言中文社区

    一.进程基础知识 1.1 Linux进程的概念 Process:是运行中的程序的一个副本,是被载入内存的一个指令集合.进程ID(Process ID,PID)号码被用来标记各个进程 UID.GID.和 ...

  4. Linux进程管理+内存管理:进程切换的TLB处理(ASID-address space ID、PCID-process context ID)

    目录 一.前言 二.单核场景的工作原理 1.block diagram 2.绝对没有问题,但是性能不佳的方案 3.如何提高TLB的性能? 4.特殊情况的考量 4.进一步提升TLB的性能 - ASID( ...

  5. 虚拟存储页面置换算法c语言,虚拟存储器管理页面置换算法模拟实验.doc

    虚拟存储器管理页面置换算法模拟实验 淮海工学院计算机工程学院 实验报告书 课程名:< 操作系统原理A > 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 软件*** 学 号: 2 ...

  6. supervisor 守护多个进程_supervisor守护进程管理实操笔记

    2020年年后工作中需开发一支持多数据源自动上报业务数据的程序,程序开发完部署上线时需要对其进程进行自动管理,不然哪天程序down了还不知,可就麻烦了,所以这里选用了强大的supervisor,以下文 ...

  7. 使用pm2启动node文件_使用 PM2 管理nodejs进程

    pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...

  8. Android系统中的进程管理:进程的创建

    对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...

  9. Linux进程 管理,Linux进程查看与管理以及作业控制

    Linux进程查看与管理 静态结构:重底层开始往上 底层:硬件 kernel(OS):各硬件接口封装成简洁的接口 库:将内核功能封装成功能模块,供程序员研发使用 OS的基本功能:文件系统.网络功能.进 ...

最新文章

  1. [LeetCode]: 96: Unique Binary Search Trees
  2. 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的。如果在 IIS 中没有将虚拟目录配置为应用程序,则可能导致此错误。...
  3. DFS、栈、双向队列:CF264A- Escape from Stones
  4. 后门技术(HOOK篇)之DT_RPATH
  5. 实现页面打开后滚动到最底端的效果(转)
  6. 009_JMS中的事务
  7. Linux export 命令用法
  8. SAP Cloud Application Programming 介绍(2021 更新版)
  9. 数据结构实验:一元多项式计算器
  10. 程序猿 自己所擅长的还是码代码 请远离 业务。
  11. “参与 Debian 项目 20 年后,被降级的我选择退出”
  12. Java集合(十三)Iterator和Enumeration的区别和对比
  13. android dts播放器下载,安卓dts音效apk安装包
  14. html bootstrap主题,10大的 Metro 风格的 Bootstrap 主题和模板
  15. 数据结构与算法——先导篇
  16. 你没有见过的6个创意CSS链接悬停效果
  17. 高级数据结构1—初识树状数组—快速求得前缀和和修改某一元素值
  18. 【netcore】 docker 读写文件问题 报错Gdip
  19. 华大HC32F460芯片
  20. 电脑上被误删的文档怎么恢复?4个实用妙招解决

热门文章

  1. 初创企业如何做高效持续交付
  2. 【仿淘宝首页】前端网页模板,大学生前端作业分享,html5+css电商网站模板,包含js动效
  3. 中科大2021计算机考研分数线,中国科学技术大学2021年考研复试各科分数线_中国科大考多少分能进复试-聚创中国科大考研网...
  4. 红红火火恍恍惚惚(bfs_plus.2)(知道吉米你很急!)
  5. 提高vivado编译速度
  6. Word中Endnote加载项不见处理办法
  7. 支付宝二维码支付文档,找了好久,记在这里
  8. 一元二次方程求解的实现
  9. VUE踩坑——this.$nextTick、头条小程序组件传值报错问题
  10. Python Web框架 Django项目搭建与测试详解