C语言实现操作系统简单的P V操作

  • 简单说明
    • cpp的文件,C语言的语法
  • 代码如下
  • 实现效果

简单说明

cpp的文件,C语言的语法

代码如下

#include "stdio.h"
#include "stdlib.h"
struct process{  //进程结构体long pid;long uid;struct process *next;
};typedef struct semaphore{  //记录型信号量int value;struct process *L;
} semaphore;void PrintBlockQueue(semaphore S){struct process *p = S.L;printf("此时共享资源数量为: %d\t,阻塞队列:",S.value);if(p==NULL){printf("NULL\n");}else{while(p!=NULL){printf("%d -> ",p->pid);p=p->next;}printf("NULL\n");}
}void ProcessRun(struct process p){printf("进程 %d 正在使用资源\n",p.pid);
}void block(struct process *&L,struct process P){if(L==NULL){L=(struct process *) malloc(sizeof(struct process));L->pid = P.pid;L->uid = P.uid;L->next = NULL;}else{struct process *p = L,*q;while (p->next != NULL){p = p->next;}q = (struct process *) malloc(sizeof (struct process));q->pid = P.pid;q->uid = P.uid;q->next = NULL;p->next = q;}}void wakeup(struct process *&L){struct process *p = L;struct process P;if(L!=NULL){P.pid = L->pid;P.uid = L->uid;p = L->next;L = p;}ProcessRun(P);
}void wait(semaphore &S,struct process p){printf("进程 %d 在申请资源 \n",p.pid);S.value--;if(S.value<0){printf("进程 %d 申请资源失败,进入阻塞队列\n");block(S.L,p);} else{ProcessRun(p);}PrintBlockQueue(S);printf("\n");
}void signal(semaphore &S,struct process p){printf("进程 %d 正在释放资源\n",p.pid);S.value++;if(S.value <= 0){printf("进程 %d 释放资源完毕,存在阻塞进程,将其唤醒\n",p.pid);wakeup(S.L);} else{printf("进程 %d 释放资源完毕,未存在阻塞进程\n",p.pid);}PrintBlockQueue(S);printf("\n");
}int main(){semaphore S;S.value =2;  //系统资源S.L = NULL;struct process p1,p2,p3,p4; //4个进程p1.pid = 202201; p1.uid =1001;p2.pid = 202202; p2.uid =1002;p3.pid = 202203; p3.uid =1003;p4.pid = 202204; p4.uid =1004;wait(S,p1);     //p1申请资源wait(S,p2);     //p2申请资源wait(S,p3);     //p3申请资源signal(S,p2);   //p2释放资源wait(S,p4);     //p4申请资源signal(S,p1);  //p1释放资源signal(S,p4);  //p4释放资源signal(S,p3);  //p3释放资源return 0;
}

实现效果

进程 202201 在申请资源
进程 202201 正在使用资源
此时共享资源数量为: 1   ,阻塞队列:NULL进程 202202 在申请资源
进程 202202 正在使用资源
此时共享资源数量为: 0   ,阻塞队列:NULL进程 202203 在申请资源
进程 -1 申请资源失败,进入阻塞队列
此时共享资源数量为: -1  ,阻塞队列:202203 -> NULL进程 202202 正在释放资源
进程 202202 释放资源完毕,存在阻塞进程,将其唤醒
进程 202203 正在使用资源
此时共享资源数量为: 0   ,阻塞队列:NULL进程 202204 在申请资源
进程 -1 申请资源失败,进入阻塞队列
此时共享资源数量为: -1  ,阻塞队列:202204 -> NULL进程 202201 正在释放资源
进程 202201 释放资源完毕,存在阻塞进程,将其唤醒
进程 202204 正在使用资源
此时共享资源数量为: 0   ,阻塞队列:NULL进程 202204 正在释放资源
进程 202204 释放资源完毕,未存在阻塞进程
此时共享资源数量为: 1   ,阻塞队列:NULL进程 202203 正在释放资源
进程 202203 释放资源完毕,未存在阻塞进程
此时共享资源数量为: 2   ,阻塞队列:NULL

