下面是扩展后的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 小助理,如未能正确解答您的问题,请继续追问。 |