操作系统进程模拟运行系统---C语言实现---Ss1Two

简介: 操作系统进程模拟运行系统---C语言实现---Ss1Two

做个操作系统进程模拟运行系统试试,就当复习一下OS和C了

对于Process Control Block并没有想太多只把瞬间想到的表征进程特性的项目记录了下来。

程序只是对进程的运行步骤进行简单模拟,并未完全实现进程在内存中的创建、运行、阻塞、唤醒、撤销等过程。

为了debug方便程序并没有对输入缓存区进行任何限制,若输入格式有误造成程序崩溃属正常现象。当然,在每一条输入语句后面加一句fflush(stdin);即可简单解决。其余格式问题对输入值做条件限制即可,因为我实在是太懒了,所以就不弄了;

C语言程序描述如下:

#include<stdio.h>
#include<stdlib.h>

struct process_type {
    int proId;//process id,标识进程ID。
    int priority;//标识进程优先级
    int size;//标识进程size,无单位。
    int state;//标识进程satae,0表示不在内存,1表示在内存,2表示阻塞
    char info[10];//标识进程information。
};

//定义20个进程结构体
struct process_type memory[20];

//定义全局变量
int proNum = 0, numofblocked = 0, proId;

//创建进程函数
void CreateProcess() {
    if (proNum >= 20)printf("\n内存已满,请先唤醒或杀死进程n");
    //最多允许创建20个进程。
    else {
        int i, j;
        for (i = 0; i < 20; i++)
            //定位,找到可以还未创建的进程
            if (memory[i].state == 0)break;
        printf("\n请输入新进程ID \n");
        scanf("%d", &(memory[i].proId));
        for (j = 0; j < i; j++) {
            if (memory[i].proId == memory[j].proId) {
                printf("\n该进程已存在n");
                return;
            }
        }
        printf("\n请输入新进程优先级 \n");
        scanf("%d", &(memory[i].priority));
        printf("\n请输入新进程大小 \n");
        scanf("%d", &(memory[i].size));
        printf("\n请输入新进程内容 \n");
        scanf("%s", &(memory[i].info));
        //创建进程,使标记位为1
        memory[i].state = 1;
        proNum++;
    }
}

//显示正在运行进程函数 
void RunningProcess() {
    int i, count = 0;
    for (i = 0; i < 20; i++) {
        if (memory[i].state == 1) {
            //输出运行进程的各个属性值
            printf("\n进程%d\tproId=%d\t", i + 1, memory[i].proId);
            printf("priority=%d\t", memory[i].priority);
            printf("size=%d\t", memory[i].size);
            printf("state=%d\t", memory[i].state);
            printf("info=%s\n", memory[i].info);
            count++;
        }
    }
    printf("当前进程运行数为%d\n", count);
}

//阻塞进程函数 
void BlockProcess() {
    if (!proNum) {
        printf("当前没有运行进程\n");
        return;
    }
    printf("\n请输入需要阻塞的进程ID ");
    scanf("%d", &proId);
    int i;
    for (i = 0; i < 20; i++) {
        //定位,找到所要阻塞的进程,根据其状态做相应处理
        if (proId == memory[i].proId) {
            if (memory[i].state == 1) {
                memory[i].state = 2;
                numofblocked++;
                printf("\n已经成功阻塞进程\n");
            } else if (memory[i].state == 0) {
                printf("\n要阻塞的进程不存在\n");
            } else printf("\n要阻塞的进程已被阻塞\n");
            break;
        }
    }
    if (i >= 20) {
        printf("\n要阻塞的进程不存在\n");
    }
}

//杀死进程函数 
void KillProcess() {
    if (!proNum) {
        printf("当前没有运行进程\n");
        return;
    }
    printf("\n请输入需要杀死的进程ID ");
    scanf("%d", &proId);
    int i;
    for (i = 0; i < 20; i++) {
        //定位,找到所要杀死的进程,根据其状态做相应处理
        if (proId == memory[i].proId) {
            if (memory[i].state == 1) {
                memory[i].state = 0;
                proNum--;
                printf("\n已成功杀死进程\n");
            } else if (memory[i].state == 0)
                printf("\n:要杀死的进程不存在\n");
            else printf("\n要杀死的进程已被阻塞\n");
            break;
        }
    }
    //找不到,则说明进程不存在
    if (i >= 20) {
        printf("\n要杀死的进程不存在\n");
    }
}

