项目记录:一个C语言模拟操作系统的程序(1)

   记录一个我的C语言做的非常简单的小项目,本大冤种帮一个上大一的远房堂弟(不知道叫堂还是表了,反正是我妈亲戚家的)做的课程设计,要求做的是一个字符图形界面的操作系统模拟。等他答辩完,无偿贡献给大家~给我点点赞吧~

 题目: 模拟一个操作系统,该程序至少包含进程管理、处理机调度、文件管理和设备管理这四个基本功能,由C/C++编写。

(1)相关概念

进程调度 (Process Scheduling): 进程调度是操作系统中的一项重要任务,它负责决定哪个进程将获得处理机(CPU)的资源以执行其指令。操作系统中可能同时存在多个进程,但处理机在任何时刻只能执行一个进程的指令。进程调度的目的是合理地分配处理机资源,确保所有进程公平、高效地运行。可以想象成在电影院里,有很多观众排队买票,售票员(操作系统)需要决定先卖给谁票。

处理机调度 (CPU Scheduling): 处理机调度通常指的是同进程调度。在某些文献中,处理机调度可能更侧重于调度算法的实现,如先来先服务(FCFS)、轮转调度(Round Robin)、优先级调度(Priority Scheduling)等。这些算法决定了进程被分配处理机的顺序。处理机调度确保了处理机资源的合理利用,防止某些进程长时间占用处理机而影响其他进程的执行。

文件管理 (File Management): 文件管理是操作系统中的另一个关键功能,它涉及文件的创建、删除、存储、检索和组织。操作系统提供了一套文件系统,使得用户和程序能够方便地访问和操作文件。文件管理还包括目录管理和空间管理,确保文件存储的有效性和安全性。就像图书馆的图书管理员一样,文件管理系统帮助我们找到、整理和保护我们的“书籍”(文件)。

设备管理 (Device Management): 设备管理指的是操作系统对硬件设备的控制和管理。这包括分配和释放输入输出设备,如打印机、键盘、鼠标等,以及处理设备之间的数据传输。设备管理还涉及到缓冲管理,即在内存中暂时存放数据,以协调处理机与设备之间速度不匹配的问题。设备驱动程序是设备管理的一部分,它们是操作系统与硬件设备之间通信的桥梁。可以想象成设备管理就像一个仓库管理员,负责管理仓库中所有物品(设备)的进出和存储。

(2)基础功能代码:

