进程管理子系统

    

1 实验内容

1.1 基本要求

1.1.1 问题描述

1.1.2 设计要求

2数据结构设计

2.1PCB定义

2.2队列定义

2.3全局变量定义

2.4主函数模块

2.5函数定义

3算法设计

3.1算法流程图

3.2设计思想

3.3算法描述

4测试数据及程序运行情况

4.1菜单运行界面

4.2进程创建界面

4.3进程运行界面

4.4进程阻塞界面

4.5进程唤醒界面

4.6进程撤销界面

5实验中出现的问题及解决方法

5.1出现问题

5.2解决办法

6自我评析与总结

参考文献


  1. 实验内
    1. 基本要求
      1. 问题描述

Linux/UNIX/Windows下编制一个程序,模拟实现一个简单的进程管理子系统,它由进程建立模块、进程撤消模块、进程控制表组成,(此外还可能包括选作的进程切换和调度模块)。

      1. 设计要求

在1题的基础上,进一步可选做模拟实现进程切换。希望能实现时间片满或接到sleep调用(或信号时)进行进程切换(选择其一即可)。

若要实现时间片,假设时间片为1秒钟,设定底层环境OS每个1秒向该系统发一个信号,本子系统将本子系统的进程切换和调度模块设定为该信号的处理程序。或者每当接到子进程发出的的sleep调用(或信号)时进行进程切换,这里子进程发出的sleep调用(或信号)代表实际系统中可能发生的sleep( )调用、等待某一时间发生等情况,进程调度采用简单的FIFO算法。

(本题作为一道思考选作实验题:由于是在实际OS中模拟实现,故子系统无法完全控制其建立的所有子进程的进程状态变化,象当前进程这样的概念都不太好模拟,需要设法解决或假设。

具体实现时参考1题~3题要求)

2数据结构设计

   2.1PCB定义

typedef struct PCB

{ //定义进程控制快PCB

float ID;     //进程标识符

int Priority;     //优先数

int Alltime;     //进程还需要运行的时间

int CPUtime;  //已用CPU时间

int State;       //状态

float father;     //父进程

float child;      //子进程

int Max[m];       //最大需求

int Allocation[m];//已分配

int Need[m];      //需求

PCB* next;        //队列指针

}pcb;

2.2队列定义

class Queue

{

public:

Queue():rear(NULL),first(NULL){}; //构造函数并初始化  ~Queue();//析构函数

void enqueue(pcb *p);//入队函数

void dequeue(pcb *p);//出队函数

void del(float id);

void dispaly();    //显示函数

int find(float id);

void search1(float id,int x);

float search2(float id,int x);

bool isempty(){return first==NULL&&rear==NULL;}//判队列空否

private:

pcb *first,*rear; //队首、队尾指针

};

2.3全局变量定义

queue execute,ready,block;  //定义就绪阻塞执行队列

int num=0;                 //进程数

int Available[3];           //定义资源

   2.4主函数模块

    main()

    {

   for(int i=0;i<3;i++)

   Available[i]=30;

   cout<<"\t\t资源初始化完毕!"<<endl;

   menu();

    }

   2.5函数定义

    float a[8]={-1,-1,-1,-1,-1,-1,-1,-1};

void output();//输出函数

void clean();//清屏

void menu();//菜单函数

void create();//创建函数

void createchild(pcb *p);//创建子进程函数

void run();//执行函数

void lock();//阻塞函数

void change();//唤醒函数

void revoke();//撤销函数

void jixu();//选择是否继续运行或退出程序

3算法设计

   3.1算法流程图

 

   3.2设计思想

主函数是实现进程管理的入口,在入口处需输入进程名称,然后输入进程的状态选项,完成后,则通过相应的调度算法进行进程机的调度,同时也将结果显示在屏幕上。本次实验通过模拟多个进程的同步运行,实现了进程就绪、运行、阻塞三个状态的转换,并可以根据用户要求改变进程的状态,实现进程切换。

    3.3算法描述

创建进程——根据进程的顺序依次放入就绪队列,并创建其子进程副本;

void create()

