| 
 | 
 
 
发表于 2024-12-16 14:48:50
|
显示全部楼层
 
 
 
 
 
下面是扩展后的C语言代码示例,加入了就绪队列的概念,并在创建两个具体的计算进程时进行了操作: 
 
- #include <stdio.h>
 
 - #include <stdlib.h>
 
 - #include <string.h>
 
  
- #define MAX_PROCESSES 20
 
  
- struct Process {
 
 -     int pid;
 
 -     int priority;
 
 -     int size;
 
 -     int status; // 0 - 不在内存, 1 - 在内存, 2 - 阻塞
 
 -     char info[256];
 
 - };
 
  
- struct Process processTable[MAX_PROCESSES];
 
 - int readyQueue[MAX_PROCESSES];
 
 - int count = 0; // 当前进程数量
 
 - int blockCount = 0; // 阻塞进程数量
 
 - int readyCount = 0; // 就绪进程数量
 
  
- void addToReadyQueue(int pid) {
 
 -     if (readyCount < MAX_PROCESSES) {
 
 -         readyQueue[readyCount++] = pid;
 
 -         printf("进程%d已加入就绪队列\n", pid);
 
 -     } else {
 
 -         printf("就绪队列已满\n");
 
 -     }
 
 - }
 
  
- int createProcess(int pid, int priority, int size, const char *info) {
 
 -     if (count >= MAX_PROCESSES) {
 
 -         printf("内存已满, 请先唤醒或杀死进程\n");
 
 -         return -1;
 
 -     }
 
  
-     for (int i = 0; i < count; i++) {
 
 -         if (processTable[i].pid == pid) {
 
 -             printf("该进程已存在\n");
 
 -             return -1;
 
 -         }
 
 -     }
 
  
-     struct Process newProcess;
 
 -     newProcess.pid = pid;
 
 -     newProcess.priority = priority;
 
 -     newProcess.size = size;
 
 -     strcpy(newProcess.info, info);
 
 -     newProcess.status = 1;
 
  
-     processTable[count++] = newProcess;
 
 -     addToReadyQueue(pid);
 
 -     return 0;
 
 - }
 
  
- void displayRunningProcesses() {
 
 -     int flag = 0;
 
 -     for (int i = 0; i < count; i++) {
 
 -         if (processTable[i].status == 1) {
 
 -             printf("pid = %d\t", processTable[i].pid);
 
 -             printf("priority = %d\t", processTable[i].priority);
 
 -             printf("size = %d\t", processTable[i].size);
 
 -             printf("status = %d\t", processTable[i].status);
 
 -             printf("info = %s\n", processTable[i].info);
 
 -             flag = 1;
 
 -         }
 
 -     }
 
  
-     if (!flag) {
 
 -         printf("当前没有运行进程\n");
 
 -     }
 
 - }
 
  
- void blockProcess() {
 
 -     if (count == 0) {
 
 -         printf("当前没有运行进程\n");
 
 -         return;
 
 -     }
 
  
-     int pid;
 
 -     printf("输入要阻塞进程的pid值\n");
 
 -     scanf("%d", &pid);
 
  
-     for (int i = 0; i < count; i++) {
 
 -         if (processTable[i].pid == pid) {
 
 -             if (processTable[i].status == 1) {
 
 -                 processTable[i].status = 2;
 
 -                 blockCount++;
 
 -                 printf("已经成功阻塞该进程\n");
 
 -                 return;
 
 -             } else if (processTable[i].status == 0) {
 
 -                 printf("要阻塞的进程不存在\n");
 
 -                 return;
 
 -             } else {
 
 -                 printf("该进程已被阻塞\n");
 
 -                 return;
 
 -             }
 
 -         }
 
 -     }
 
 -     printf("要阻塞的进程不存在\n");
 
 - }
 
  
- void killProcess() {
 
 -     if (count == 0) {
 
 -         printf("当前没有运行进程\n");
 
 -         return;
 
 -     }
 
  
-     int pid;
 
 -     printf("输入要杀死进程的pid值:\n");
 
 -     scanf("%d", &pid);
 
  
-     for (int i = 0; i < count; i++) {
 
 -         if (processTable[i].pid == pid) {
 
 -             if (processTable[i].status != 0) {
 
 -                 processTable[i].status = 0;
 
 -                 printf("已成功杀死该进程\n");
 
 -                 return;
 
 -             } else {
 
 -                 printf("要杀死的进程不存在\n");
 
 -                 return;
 
 -             }
 
 -         }
 
 -     }
 
 -     printf("要杀死的进程不存在\n");
 
 - }
 
  
