操作系统在切换进程的时候是否有提供hook机制?

我们在使用公共基础设施的时候,比如redis, 如果有一个人执行了大操作,会导致其他所有使用方都被hang住。

我开了一个脑洞,如果操作系统能在时间片切换处支持一些钩子,那么当进程换出、换入时,我就可以统计下当前命令执行了多久时间,如果超过了预先设定的阈值则包装一个异常返回值,然后将pc指针指向一个合适的位置,下次执行将异常返回跳过当前命令的后续逻辑.

感觉是可行的,但是肯定是有困难的地方。 不然redis肯定会支持的。

想问下大家,首先有没有这样的机制存在.

如果存在,redis是基于什么考虑没有添加如上的功能呢?

ps:

看到mysql可以通过配置max-execution-time来限制readonly select的执行时间。 不知道它是怎么实现的? 有了解的同学可以说说嘛...

阅读 1.6k
1 个回答

Linux可以用kprobe跟踪进程切换,例如像下面这样记录全部PID的执行时间

#!/usr/bin/bpftrace

#include <linux/sched.h>

kprobe:finish_task_switch
{
  $prev = (struct task_struct*)(arg1); // 上一个任务
  $prev_pid = $prev->pid;

  $now = nsecs;

  if ($prev->state == TASK_RUNNING) {
    if (@start[$prev_pid] > 0) {
      @time[$prev_pid] = @time[$prev_pid] + $now - @start[$prev_pid]; // 记录上一个任务执行时间
    }
  } else {
    delete(@start[$prev_pid]);
  }
  // 记录当前任务开始执行时间
  @start[pid] = $now;
}

interval:s:5
{
  clear(@start);
  exit();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题