Linux源码阅读笔记10-进程NICE案例分析2

简介: Linux源码阅读笔记10-进程NICE案例分析2

set_user_nice

set_user_nice函数功能:设置某一进程的NICE值,其NICE值的计算是根据进程的静态优先级(task_struct->static_prio),直接通过set_user_nice函数更改进程的静态优先级。

内核源码

void set_user_nice(struct task_struct *p, long nice)
{
  bool queued, running;
  int old_prio;
  struct rq_flags rf;
  struct rq *rq;
  if (task_nice(p) == nice || nice < MIN_NICE || nice > MAX_NICE)
    return;
  /*
   * We have to be careful, if called from sys_setpriority(),
   * the task might be in the middle of scheduling on another CPU.
   */
  rq = task_rq_lock(p, &rf);
  update_rq_clock(rq);
  /*
   * The RT priorities are set via sched_setscheduler(), but we still
   * allow the 'normal' nice value to be set - but as expected
   * it wont have any effect on scheduling until the task is
   * SCHED_DEADLINE, SCHED_FIFO or SCHED_RR:
   */
  if (task_has_dl_policy(p) || task_has_rt_policy(p)) {
    p->static_prio = NICE_TO_PRIO(nice);
    goto out_unlock;
  }
  queued = task_on_rq_queued(p);
  running = task_current(rq, p);
  if (queued)
    dequeue_task(rq, p, DEQUEUE_SAVE | DEQUEUE_NOCLOCK);
  if (running)
    put_prev_task(rq, p);
  p->static_prio = NICE_TO_PRIO(nice);
  set_load_weight(p, true);
  old_prio = p->prio;
  p->prio = effective_prio(p);
  if (queued)
    enqueue_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK);
  if (running)
    set_next_task(rq, p);
  /*
   * If the task increased its priority or is running and
   * lowered its priority, then reschedule its CPU:
   */
  p->sched_class->prio_changed(rq, p, old_prio);
out_unlock:
  task_rq_unlock(rq, p, &rf);
}
EXPORT_SYMBOL(set_user_nice);

使用示例

#include <linux/module.h>
#include <linux/pid.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kthread.h>
static int MyThreadFunc(void* argc) {
  printk("Prompt:kernel thread PID : %d.\n", current->pid);
  printk("Prompt:kernel thread static_prio : %d.\n", current->static_prio);
  printk("Prompt:kernel thread nice : %d.\n", task_nice(current));
  return 0;
}
static int __init SetUserNiceInit(void) {
  struct task_struct* new_task = NULL;
  new_task = kthread_create_on_node(MyThreadFunc, NULL, -1, "setusernice.c");
  printk("Prompt:new thread nice : %d.\n", task_nice(new_task));
  printk("Prompt:new thread static_prio : %d.\n", new_task->static_prio);
  printk("Prompt:new thread prio : %d.\n", new_task->prio);
  set_user_nice(new_task, 16);
  printk("Prompt:new thread nice : %d.\n", task_nice(new_task));
  printk("Prompt:new thread static_prio : %d.\n", new_task->static_prio);
  printk("Prompt:new thread prio : %d.\n", new_task->prio);
  return 0;
}
static void __exit SetUserNiceExit(void) {
  printk("Prompt:exit kernel.\n");
}
module_init(SetUserNiceInit);
module_exit(SetUserNiceExit);

运行结果

相关文章
|
24天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
44 7
|
27天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
1月前
|
人工智能 安全 Linux
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
65 4
|
2月前
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
83 4
|
2月前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
90 4
|
2月前
|
缓存 算法 Linux
Linux内核中的调度策略优化分析####
本文深入探讨了Linux操作系统内核中调度策略的工作原理,分析了不同调度算法(如CFS、实时调度)在多核处理器环境下的性能表现,并提出了针对高并发场景下调度策略的优化建议。通过对比测试数据,展示了调度策略调整对于系统响应时间及吞吐量的影响,为系统管理员和开发者提供了性能调优的参考方向。 ####
|
4月前
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
193 1
|
3月前
|
NoSQL Linux 程序员
进程管理与运行分析
进程管理与运行分析
31 0
|
3月前
|
存储 Linux
服务器数据恢复—Linux操作系统网站服务器数据恢复案例
服务器数据恢复环境: 一台linux操作系统网站服务器,该服务器上部署了几十个网站,使用一块SATA硬盘。 服务器故障&原因: 服务器在工作过程中突然宕机。管理员尝试重新启动服务器失败,于是将服务器上的硬盘拆下检测,发现很多坏扇区。联系当地的一家数据恢复公司处理,但是没有成功。

热门文章

最新文章