likes
comments
collection
share

【悄咪咪学Node.js】7.6 os.getPriority() 和 os.setPriority() 优先级

作者站长头像
站长
· 阅读数 9

os.getPriority() 和 os.setPriority() 优先级

1. 前言

本系列课程对非功能性函数内容安排中,将插入一些在生产过程中可能会用到对应函数的例子。

本节课将会引导大家学习了解:

  • os.getPriority()os.setPriority() 的使用方法
  • os.setPriority() 在 windows 上的平台差异

学习完本节课程后,应该具有:

  • 使用 os 模块获取和修改进程优先级的能力

2. 进程优先级

每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间。

优先级越高,其值越低,值有效区间为 [-20, 19]。

优先级的高低影响的是占用 CPU 的时间长短。优先级越高,在一个周期中占用 CPU 的时间越长,在系统资源吃紧的时候,也会优先分配给优先级高的进程。

3. os.getPriority()

os.getPriority() 可以获取某进程的优先级,接收参数为 pid

3.1 代码例子

我们先来生成一个存在时间长的进程:

// 打印进程 pid
console.log(process.pid);

setTimeout(function() {
    console.log("end");
}, 10 * 60 * 1000);

这段代码运行后,会产生一个存活 10 分钟的进程,并在运行之初打印出该进程的 pid

结果:

90758

我们再来执行下面这段代码,来打印刚刚生成的进程的优先级:

// 引入 os 模块
const os = require('os');

// 打印结果
console.log(os.getPriority(90758));

结果:

0

Tips:默认情况下,进程的优先级是标准,值为 0

4. os.setPriority()

os.setPriority() 可以对某进程设置优先级,如果传入 1 个参数,则对本进程设置优先级。如果传入 2 个参数,如 os.setPriority(pid, priority) 则对第一个参数 pid 的进程,设置优先级 priority

4.1 代码例子

4.1.1 降低优先级

我们先执行以下语句:

const os = require('os');

// 对本进程调整优先级到 19 (降低优先级到最低)
os.setPriority(19);

// 打印本进程优先级
console.log(os.getPriority(process.pid));

结果:

19

4.1.2 提高优先级

我们先执行以下语句:

const os = require('os');

// 对本进程调整优先级到 -20 (提高优先级到高)
os.setPriority(-20);

// 打印本进程优先级
console.log(os.getPriority(process.pid));

windows 结果:

-20

macos 结果:

os.js:223
    throw new ERR_SYSTEM_ERROR(ctx);
    ^

SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_os_setpriority returned EACCES (permission denied)
    at Object.setPriority (os.js:223:11)
    at Object.<anonymous> (/Users/lihaolin/programing/spider/spider-man-server/test/priority.js:13:4)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

在 macos 系统中(大部分 linux 也是),使用普通用户权限来执行 Node.js 脚本,来提高优先度到值小于 0 时,会报 没有权限( permission denied ) 的错误。

在遇到这种情况时,需要使用 sudo 来启动 Node.js,如 sudo node setPriority.js

macos 使用 sudo 执行结果:

-20

4.2 平台差异

在 windows 平台上,使用 os.setPriority() 设置进程优先级时,不一定会设置成对应数值

windows 下执行以下语句:

const os = require('os');

os.setPriority(-2);

console.log(os.getPriority(process.pid));

结果:

-7

这是因为在 windows 上,优先级对应 6 种不同的等级: 【悄咪咪学Node.js】7.6 os.getPriority() 和 os.setPriority() 优先级

由于 -2 小于 0,判断为高于正常,而高于正常实际对应的值为 -7,所以代码最终打印值为 -7。

我们也可以使用 windows 平台的优先级别名来定义:

const os = require('os');

os.setPriority(os.constants.priority.PRIORITY_ABOVE_NORMAL);

console.log(os.getPriority(process.pid));

结果:

-7

我们打印下 os.constants.priority 看看:

const os = require("os");

console.log(os.constants.priority);

结果:

[Object: null prototype] {
  PRIORITY_LOW: 19,
  PRIORITY_BELOW_NORMAL: 10,
  PRIORITY_NORMAL: 0,
  PRIORITY_ABOVE_NORMAL: -7,
  PRIORITY_HIGH: -14,
  PRIORITY_HIGHEST: -20 }

这里提供一份官方对应表以供参考:

常量描述
PRIORITY_LOW最低进程调度优先级。这与 Windows 上的 IDLE_PRIORITY_CLASS 相对应,在所有其他平台上的值为 19。
PRIORITY_BELOW_NORMAL进程调度优先级高于 PRIORITY_LOW 且低于 PRIORITY_NORMAL。这对应于 Windows 上的 PRIORITY_NORMAL,并且在所有其他平台上的值为 10。
PRIORITY_NORMAL默认的进程调度优先级。这对应于 Windows 上的 NORMAL_PRIORITY_CLASS,并且在所有其他平台上的值为 0。
PRIORITY_ABOVE_NORMAL进程调度优先级高于 PRIORITY_NORMAL 且低于 PRIORITY_HIGH。这对应于 Windows 上的 ABOVE_NORMAL_PRIORITY_CLASS,并且在所有其他平台上的值为 -7。
PRIORITY_HIGH进程调度优先级高于 PRIORITY_ABOVE_NORMAL 且低于 PRIORITY_ABOVE_NORMAL。这对应于 Windows 上的 HIGH_PRIORITY_CLASS,并且在所有其他平台上的值为 -14。
PRIORITY_HIGHEST最高进程调度优先级。 这对应于 Windows 上的 REALTIME_PRIORITY_CLASS,在所有其他平台上的值为 -20。

5. 生产中的作用

  1. 用法一

    对本系统进程优先级作修改,以在系统资源分配上获取优势

    const os = require('os');
    
    os.setPriority(os.constants.priority.PRIORITY_HIGH);
    
  2. 用法二

    对本系统生成的子进程作优先级调节

    const os = require('os');
    
    // 假设本方法能生成子进程并将子进程 pid 返回
    const generateChildProcess = function() {
        // todo...
        // 子进程相关实现方法,请跳转 child_process 章节
        
        return child.pid;
    }
    
    os.setPriority(generateChildProcess(), os.constants.priority.PRIORITY_ABOVE_NORMAL);
    

6. 小结

本节课程我们主要学习了 os.getPriority()、os.setPriority() 及其在生产上的用法

重点如下:

  1. 重点1

    优先级越高,其对应的值越小,值的范围是 [-20, 19]

  2. 重点2

    windows 平台上,优先级分 6 个档次

转载自:https://juejin.cn/post/7351326289763729446
评论
请登录