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%。
