interactive_list 接口
提供一个交互式进程标记接口给到核外进行特定化交互式进程设置, 方便内核进行针对交互式进程更精准的给与更高的权重从而提高用户操作的 交互式应用的响应速度,提升用户体验
其不针对给谁用,而只是通过提供方法给核外设置进程名和其权重值的 对应关系,进行记录和存储,内核中的其他模块通过 interactive_list 中提供的相应接口利用进程名对应的权重值的获取。主要表现为供核外增删改 查,供核内查询。
注意虽其存储可达32768个条目(限制在这个数目以内),但不要放太多名单放到里面, 这属于交互式进程的格外提升权重,尽量少放入,只设置个别一些需要放入提高权重 来改善其交互式响应速度的进程名单即可。
interactive_list 组成¶
整个由三个部分构成:其一为接受用户态程序进行设定和查询的方法,通过在 sys 下提供属性文件的方式。其二为核外设置的交互式进程数据的存储, 为了加快索引的速度采用哈希表方式进行存储管理。其三为内核其他模块 获取该设定值的方法统一采用 unsigned long get_interactive_weight(const char *comm) 进行获取。
存储数据大小¶
该数据为键值对的形式,对于进程名在内核内的管理为通过内核进程管理的 task_struct comm 成员进行存储,该值的查询可通过 ps -e 查询 其实际获取的来源为 /proc/pid/comm 下获取到,其大小为 16 bit, 这里需要区分下还有一个为可执行程序名 /proc/pid/cmdline 可获取 到其和启动时候的参数 ,也可通过 ps -ef 获取,其在进程启动的时候我 们的comm默认是从那个那个执行程序名中取出前16位作为的进程名,后面 进程可用通过系统调用修改该进程名,因此两者并不是一定一直有关系,这 里选择存储的为进程名。 对于权重值的大小采用的 unsigned long 型进行存储。
核内权重值获取¶
使用时包含头文件 #include <linux/interactive_mark.h>
在内核的其他模块使用函数 unsigned long get_interactive_weight(const char *comm) 进行权重值的获取,参数为需要查询权重的进程名其长度最长为16 bit(包含 0),返回值为对应权 重当返回0为未对该进程进行权重设置。
用户空间的 Sysfs 接口¶
位置: /sys/kernel/interactive_list
权重设置¶
可通过向直接 interactive_list 写入进程名加权重值的方式进行 设置 例如: echo task_comm weight > /sys/kernel/interactive_list task_comm 为进程名 长度最长设置 16 位(包含 0),可通过 ps -e 或 /proc/pid/comm 进行确定。 weight 为权重值。
查询¶
echo task_comm > /sys/kernel/interactive_list 设置要查询的条目 cat /sys/kernel/interactive_list 将获取到目前 interactive_list 里存储的总的条目,以及设置的要查询的条目的权重值。
删除¶
其方式类似与权重设置,将权重值设置为 0 及为删除该条目。 例如: echo task_comm 0 > /sys/kernel/interactive_list 如需要删除所有条目 echo clean all > /sys/kernel/interactive_list