1.功能1:进程管理
//功能1:进程管理
void process_management(Process *processes, int *count) {printf("Process Management:\n");print_process_list(processes, *count);// 1. 创建一个新进程if (*count < 10) {processes[*count].pid = (*count) + 1;processes[*count].name = "Process_new";processes[*count].priority = 1;processes[*count].state = 1; // 假设1为就绪态(*count)++;printf("Created new process with PID %d\n", processes[*count - 1].pid);}// 2. 删除一个已存在的进程(这里假设删除最后一个进程)if (*count > 0) {(*count)--;printf("Deleted process with PID %d\n", processes[*count].pid);// 清理进程信息processes[*count].pid = 0;processes[*count].name = NULL; // 注意:应使用 free() 释放已分配的内存processes[*count].priority = 0;processes[*count].state = 0;}// 3. 进程状态转换(这里假设将第一个进程从就绪变为运行)if (*count > 0) {if (processes[0].state == 1) {processes[0].state = 2;printf("Changed process with PID %d state to running\n", processes[0].pid);}}// 4. 阻塞一个进程int pid_to_block = 2; // 假设我们要阻塞 PID 为 2 的进程for (int i = 0; i < *count; i++) {if (processes[i].pid == pid_to_block && processes[i].state == 2) {processes[i].state = 3;printf("Process with PID %d is blocked\n", processes[i].pid);break;}}// 5. 解除阻塞一个进程int pid_to_unblock = 2; // 假设我们要解除 PID 为 2 的进程的阻塞for (int i = 0; i < *count; i++) {if (processes[i].pid == pid_to_unblock && processes[i].state == 3) {processes[i].state = 1;printf("Process with PID %d is unblocked and is now ready\n", processes[i].pid);break;}}// 6. 再次打印进程列表,以显示更改print_process_list(processes, *count);
}
2.功能2:处理机调度
// 功能2:处理机调度函数,这里用的是比较简化的版本,因为他没有具体要求
void scheduler(Process *processes, int count) {printf("Scheduler:\n");// 使用简单的轮转调度算法srand(time(NULL)); // 初始化随机数发生器for (int i = 0; i < count; i++) {int random_pid = rand() % count;processes[random_pid].state = 2; // 将随机进程设置为运行态}// 打印当前“运行”的进程printf("Process in running state: PID %d\n", processes[rand() % count].pid);
}
3.功能3:文件管理
// 功能3:文件管理函数,也是简化版,因为他没有具体提要求
void file_management() {FILE *file_ptr;char *filename = "example.txt"; // 要操作的文件名char buffer[50];const char *text_to_write = "Hello, World!";char *read_text = "This is a test.";printf("File Management:\n");// 1.文件创建file_ptr = fopen(filename, "w"); // 以写入模式打开文件,如果文件不存在则创建if (file_ptr == NULL) {printf("Error creating file.\n");return;}printf("File '%s' created.\n", filename);fclose(file_ptr); // 关闭文件// 2.文件写入file_ptr = fopen(filename, "a"); // 以追加模式打开文件if (file_ptr == NULL) {printf("Error opening file for writing.\n");return;}fputs(text_to_write, file_ptr); // 写入文本printf("Text '%s' written to file '%s'.\n", text_to_write, filename);fclose(file_ptr);//3.文件读取file_ptr = fopen(filename, "r"); // 以读取模式打开文件if (file_ptr == NULL) {printf("Error opening file for reading.\n");return;}fgets(buffer, 50, file_ptr); // 从文件中读取一行printf("Text read from file: '%s'\n", buffer);fclose(file_ptr);// 4.文件删除if (remove(filename) != 0) {printf("Error deleting file.\n");} else {printf("File '%s' deleted.\n", filename);}
}

4.功能4:设备管理