{

   创建进程

   将进程送入就绪队列

   创建其子进程

   将子进程送入就绪队列

   是否继续

执行进程——管理系统将就绪队列中的第一个进程调入运行队列;

void run()

{

   判断未使用资源能否满足进程

   否,将进程从就绪队列取出,送入阻塞队列

   是,将进程从就绪队列取出,送入执行队列

   若进程执行完毕,则自动撤销进程

   是否继续

阻塞进程——将执行队列中进程调入阻塞队列;

void block()

{

   判断执行队列是否有进程执行

   若有,则将进程从执行队列取出送入阻塞队列

   是否继续

唤醒进程——管理系统将阻塞队列中的第一个进程调入就绪队列;

void change()

{

   判断阻塞队列是否有进程执行

   是,将进程从阻塞队列取出,送入就绪队列

   是否继续

结束进程——管理系统撤销所选进程,并释放其所占用的资源;

void revoke()

{

   从就绪、执行、阻塞队列中找到该进程

   释放其所占资源

   修改其父子进程信息

   撤销进程

   是否继续

4测试数据及程序运行情况

4.1菜单运行界面

 

 

如上图所示:进入进程管理菜单,用户可进行选择(1-6)。

 

用户输入d,会提示输入有误,并再次进入界面让用户进行第二次选择(如下图所示)

     4.2进程创建界面

 

如上图所示:创建了3个进程,进程ID号为手动输入,优先数、运行时间、所需资源数目、已分配资源数目为随机生成数,并依次创建其子进程。选择(1-2),继续或者结束退出程序。

 

如果用户创建ID重复的进程,会自动再次进入创建窗口进行创建新的进程。

如上图所示,创建两个进程ID为3的进程,会自动再次进入创建窗口进行创建新的进程。

   4.3进程运行界面

 

如上图所示:根据先来先服务算法,先对进程1进行服务。其他进程在就绪队列等待。选择(1-2),继续或者结束退出程序。

如上图所示:有进程在执行时,如果用户选择进程执行,会显示“已有进程在执行!操作失败”。如此,用户可选择(1-2),继续或者结束退出程序。

   4.4进程阻塞界面

图1

图2

图3

如图1所示:创建一个大于Allocation的资源数目,导致如图2所示的进程阻塞,由于资源数不够,所以如图3所示将其加入阻塞队列,不能进一步运行。

   4.5进程唤醒界面

   4.6进程撤销界面

5实验中出现的问题及解决方法

5.1出现问题

在菜单用户选择功能时,若用户错误输入了非菜单选择(1-6)的字符,系统直接结束运行。

5.2解决办法

在用户输入选择后加入了判断,如果菜单功能以外的数字,则反馈给用户"输入有误,请重新输入!";输入不是所定义的类型(int),则清空输入流缓冲,让用户继续输入。

while(n<=0||n>6)

{

cout<<"\t\t\t\t!!!输入有误,请重新输入!!!"<<endl<<endl;

menu();

if(!(cin>>n))

{

cin.clear();

}

cin>>n;

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
目录 1 进程的组织 5 1.1 进程相关数据结构 5 1.1.1 进程的基本信息 6 1.1.2 进程状态 10 1.1.3 TASK_RUNNING状态的进程链表 11 1.1.4 进程间关系 12 1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与vfock系统调用的区别 42 1.6 内核线程 46 1.7 挂起状态进程的组织 49 1.7.1 等待队列头 49 1.7.2 等待队列的操作 50 1.7.3 进程资源限制 55 1.8 系统调用execve() 56 1.8.1 拷贝用户态参数 57 1.8.2 重要的数据结构 61 1.8.3 search_binary_handler函数 66 1.8.4 目标文件的装载和投入运行 69 1.8.5 库函数 92 2 中断控制 94 2.1 中断的分类 94 2.2 中断的硬件环境 95 2.2.1 外部中断请求IRQ 95 2.2.2 中断描述符表 96 2.2.3 中断和异常的硬件处理 97 2.3 中断描述符表 99 2.3.1 中断门、陷阱门及系统门 99 2.3.2 IDT的初步初始化 100 2.4 异常处理 101 2.5 中断处理 106 2.5.1 中断向量 107 2.5.2 IRQ数据结构 108 2.5.3 do_IRQ()函数 113 2.5.4 中断服务例程 115 2.5.5 IRQ线的动态分配 116 2.6 下半部分 117 2.6.1 软中断 118 2.6.2 tasklet 121 2.6.3 工作队列 122 2.7定时器中断 124 2.7.1 时钟与定时器 124 2.7.2 定时器中断相关的数据结构 127 2.7.3 定时器中断的上半部分 129 3 进程调度 138 3.1 进程调度的概念 138 3.2 进程调度的数据结构和优先级 141 3.2.1 进程的优先级 141 3.2.2 数据结构 145 3.3 调度程序所使用的函数 151 3.3.1 scheduler_tick函数 151 3.3.2 try_to_wake_up函数 156 3.3.3 recalc_task_prio函数 160 3.4 schedule()函数 163 3.4.1 直接调用 163 3.4.2 延迟调用 164 3.4.3 进程切换之前所做的工作 168 3.4.4 完成进程切换时所执行的操作 171 3.4.5 进程切换后所执行的操作 173 3.5 多处理器运行队列的平衡 175 3.5.1 调度域 176 3.5.2 rebalance_tick()函数 178 3.5.3 load_balance()函数 180 3.5.4 move_tasks()函数 183 3.6 进程退出 187 3.6.1 进程终止 187 3.6.2 进程删除 189 4 进程的并发性体现 191 4.1 内核抢占 193 4.1.1 内核抢占概念 193 4.1.2 同步技术总揽 196 4.2 每CPU变量 197 4.3 原子操作 199 4.4 优化屏障和内存壁垒 203 4.4.1 优化屏障 204 4.4.2 内存壁垒 204 4.5 自旋锁 206 4.6 读写自旋锁 211 4.6.1 为读获取和释放一个锁 213 4.6.2 为写获取或释放一个锁 214 4.7 顺序锁 215 4.8 RCU机制 217 4.9 信号量 219 4.9.1 获取和释放信号量 221 4.9.2 读/写信号量 224 4.9.3 补充信号量 225 4.10 禁止本地中断 226 4.10.1 禁止本地中断 227 4.10.2 禁止下半部(可延迟函数) 229 4.11 一些避免竞争条件的实例 231 4.11.1 引用计数器 231 4.11.2 大内核锁 231 4.11.3 内存描述符读/写信号量 232 4.11.4 slab高速缓存链表的信号量 233 4.11.5 索引节点的信号量 233 4.12 内核同步与互斥的总结 233
内存管理子系统是操作系统中的重要组成部分,主要负责管理计算机中的物理内存和虚拟内存。内存管理子系统的工作包括内存分配、内存回收、内存保护、内存映射和虚拟内存管理等。 内存分配是内存管理子系统最基本的功能之一,它负责为进程分配所需的内存空间。内存分配通常分为两种方式:静态分配和动态分配。静态分配是指在编译时就为程序分配内存空间,而动态分配则是在运行时根据程序需要动态地分配内存空间。 内存回收是内存管理子系统的另一个重要功能,它负责回收进程不再需要的内存空间,以便让其他进程使用。内存回收有两种方式:手动回收和自动回收。手动回收是指程序员手动释放内存空间,而自动回收则是由垃圾回收机制自动回收不再使用的内存空间。 内存保护是内存管理子系统的另一个重要功能,它负责确保程序不会访问到错误的内存地址或者越界访问内存。内存保护通常通过硬件和软件两种方式实现。硬件保护是指通过内存管理单元(MMU)等硬件设备来保护内存,而软件保护则是通过操作系统的内核来实现。 内存映射是内存管理子系统的另一个重要功能,它负责将物理内存映射到虚拟内存空间。内存映射通常用于共享内存、动态链接库等场景。 虚拟内存管理是内存管理子系统的最重要的功能之一,它负责将虚拟内存映射到物理内存。虚拟内存管理是操作系统中最复杂的功能之一,它涉及到页表、页式存储等概念,需要高度的技术水平和编程能力。 总之,内存管理子系统是操作系统中非常重要的组成部分,它对于操作系统的性能和稳定性有着重要的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦极必反

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值