Linux 中进程的 nice 值对程序的占用的影响测试

1. Linux 进程中的 nice 值

nice 值通过调整进程的优先级,间接控制 CPU 时间片的分配权重,从而实现对进程调度行为的精细控制。它是 Linux 系统中平衡实时任务与后台任务资源占用的核心工具之一。

优先级调整

核心机制:nice 值(范围 -20 到 19)直接控制进程的调度优先级。

低 nice 值(如 -20):表示高优先级,进程更容易被调度器选中,获得更多 CPU 时间片。

高 nice 值(如 19):表示低优先级,进程被调度的频率降低,CPU 时间片分配减少。

记忆:一个进程的 nice 值越高,说明对别的进程越 nice,别的进程运行得越好越快。

2. 代码

设计说明

  • 独立程序:高优先级和低优先级程序完全分离,便于独立运行和调试。
  • CPU 绑定:两个程序均绑定到 CPU 0,消除多核干扰。
  • 时间片观测:每秒打印计数器增量,反映时间片分配比例。

a. high_nice.cc

cpp 复制代码
#include <iostream>
#include <unistd.h>
#include <sys/resource.h>
#include <sched.h>
#include <atomic>
#include <thread>

// 绑定到指定 CPU 核
void bind_cpu(int cpu_id) {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(cpu_id, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
        perror("sched_setaffinity");
        exit(1);
    }
}

// 设置进程的 nice 值
void set_nice(int niceness) {
    if (setpriority(PRIO_PROCESS, 0, niceness) < 0) {
        perror("setpriority");
        exit(1);
    }
}

std::atomic<long> counter(0);  // 全局计数器

void worker() {
    while (true) {
        counter++;  // 高速递增计数器
    }
}

void reporter() {
    long last = 0;
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        long current = counter.load();
        std::cout << "[HIGH] Increment: " << current - last << std::endl;
        last = current;
    }
}

int main() {
    bind_cpu(0);         // 绑定到 CPU 0
    set_nice(-5);       // 设置最高优先级(需 root 权限)
    std::thread t1(worker);
    std::thread t2(reporter);
    t1.join();
    t2.join();
    return 0;
}

b. low_nice.cc

cpp 复制代码
#include <iostream>
#include <unistd.h>
#include <sys/resource.h>
#include <sched.h>
#include <atomic>
#include <thread>

// 绑定到指定 CPU 核
void bind_cpu(int cpu_id) {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(cpu_id, &mask);
    if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {
        perror("sched_setaffinity");
        exit(1);
    }
}

// 设置进程的 nice 值
void set_nice(int niceness) {
    if (setpriority(PRIO_PROCESS, 0, niceness) < 0) {
        perror("setpriority");
        exit(1);
    }
}

std::atomic<long> counter(0);  // 全局计数器

void worker() {
    while (true) {
        counter++;  // 高速递增计数器
    }
}

void reporter() {
    long last = 0;
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        long current = counter.load();
        std::cout << "[LOW]  Increment: " << current - last << std::endl;
        last = current;
    }
}

int main() {
    bind_cpu(0);         // 绑定到 CPU 0
    set_nice(10);        // 设置最低优先级
    std::thread t1(worker);
    std::thread t2(reporter);
    t1.join();
    t2.join();
    return 0;
}

c. Makefile

bash 复制代码
CPP = g++
CFLAGS = -std=c++11 -pthread -O2
TARGETS = high_nice low_nice

all: $(TARGETS)

high_nice: high_nice.cc
	$(CPP) $(CFLAGS) $< -o $@

low_nice: low_nice.cc
	$(CPP) $(CFLAGS) $< -o $@

clean:
	rm -f $(TARGETS)

运行:

bash 复制代码
make

# bash1
sudo ./high_nice

# bash2
sudo ./low_nice

3. 结果测试

nice 值为 -5 的占据 CPU 的 96%, nice 值为10 的占据 CPU 的3.7%。

相关推荐
2023自学中12 分钟前
Linux 图形系统
linux
kirs_ur1 小时前
ECC & LDPC — SSD 的数据卫士
服务器·数据库·性能优化
mounter6253 小时前
高性能网络技术演进与创新探索:RDMA、eBPF/XDP 深度解析及 LSF/MM/BPF 2023 专题演讲
linux·ebpf·linux kernel·kernel·rdma·xdp
动恰客流统计3 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
名字还没想好☜3 小时前
Python itertools 实战:用 groupby、chain、islice 优雅处理大数据流
linux·windows·python·迭代器·itertools
ziguo11226 小时前
深入浅出 C/C++ 数据类型:从入门到踩坑
linux·c语言·c++·windows·visual studio
无垠的广袤6 小时前
【工业树莓派 CM0 Dev Board】扩展板设计
linux·python·嵌入式硬件·pcb设计·模块化·传感器
会编程的土豆6 小时前
MySQL 入门:库、表、行、主键是什么
linux·数据库·网络协议·http
砍材农夫7 小时前
运维|devops|jenkins构建应用发布
运维·jenkins·devops
△曉風殘月〆7 小时前
如何在Linux中安装Qt开发环境
linux·运维·qt