// 功能4:设备管理函数
void device_management() {printf("Device Management:\n");init_device_pool(); // 初始化设备池// 模拟设备分配if (allocate_device(devices, 1)) {// 模拟写I/O请求char data_to_write[] = "Hello, World!";if (io_request(devices, 1, data_to_write, strlen(data_to_write), 1)) {printf("Data written successfully to device 1\n");} else {printf("Failed to write data to device 1\n");}// 模拟读I/O请求char read_buffer[BUFFER_SIZE];if (io_request(devices, 1, read_buffer, strlen(data_to_write), 0)) {printf("Data read successfully from device 1: %s\n", read_buffer);} else {printf("Failed to read data from device 1\n");}// 模拟设备释放deallocate_device(devices, 1);}
}
#define DEVICE_COUNT 5
#define BUFFER_SIZE 1024typedef struct {int device_id;char *device_name;int is_allocated;char *buffer; // 模拟缓冲区int buffer_filled; // 缓冲区状态
} Device;// 设备数组
Device devices[DEVICE_COUNT];// 初始化设备池
void init_device_pool() {for (int i = 0; i < DEVICE_COUNT; i++) {devices[i].device_id = i;devices[i].device_name = "Device_X"; // 以X代替实际设备名称devices[i].is_allocated = 0;devices[i].buffer = (char *)malloc(BUFFER_SIZE);devices[i].buffer_filled = 0;}
}// 分配设备
int allocate_device(Device *dev, int device_id) {for (int i = 0; i < DEVICE_COUNT; i++) {if (devices[i].device_id == device_id && !devices[i].is_allocated) {devices[i].is_allocated = 1;return 1; // 分配成功}}return 0; // 分配失败
}// 释放设备
void deallocate_device(Device *dev, int device_id) {for (int i = 0; i < DEVICE_COUNT; i++) {if (devices[i].device_id == device_id && devices[i].is_allocated) {free(devices[i].buffer); // 释放缓冲区devices[i].is_allocated = 0;devices[i].buffer = NULL;devices[i].buffer_filled = 0;return;}}
}// 模拟I/O请求
int io_request(Device *dev, int device_id, char *data, size_t size, int write) {for (int i = 0; i < DEVICE_COUNT; i++) {if (devices[i].device_id == device_id && devices[i].is_allocated) {if (write) {// 写入数据到缓冲区if (devices[i].buffer_filled + size > BUFFER_SIZE) {// 缓冲区溢出,模拟错误处理printf("Buffer overflow error on device %d\n", device_id);return 0;}memcpy(devices[i].buffer + devices[i].buffer_filled, data, size);devices[i].buffer_filled += size;return 1; // 写入成功} else {// 从缓冲区读取数据if (devices[i].buffer_filled == 0) {printf("Buffer underflow error on device %d\n", device_id);return 0;}size = (size > devices[i].buffer_filled) ? devices[i].buffer_filled : size;memcpy(data, devices[i].buffer, size);memset(devices[i].buffer, 0, size); // 清空已读取的数据devices[i].buffer_filled -= size;return 1; // 读取成功}}}return 0; // 设备未找到或未分配
}

等周末更新,有实现界面和主函数的嘻嘻~因为那人还没交所以我先不更~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:http配置用户登录认证访问网页

Linux&#xff1a;http配置用户登录认证访问网页 创建账户认证文件 # 第一次需要加-c&#xff08;创建create&#xff09;-m&#xff08;修改&#xff09; [rootserver100 ~]# htpasswd -cm /etc/nginx/.htpasswd shanxin New password: Re-type new password: Adding passwo…

Three.js使用动画库( GSAP 一款基于 JavaScript 的 web动画库)

安装 npm install gsap使用 <template><div></div> </template><script setup> import * as THREE from three; import { OrbitControls } from three/addons/controls/OrbitControls.js; // 导入动画库 import gsap from gsap// 场景 const s…

适用于芯片行业的开发及管理工具:版本控制、持续集成、代码分析及项目管理工具介绍

3月28日-29日&#xff0c;2024国际集成电路展览会暨研讨会&#xff08;IIC Shanghai&#xff09;在上海成功举行。此次盛会汇聚了集成电路产业的众多领军企业&#xff0c;共同探寻和把握集成电路产业的发展脉络。 龙智携芯片研发及管理解决方案亮相展会&#xff0c;展示如何通…

什么是外汇杠杆交易?

外汇杠杆交易是目前的外汇交易市场中&#xff0c;投资者进行外汇交易的重要方式&#xff0c;通过这样的交易方式&#xff0c;投资者就有机会进行以小搏大的交易&#xff0c;他们的交易就有可能会更成功&#xff0c;因此&#xff0c;投资者应该对这样的交易方式进行了解&#xf…

springboot 集成 activemq

文章目录 一&#xff1a;说明二&#xff1a;e-car项目配置1 引入activemq依赖2 application启动类配置消息监听3 application.yml配置4 MQConfig.java 配置类5 ecar 项目中的监听6 junit 发送消息 三&#xff1a;tcm-chatgpt项目配置5 MQListener.java 监听消息 三 测试启动act…

Java23种设计模式-行为型模式之访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;&#xff1a;主要用于解决对象结构中元素的行为操作问题。这种模式允许在不修改对象结构的情况下&#xff0c;为其添加新的操作。 主要角色&#xff1a; 访问者&#xff08;Visitor&#xff09;&#xff1a;定义了一个访问元…

RV1126添加gc2093摄像头

前言 上篇讲的是双目摄像头GC2053摄像头进行拉流&#xff0c;本篇介绍下如何适配添加RGB Sensor GC2093并且可以在windows上成功拉取视频流 平台背景 开发板&#xff1a;易百纳开发板 cpu: rv1126 sensor: gc2093 200w像素 2lanes type&#xff1a;MIPI kernel: 4.19.111 sys…

K8S深度解析:从入门到精通的全方位指南

目录 一、Kubernetes简介 二、Kubernetes的核心作用 三、Kubernetes架构图例 四、Kubernetes核心概念 Harbor仓库概述&#xff1a; Master----管理组件&#xff1a; API Server&#xff08;集群之心&#xff09;&#xff1a; Scheduler&#xff08;调度大师&…

基于Transformer深度学习的翻译模型(英->中)源码系统

第一步&#xff1a;Transformer介绍 Transformer是一种基于注意力机制的序列到序列模型&#xff0c;它在机器翻译任务中表现出色并逐渐成为自然语言处理领域的主流模型。Transformer模型的核心思想是使用自注意力机制&#xff08;self-attention&#xff09;来捕捉输入序列中各…

Redis系列:内存淘汰策略

1 前言 通过前面的一些文章我们知道&#xff0c;Redis的各项能力是基于内存实现的&#xff0c;相对其他的持久化存储&#xff08;如MySQL、File等&#xff0c;数据持久化在磁盘上&#xff09;&#xff0c;性能会高很多&#xff0c;这也是高速缓存的一个优势。 但是问题来了&am…

如果通过Glide 设置图片圆角

要给图片设置一个圆角,通常方法是在ImageView 标签外添加一个CardView 标签,然后设置圆角值,但是今天遇到一个问题就是 RecyclerView Item 中这样操作的话会遇到这样的一个报错: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.rec…

RLC防孤岛负载测试,你了解多少?

RLC防孤岛负载测试是一种用于检测并防止电力系统中出现孤岛现象的测试方法。孤岛现象是指在电网故障或停电的情况下&#xff0c;部分电网与主电网断开连接&#xff0c;形成一个独立的、不受控制的电力系统。这种情况下&#xff0c;如果不及时切断与孤岛的连接&#xff0c;可能会…

【SAP ME 27】SAP ME创建开发组件(DC)serviceExt

目录 1、说明 2、创建开发组件(DC) 3、相关性 4、公共部分 5、构建

HarmonyOS 应用开发——入门

首先当然是华为的官方文档了&#xff0c;要认真学习: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-overview-0000001478061421-V2 不想花时间看&#xff0c;可以看我下面总结的干货&#xff0c;哈哈 第一个问题&#xff1a;stage架构和fa架构的区…

GPU服务器和普通服务器有何区别?

众所周知&#xff0c;服务器是网络中的重要设备&#xff0c;要接受少至几十人、多至成千上万人的访问&#xff0c;因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。 GPU服务器和普通服务器的主要区别在于硬件配置和适用场景&#xff0c;特别是处理器…

应急行业的智能安全帽(高端)

前面介绍了低端、中端安全帽&#xff0c;接着再讲讲高端安全帽。做高端安全帽的企业非常少&#xff0c;估计一只手都数的出来。确实也和智能安全帽这个领域体量有关系&#xff0c;并且他有一个新的“劲敌”——智能眼镜从其他领域瓜分原属于他的市场&#xff0c;这些都是题外话…

static为什么不能修饰String类

在Java中&#xff0c;static 关键字用于修饰类成员&#xff08;字段、方法、内部类&#xff09;以及代码块&#xff0c;它主要表示这些成员或代码块与类本身关联&#xff0c;而不是与类的实例关联。当你提到 static 不能修饰 String 类时&#xff0c;我猜你可能是在思考为什么 …

【操作系统】线程和进程的区别 详细版

进程的定义与特征 进程是一个正在执行的程序的实例。当我们运行一个程序时&#xff0c;它并不会立即执行。程序需要经过一系列步骤才能执行&#xff0c;而这些执行步骤被称为进程&#xff0c;进程是一个正在执行的程序的实例。每个进程都拥有自己的内存空间&#xff0c;与其他…

Cadence OrCAD学习笔记(1)OrCAD入门介绍

最近换份工作主要用到Cadence&#xff0c;之前都是用AD居多&#xff0c;所以现在也开始记录下Cadence学习过程&#xff0c;方便后面复习。 参考教程&#xff1a; OrCAD视频教程第1期&#xff1a;OrCAD入门介绍_哔哩哔哩_bilibili 本期主要介绍OrCAD的主要部件 其中用的较多的…

【软件开发规范篇】Git分支使用规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…