Linux 命令行的强大之处在于甚至可以使用命令行工具轻松调整进程的调度优先级。而nice 命令运行具有修改的调度优先级的命令。
显示 Linux 进程
top 是一个简单的命令,它提供有关每个进程使用系统资源的信息。 这包括与 CPU 调度相关的知识。 通过在终端中输入 top 我们得到:
相邻的两列表示每个进程的优先级相关值。 PR 列表示进程的实际内核给定优先级,而 NI 列提供每个进程的 Nice Value。
Niceness 值的范围从 -20(对过程最有利)到 19(对过程最不利)。
如果用户想进一步了解它,可以查看man top。
可以使用带有 -l 选项的 ps 命令
niceness 值由 NI 列标题表示。 PRI 列标题表示进程的实际优先级。
Linux nice 命令
在任何给定的时间点,一个系统中运行着数百个进程,其中大部分是由 Linux 操作系统创建的,还有一些是由用户创建的。 每个正在运行的进程都有一个分配给它的优先级,该优先级决定了系统执行它的速度。 较高优先级的进程通常比低优先级的进程更早执行。
nice 命令在 Linux 进程启动之前配置它的优先级。 一旦启动,您将无法使用 nice 命令更改优先级。
在 Linux 系统中,共有 140 个优先级,其范围从 -20 到 +19,其中 +19 表示最低优先级,-20 表示最高优先级。 正如您所注意到的,这是nice 值和priority 值之间的反比例关系。
例子:
不带任何参数的 nice 命令,显示新进程的默认友好度,这通常为零。
nice命令设置进程的优先级
nice 命令可用于以用户指定的 nice 值启动进程。 这基本上改变了内核分配的实际优先级。
nice -n < VALUE > < COMMAND >
nice命令C/C++代码实现
int main(int argc, char **argv)
{
long niceness = DEFNICE;
int ch;
char *ep;
if (argc >= 2 && argv[1][0] == '-' && (argv[1][1] == '-' ||
isdigit(argv[1][1])) && strcmp(argv[1], "--") != 0)
if (asprintf(&argv[1], "-n%s", argv[1] + 1) < 0)
printf("asprintf\n");
while ((ch = getopt(argc, argv, "n:")) != -1)
{
switch (ch)
{
case 'n':
errno = 0;
niceness = strtol(optarg, &ep, 10);
if (ep == optarg || *ep != '\0' || errno ||
niceness < INT_MIN || niceness > INT_MAX)
printf("%s: invalid nice value\n", optarg);
break;
default:
usage();
}
}
argc -= optind;
argv += optind;
if (argc == 0)
usage();
errno = 0;
niceness += getpriority(PRIO_PROCESS, 0);
if (errno)
printf("getpriority\n");
else if (setpriority(PRIO_PROCESS, 0, (int)niceness))
printf("setpriority\n");
execvp(*argv, argv);
...
}
编译运行:
总结
在 Linux 中,nice 命令有助于运行修改了调度优先级的程序。 可以使用 nice 命令在启动之前设置进程的优先级。 但是你不能用 nice 命令改变正在运行的进程的优先级。可以使用 renice 命令来修改正在运行的进程的优先级。
欢迎关注微信公众号【程序猿编码】,需要nice 命令完整源码的添加本人微信号(c17865354792)