//唤醒进程函数 
void RouseProcess() {
    if (!proNum) {
        printf("\n当前没有运行进程\n");
        return;
    }
    if (!numofblocked) {
        printf("\n当前没有阻塞进程\n");
        return;
    }
    printf("\n请输入需要唤醒的进程ID:\n");
    scanf("%d", &proId);
    int i;
    for (i = 0; i < 20; i++) {
        //定位,找到所要唤醒的进程,根据其状态做相应处理
        if (proId == memory[i].proId) {
            if (memory[i].state == 2) {
                memory[i].state = 1;
                numofblocked--;
                printf("\n已经成功唤醒进程\n");
            } else if (memory[i].state == 0) {
                printf("\n要唤醒的进程不存在\n");
            } else
                printf("\n要唤醒的进程正在运行,不必唤醒!\n");
            printf("%当前阻塞进程数为:%d", numofblocked);
            break;
        }
    }
    //找不到,则说明进程不存在
    if (i >= 20) {
        printf("\n要唤醒的进程不存在\n");
    }
}

//退出程序函数 
void EndOfJob() {
    printf("谢谢使用,正在退出!\n");
    exit(0);
}

//主函数 
void main() {
    int num, i;
    //一开始所有进程都不在内存中
    for (i = 0; 1 < 20; i++) {
        memory[i].state = 0;
        while (1) {
            printf("\n---------------------------------");
            printf("\n*进程演示系统*");
            printf("\n---------------------------------");
            printf("\n*1.创建新的进程\t*2.查看运行进程");
            printf("\n*3.阻塞某个进程\t*4.杀死运行进程");
            printf("\n*5.唤醒某个进程\t*0.退出系统");
            printf("\n---------------------------------");
            printf("\n请选择(0~5)\n");
InputError:
            scanf("%d", &num);
            switch (num) {
                case 1:
                    CreateProcess();
                    break;
                case 2:
                    RunningProcess();
                    break;
                case 3:
                    BlockProcess();
                    break;
                case 4:
                    KillProcess();
                    break;
                case 5:
                    RouseProcess();
                    break;
                case 0:
                    EndOfJob();
                default: {
                    printf("%输入错误!请重新输入: ");
                    goto InputError;
                }
            }
        }
    }
}
那就这样吧,再见!
目录
相关文章
|
1月前
|
安全 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统优化策略####
当今数字化时代,移动应用已成为日常生活不可或缺的一部分,而移动操作系统则是支撑这些应用运行的基石。本文旨在探讨当前移动应用开发的最新趋势,分析主流移动操作系统的特点及优化策略,为开发者提供有价值的参考。通过深入剖析技术创新、市场动态与用户需求变化,本文力求揭示移动应用与系统协同发展的内在逻辑,助力行业持续进步。 ####
44 9
|
29天前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
50 4
|
14天前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
92 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
3天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
35 13
|
9天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
39 12
|
15天前
|
安全 前端开发 Android开发
探索移动应用与系统:从开发到操作系统的深度解析
在数字化时代的浪潮中,移动应用和操作系统成为了我们日常生活的重要组成部分。本文将深入探讨移动应用的开发流程、关键技术和最佳实践,同时分析移动操作系统的核心功能、架构和安全性。通过实际案例和代码示例,我们将揭示如何构建高效、安全且用户友好的移动应用,并理解不同操作系统之间的差异及其对应用开发的影响。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和知识。
|
18天前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
46 6
|
15天前
|
人工智能 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统演进####
本文深入剖析了移动应用开发的最新趋势与移动操作系统的演进历程,揭示了技术创新如何不断推动移动互联网生态的变革。通过对比分析不同操作系统的特性及其对应用开发的影响,本文旨在为开发者提供洞察未来技术方向的视角,同时探讨在多样化操作系统环境中实现高效开发的策略。 ####
18 0
|
20天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
20天前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
44 1
下一篇
DataWorks