项目记录:一个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 1024

typedef 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.mfbz.cn/a/580365.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

堆的介绍,实现(c语言实现)

目录 堆的概念 堆的性质&#xff1a; 堆的分类 父子结点的下标关系 堆的向下调整算法 ​编辑小堆 大堆 建堆 堆的向上调整算法 小堆 大堆 堆的基本操作 定义堆 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 大堆&#xff08;Max Heap&#xff09;的向下调整算法…

白酒:香型创新在白酒市场竞争中的优势与策略

在香型创新方面展现出明显的市场竞争优势&#xff0c;香型创新不仅满足了消费者对口味多样化的需求&#xff0c;还为酒厂带来了差异化竞争优势。在白酒市场竞争中&#xff0c;实施进一步的香型创新策略对于提升品牌曝光度和市场份额至关重要。 首先&#xff0c;香型创新能够满足…

三篇多模态大模型进展综述

Modality Bridging 综述 多模态大型语言模型&#xff08;MLLM&#xff09;可实现基于图像撰写故事和无 OCR 的数学推理&#xff0c;在传统方法中很少见&#xff0c;这表明了通向通用人工智能的潜在路径。 通常人们会在 pair 数据上进行大规模&#xff08;相对于 instruction t…

【千帆平台】AppBuilder工作流编排新功能体验之创建自定义组件

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言工作流编排组件 创建组件组件界面组件信息 组件画布操作节点…

探索项目管理系统:解析五大功能,洞悉项目成功的关键

项目管理新手往往喜欢埋头苦干&#xff0c;殊不知优秀的项目经理已经熟练运用项目管理系统&#xff0c;让项目规划条理清晰。项目管理系统具备的功能&#xff0c;好用的项目管理系统都有这5大功能。分别是项目WBS分解、项目图表和报表、工时管理、团队协作、任务流程自动化。 一…

(学习日记)2024.04.28:UCOSIII第五十二节:User文件夹函数概览(uC-LIB文件夹)第二部分

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【中级软件设计师】上午题12-软件工程(1):软件工程模型、敏捷方法、软件需求、系统设计

上午题12-软件工程&#xff08;1&#xff09; 1 软件过程1.1 CMM 能力成熟度模型1.1 CMMI (建议直接看思维导图&#xff09; 2 软件过程模型2.1 瀑布模型2.2 增量模型2.3 演化模型2.3.1 原型模型2.3.2 螺旋模型 2.5 喷泉模型 3 统一过程&#xff08;UP&#xff09;模型4 敏捷方…

YOKOGAWA横河手操器维修hart通讯器YHC5150X-01

横河手操器设置注意事项&#xff1a;内藏指示计显示选择与单位设置 有如下 5 种显示模式及单位设置百分比显示、用户设置显示、用户设置和百分比交替显示、输入压力显示、输入压力和百分比交替显示。即应用在当没有输入时操作要求输出为20mA引压方向设置右/左侧高压&#xff0c…

CAS原理及其API原子类

目录 1.CAS及使用 1.1. CAS概念 1.2.原子类的使用 1.3.CAS使用自旋锁 2.CAS的ABA问题 2.1.问题介绍 2.2.ABA问题解决方式 1.CAS及使用 1.1. CAS概念 &#xff08;1&#xff09;CAS&#xff0c;其实是一种操作的简称&#xff0c;全称为&#xff1a;Compare and swap。 …

HNU-数据库系统-甘晴void学习感悟

前言 过程坎坷&#xff0c;终局满意。 感觉是学懂了知识&#xff0c;并且拿到了分数这样的学科。 【先把这个位置占下来&#xff0c;之后有时间再补充】 教材如下&#xff1a; 总领 有点忘记了&#xff0c;可参考当时记录的笔记&#xff1a; 数据库系统-甘晴void学习笔记-…

【三】Spring Cloud Ribbon 实战

Spring Cloud Ribbon 实战 概述 一直在构思写一个spring cloud系列文章&#xff0c;一方面是对自己实践经验进行一次完整的梳理&#xff0c;另一方面也是希望能够给初学者一些借鉴&#xff0c;让初学者少走些弯路&#xff0c;看到本系列博客就能够很好的把微服务系列组件用好。…

使用QTcpSocket

(1)客户端每隔10ms向服务器发送一次数字字符串&#xff0c;从0开始。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpSocket> #include <QLabel> #include <QTimer> namespace Ui { class MainWindow; }class Mai…

MAVEN的安装与配置

MAVEN的安装与配置 1 简介 1.1 什么是MAVEN? Maven是一个项目构建及管理工具&#xff0c;开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c; Maven 使用了一个标准的目录结构在不同开发工具中也能实现项目结构的统一。Maven提供了清理&#xff0c;编…

【Vue】组件化编程

定义 实现应用中局部功能代码和资源的集合 为什么要用组件化编程? 传统方式编写:依赖关系混乱,不好维护,且代码复用率不高 模块化编写:只关注解决js,复用js,简化js的编写与效率 组件方式编写:好维护、复用率更高、提高运行效率 在组件出现之前,我们开发基本都是用htm…

【综述】DSP处理器芯片

文章目录 TI DSP C2000系列 TMS320F28003X 典型应用 开发工具链 参考资料 TI DSP TI C2000系列 控制领域 TI C5000系列 通信领域 TI C6000系列 图像领域 C2000系列 第三代集成了C28浮点DSP内核&#xff0c;采用了65nm工艺&#xff08;上一代180nm&#xff09; 第四代正在…

PyCharm 无法运行的解决方案

问题&#xff1a; PyCharm 无法运行&#xff0c;该怎么办&#xff1f; 解决方案&#xff1a; 1. 检查 Python 解释器 确保已为 PyCharm 配置正确的 Python 解释器。打开 PyCharm&#xff0c;转到“文件”>“设置”>“项目”>“Python 解释器”。选择所需的 Python …

怎么在海外平台买东西?Nike海淘攻略

不管在那个海外平台买东西首先要进入官网&#xff0c;最好注册一个gmail账号&#xff0c;这样使用范围比较宽广&#xff0c;在对应平台进行注册账号&#xff0c;比如亚马逊、ebay、Etsy等等 一、Nike海淘攻略 1、然后如果已经会员的话直接输入账号密码登录&#xff0c;如果不…

AI大模型探索之路-训练篇3:大语言模型全景解读

文章目录 前言一、语言模型发展历程1. 第一阶段&#xff1a;统计语言模型&#xff08;Statistical Language Model, SLM&#xff09;2. 第二阶段&#xff1a;神经语言模型&#xff08;Neural Language Model, NLM&#xff09;3. 第三阶段&#xff1a;预训练语言模型&#xff08…

顺通拖鞋ERP企业销售管理系统:驱动销售业绩飙升的利器

顺通企业销售管理系统通过集成客户信息、销售流程、数据分析等功能&#xff0c;帮助企业全面提升销售效率和业绩&#xff0c;成为驱动销售业绩飙升的利器。此外&#xff0c;系统还支持销售流程的可视化展示&#xff0c;使销售人员能够清晰地了解销售进展&#xff0c;及时调整销…

短视频账号矩阵系统===4年技术源头打磨

短视频矩阵系统技术源头打磨需要从多个方面入手&#xff0c;以下是一些建议&#xff1a; 1. 基础技术研发&#xff1a;不断投入资金和人力进行基础技术研发&#xff0c;包括但不限于视频处理、人工智能、大数据等技术&#xff0c;以提高短视频矩阵系统的性能和稳定性。 2. 优化…