操作系统进程模拟运行系统---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开发 数据安全/隐私保护
移动应用与系统:探索开发趋势与操作系统的协同进化####
当今时代,移动应用不再仅仅是简单的软件工具,它们已成为扩展智能手机及平板等设备功能的关键。本文旨在深入分析当前移动应用的开发趋势,探讨移动操作系统的最新进展及其对应用开发的影响,并阐述两者如何相互促进、协同进化,共同推动移动互联网技术向前发展。 ####
|
3天前
|
移动开发 人工智能 Android开发
移动应用与系统:探索移动开发与操作系统的协同进化####
当今数字化时代,移动设备已成为日常生活不可或缺的一部分。本文旨在深入探讨移动应用开发与移动操作系统之间的紧密关系及其相互影响,揭示技术创新如何推动这一领域的发展。通过分析当前主流移动操作系统的特点、移动应用的开发趋势以及两者间的互动机制,本文为开发者和用户提供了一个全面了解该领域的窗口。 ####
|
1天前
|
开发工具 Android开发 iOS开发
移动应用与系统:涵盖移动应用开发、移动操作系统等相关话题####
本文深入探讨了移动应用开发和移动操作系统的复杂世界。从移动应用开发的基本概念到移动操作系统的核心功能,再到两者如何相互作用以提供无缝的用户体验,本文全面涵盖了这一领域的各个方面。无论你是开发者、技术爱好者还是普通用户,这篇文章都将为你提供有价值的见解。 ####
8 1
|
2天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
6天前
|
人工智能 物联网 Android开发
移动应用与系统:探索开发趋势与操作系统的协同进化####
本文深入探讨了移动应用开发的当前趋势,以及这些趋势如何与移动操作系统的发展相互影响、协同进化。通过分析最新的技术动态、市场数据及用户行为变化,本文旨在为开发者提供关于未来移动应用开发方向的洞察,并讨论操作系统层面的创新如何促进或制约应用的发展。 ####
|
6天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
23 3
|
8天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
8天前
|
安全 Android开发 iOS开发
移动应用与系统:探索移动应用开发与操作系统的协同进化###
【10月更文挑战第29天】 本文深入探讨了移动应用开发与移动操作系统之间的紧密联系与相互促进作用,分析了当前主流移动操作系统(如iOS、Android)的最新特性及其对应用开发的影响,并展望了未来移动应用与系统协同发展的新趋势。通过具体案例分析,揭示了开发者如何利用系统特性优化应用性能,提升用户体验,同时指出了跨平台开发工具的兴起如何进一步模糊了应用与系统间的界限,推动了整个移动互联网生态系统的繁荣发展。 ###
30 2
|
8天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
7天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理的艺术
【10月更文挑战第33天】本文旨在揭示操作系统中进程管理的神秘面纱,带领读者从理论到实践,探索进程调度、同步以及通信的精妙之处。通过深入浅出的解释和直观的代码示例,我们将一起踏上这场技术之旅,解锁进程管理的秘密。
13 0