C语言实现操作系统简单的P V操作相关推荐

  1. 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)

    问题:         系统中有一组生产者进程和一组消费者进程,生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区取出一个产品并使用(注:这里的产品可以理解成某种数据). 条件:生产者.消费者共享一 ...

  2. 语言axff所占字节数_【每日一答】(74)数组名v.s.指针变量,C语言其实很简单形象比喻为“是一个朋友圈的”...

    下图选自<C语言其实很简单>第8章: 问:请问张老师!书上第227页一句话:指针变量a本身的地址(a所在内存字节编号)是数组的地址,数值上与元素a[0]的地址相等! 这句话是什么意思,我看 ...

  3. 操作系统信号量与P、V操作 初步认识整理

    初步接触,若有不足之处,请各位不吝赐教.谢谢! 首先介绍:信号量 信号量包括整型信号量.结构型信号量.二值信号量. ① 整型信号量 最初,将信号量定义为一个共享的整型量,它保存可供使用的唤醒数目.如果 ...

  4. linux有哪些高级语言编译器,程序语言,操作系统,编译器三者之间有何关系?...

    程序语言,操作系统,编译器三者之间有何关系?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 程序语言,操作系统,编译器三 ...

  5. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

  6. 大学c语言基本程序,一个大学C语言试题的简单实现--员工信息管理程序

    一个大学C语言试题的简单实现,供参考. 题目: 员工信息管理程序 主要用结构体数组实现,用结构体表示每项记录,数据为:员工编号.姓名.性别.年龄.工龄.职务.部门.住址. 设计各个函数,分别实现以下功 ...

  7. android studio添加繁体,Android (Android studio3.0.1)一篇可以实现app多语言的转换(简单操作)的教程-Go语言中文社区...

    最近接触到了项目需要,多语言的转换.网上有很多资料,我整理一些,简单适合自己使用的操作. 第一步:打开Android studio 添加 Android Studio插件:AndroidLocaliz ...

  8. 持续排名GITHUB榜首的V语言竟是C++的孪生兄弟-V版毁灭战士值得点赞

    最近V语言持续在GITHUB上霸屏,而笔者在上周介绍了V语言的一些基础,详见:GITHUB排行榜C位出道-手把手教你玩转V语言版的俄罗斯方块,而这周我也持续关注了V语言的动态,这次带大家玩一下V语言版 ...

  9. R语言grafify包简单、快速绘制19个漂亮的统计图实战

    R语言grafify包简单.快速绘制19个漂亮的统计图实战 目录 R语言grafify包简单.快速绘制19个漂亮的统计图实战 #grafify是什么?

最新文章

  1. linux异常 - 无法分配内存
  2. pip freeze requirements.txt 分隔 sudo pip install -r requirements.txt
  3. LINK : fatal error LNK1168: cannot open Debug/Test.exe for writing
  4. Intel Realsense D435 开始运行启动时报错:RuntimeError: Couldn't resolve requests 原因及解决办法
  5. 一位996、CRUD开发者的一天
  6. NJUST4316(立体几何投影的面积交)
  7. 昨天日志 今天日志的获取方法
  8. C语言 #pragma once - C语言零基础入门教程
  9. python如何设置字体大小_[Python Basic]如何设置 Python 的运行环境
  10. 从前M个字母中取N个的无重复排列(回溯)
  11. 使用静态容器防止并发修改同一对象
  12. 8个正弦波逆变器带你感受生活中无处不在的科技魅力
  13. 【deepstream部署Yolov6】
  14. 用大数据把电视观众“挖”出来
  15. Ps 钢笔工具的使用
  16. C++中换行endl和\n的区别
  17. Litestar 4D:统一眩光值计算
  18. SQL-按照最新时间分组
  19. 倍福---PLC 字符串类型string操作
  20. idea中开启多个线程运行多个项目

热门文章

  1. nrf52840烧录提示错误原因和解决办法
  2. fatal: unable to access ‘https://github.com/apc.git/‘: Failed to connect to github.comport 443:
  3. 服务器mtu值修改,更改服务器mtu值
  4. Java-MVC模式
  5. php getcwd文件件,PHP目录函数 getcwd (取得当前工作目录)
  6. 使用git从github上稳定下载项目
  7. Hive中sort by、distribute by、cluster by的区别及用法
  8. 云计算高级运维工程师
  9. 测试用例的设计-提高测试覆盖率
  10. Qtum量子链发布QIP-7:Qtum虚拟机升级,五大更新全面提升开发性能