本项目实现了一个支持多种调度算法的进程调度器,可以管理和调度多个作业的执行。调度器支持作业的创建、终止、状态查询等功能,并实现了三种不同的调度算法。
-
高优先级优先(HPF)
- 选择当前优先级最高的作业
- 优先级相同时选择等待时间最长的作业
- 适合对任务优先级有明确要求的系统
-
先来先服务(FCFS)
- 选择等待时间最长的作业
- 完全基于等待时间进行选择
- 适合任务长度相近的系统
-
短作业优先(SJF)
- 选择预计运行时间最短的作业
- 运行时间相同时选择等待时间最长的作业
- 适合任务长度差异较大的系统
-
作业管理
- 作业创建和入队
- 作业终止和出队
- 作业状态查询
- 作业优先级管理
-
进程控制
- 进程创建和终止
- 进程状态切换
- 信号处理
-
调度控制
- 定时调度
- 作业切换
- 资源管理
// 作业信息结构体
struct jobinfo {
int jid; // 作业ID
int pid; // 进程ID
char** cmdarg; // 执行命令及参数
int defpri; // 默认优先级
int curpri; // 当前优先级
int ownerid; // 作业所有者ID
int wait_time; // 等待时间
time_t create_time; // 创建时间
int run_time; // 已运行时间
int duration; // 预计总运行时间
enum jobstate state; // 作业状态
};
// 等待队列节点
struct waitqueue {
struct waitqueue *next; // 下一个等待作业
struct jobinfo *job; // 当前作业信息
};- 调度算法实现
// HPF算法
struct waitqueue* jobselect_HPF() {
// 选择优先级最高的作业
}
// FCFS算法
struct waitqueue* jobselect_FCFS() {
// 选择等待时间最长的作业
}
// SJF算法
struct waitqueue* jobselect_SJF() {
// 选择运行时间最短的作业
}- 作业切换实现
void jobswitch() {
// 暂停当前作业
kill(current->job->pid, SIGSTOP);
current->job->state = READY;
// 启动新作业
current = next;
next = NULL;
current->job->state = RUNNING;
kill(current->job->pid, SIGCONT);
}- 作业出队实现
void do_deq(struct jobcmd deqcmd) {
// 查找并终止指定作业
// 从队列中移除
// 释放资源
}- 编译调度器:
gcc -o scheduler scheduler.c- 运行调度器:
./scheduler- 提交作业
enq [-p priority] [-d duration] executable args- 终止作业
deq job_id- 查询状态
stat- 需要正确的系统头文件路径配置
- 需要适当的系统权限
- 需要支持信号处理机制
- 作业优先级范围:0-3
- 作业持续时间范围:0-65535
- 需要提供可执行文件的绝对路径
- 可能存在资源泄漏风险
- 需要处理信号竞争条件
- 可能需要考虑并发访问问题
- 添加更多调度算法
- 实现抢占式调度
- 添加作业优先级动态调整
- 优化队列操作
- 改进进程切换机制
- 减少系统调用开销
- 添加日志记录
- 完善错误恢复机制
- 增加系统状态监控
欢迎提交问题和改进建议。在提交代码时,请确保:
- 代码符合项目的编码规范
- 添加适当的注释和文档
- 通过基本的测试
本项目采用 MIT 许可证。详见 LICENSE 文件。