- void notifyProcess() {
 
 -     if (count == 0) {
 
 -         printf("当前没有运行进程\n");
 
 -         return;
 
 -     }
 
 -     if (blockCount == 0) {
 
 -         printf("当前没有阻塞进程\n");
 
 -         return;
 
 -     }
 
  
-     int pid;
 
 -     printf("输入要唤醒的进程的pid:\n");
 
 -     scanf("%d", &pid);
 
  
-     for (int i = 0; i < count; i++) {
 
 -         if (processTable[i].pid == pid) {
 
 -             if (processTable[i].status == 2) {
 
 -                 processTable[i].status = 1;
 
 -                 blockCount--;
 
 -                 printf("已经成功唤醒进程\n");
 
 -                 addToReadyQueue(pid);
 
 -                 return;
 
 -             } else if (processTable[i].status == 0) {
 
 -                 printf("要唤醒的进程不存在\n");
 
 -                 return;
 
 -             } else {
 
 -                 printf("该进程未被阻塞\n");
 
 -                 return;
 
 -             }
 
 -         }
 
 -     }
 
 -     printf("要唤醒的进程不存在\n");
 
 - }
 
  
- void error() {
 
 -     printf("输入有误!!!请重新输入功能编号\n");
 
 - }
 
  
- int main() {
 
 -     int running = 1;
 
 -     // 创建两个进程来计算(3+2)-(5+2)
 
 -     createProcess(1, 1, 10, "Task: (3+2)");
 
 -     createProcess(2, 1, 10, "Task: (5+2)");
 
  
-     while (running) {
 
 -         printf("\n***********************************************************\n");
 
 -         printf("* 进程演示系统 *\n");
 
 -         printf("***********************************************************\n");
 
 -         printf("* 1. 创建新的进程 2. 查看运行进程 *\n");
 
 -         printf("* 3. 阻塞某个进程 4. 杀死运行进程 *\n");
 
 -         printf("* 5. 唤醒某个进程 6. 退出系统 *\n");
 
 -         printf("************************************************************\n");
 
 -         printf("请选择 (1~6)\n");
 
  
-         int choice;
 
 -         scanf("%d", &choice);
 
  
-         switch (choice) {
 
 -             case 1: {
 
 -                 int pid, priority, size;
 
 -                 char info[256];
 
 -                 printf("请输入进程pid:\n");
 
 -                 scanf("%d", &pid);
 
 -                 printf("请输入进程优先级:\n");
 
 -                 scanf("%d", &priority);
 
 -                 printf("请输入进程大小:\n");
 
 -                 scanf("%d", &size);
 
 -                 printf("请输入进程内容:\n");
 
 -                 scanf("%s", info);
 
 -                 createProcess(pid, priority, size, info);
 
 -                 break;
 
 -             }
 
 -             case 2:
 
 -                 displayRunningProcesses();
 
 -                 break;
 
 -             case 3:
 
 -                 blockProcess();
 
 -                 break;
 
 -             case 4:
 
 -                 killProcess();
 
 -                 break;
 
 -             case 5:
 
 -                 notifyProcess();
 
 -                 break;
 
 -             case 6:
 
 -                 running = 0;
 
 -                 break;
 
 -             default:
 
 -                 error();
 
 -         }
 
 -     }
 
  
-     return 0;
 
 - }
 
  复制代码 
 
**代码说明:** 
 
1. **数据结构**: 使用`struct Process`来表示进程,包含`pid`、`priority`、`size`、`status`和`info`等属性。`processTable`用于存储进程列表。 
 
2. **就绪队列**: 通过`readyQueue`数组来管理就绪状态的进程。 
 
3. **进程管理**: 
   - `createProcess`:用于创建进程,并将其添加到就绪队列。 
   - `addToReadyQueue`:将进程ID加入到就绪队列。 
   - `blockProcess`、`killProcess`、`notifyProcess`:用于阻塞、杀死和唤醒进程。 
 
4. **示例计算进程**: 在`main`函数中,创建两个进程用于特定计算任务,以示例(3+2)和(5+2)计算。 
 
确保在编译和运行时能正确输入数据类型及格式以避免错误。这是一个简单的多进程管理模拟示例,适合演示如何使用数据结构来管理进程和就绪队列。请根据具体需求进行更深入的修改和扩展。 
 
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |   
 
 
 
 |