杭电操作系统实验:实现mysetnice系统调用

需积分: 31 33 下载量 176 浏览量 更新于2024-09-11 1 收藏 1KB TXT 举报
"杭电操作系统实验1提供了添加一个自定义系统调用mysetnice的代码,该调用允许用户修改或读取指定进程的nice值和优先级。实验代码包括了内核空间的系统调用处理函数以及用户态的调用示例。" 在操作系统中,nice值是一个用于表示进程执行优先级的参数。Nice值范围通常在-20(最高优先级)到19(最低优先级)之间,较高的nice值意味着较低的执行优先级。这个实验的目的是让学生理解和实践如何通过系统调用来调整进程的nice值,从而影响其在CPU调度中的位置。 实验代码中定义了一个名为`mysetnice`的系统调用,它接受5个参数:进程ID (pid)、标志(flag)、新的nice值(nicevalue)、以及两个用户空间的指针,用于传递旧的优先级(prio)和nice值(nice)。系统调用处理函数在内核空间实现,使用了`SYSCALL_DEFINE5`宏来定义。 在内核函数中,首先通过`for`循环遍历所有的进程,由`init_task`开始,通过`next_task`获取下一个进程,直到找到指定PID的进程或者遍历完整个进程链表。如果找到了目标进程,根据`flag`的值来决定是修改还是读取nice值: - 当`flag`等于1时,调用`set_user_nice`函数,传入新的nice值,更新进程的nice值,并打印出原nice值和新nice值,然后返回0表示成功。 - 当`flag`等于0时,利用`copy_to_user`函数将进程的当前nice值和优先级复制到用户空间的`nice`和`prio`指针所指向的位置,然后打印nice值和优先级,返回0表示成功。 - 如果`flag`既不是1也不是0,函数会打印错误信息并返回`EFAULT`错误码。 - 如果没有找到指定的进程,也会返回`EFAULT`错误码。 在用户态部分,实验提供了一个简单的C程序来演示如何调用`mysetnice`系统调用。它首先尝试读取指定进程(这里为3045)的当前nice值和优先级,然后设置一个新的nice值,最后再次读取以确认nice值是否已更改。 通过这个实验,学生可以学习到操作系统内核中如何处理系统调用,理解进程管理的基本概念,以及nice值和优先级如何影响进程调度。同时,还会接触到内核空间与用户空间之间的数据传输方法,如`copy_to_user`函数。