当前位置: 首页 > news >正文

卫生监督 网站建设方案浙江搜索引擎优化

卫生监督 网站建设方案,浙江搜索引擎优化,常熟做网站公司,全国工商网站查询企业信息cookie的原理借助于unsigned long型,和refcount_t引用计数器。 32位64位char *4字节8字节unsigned long4字节8字节 数据结构修改 首先看看实现core scheduling功能对数据结构有哪些修改 task_struct struct task_struct{struct rb_node core_node;unsigned long…

cookie的原理借助于unsigned long型,和refcount_t引用计数器。

32位64位
char *4字节8字节
unsigned long4字节8字节

数据结构修改

首先看看实现core scheduling功能对数据结构有哪些修改

task_struct

struct task_struct{struct rb_node core_node;unsigned long core_cookie;unsigned int core_occupation;
}

sched_statistics

struct sched_statistics{u64 core_forceidle_sum;
}

sched_core_cookie

cookie本质就是一个内核引用计数器refcount_t成员构成的struct结构体。然后task_struct中保存的core_cookie是unsigned long型数据,刚好能存放指针变量值,就是存放的该结构体的内存地址。

使用alloc分配出来的sched_core_cookie结构体的address内存地址作为一个task的cookie值,cookie 类型是unsigned long的指针。

/*新增*/
struct sched_core_cookie{refcount_t refcnt;
}

rq

rq中增加了有关core sched的开关等信息。

struct rq {//...省略
#ifdef CONFIG_SCHED_CORE/* per rq */struct rq       *core;struct task_struct  *core_pick;unsigned int        core_enabled;unsigned int        core_sched_seq;struct rb_root      core_tree;        /*可以使用同一个core的都要加入红黑树*//* shared state -- careful with sched_core_cpu_deactivate() */unsigned int        core_task_seq;unsigned int        core_pick_seq;unsigned long       core_cookie;unsigned int        core_forceidle_count;unsigned int        core_forceidle_seq;unsigned int        core_forceidle_occupation;u64         core_forceidle_start;
#endif
}

这部分初始化

#ifdef CONFIG_SCHED_CORErq->core = rq;rq->core_pick = NULL;rq->core_enabled = 0;rq->core_tree = RB_ROOT;rq->core_forceidle_count = 0;rq->core_forceidle_occupation = 0;rq->core_forceidle_start = 0;rq->core_cookie = 0UL;
#endif

cfs_rq

struct cfs_rq{//...省略代码#ifdef CONFIG_SCHED_COREunsigned int        forceidle_seq;u64         min_vruntime_fi;
#endif
}

cookie

用户态程序通过prctl系统调用来操作相关进程的cookie动作。

prctl接口

prctl系统调用接口中新增有关PR_SCHED_CORE的操作处理函数。

SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,unsigned long, arg4, unsigned long, arg5)
{...
#ifdef CONFIG_SCHED_COREcase PR_SCHED_CORE:error = sched_core_share_pid(arg2, arg3, arg4, arg5);break;
#endif
}
int sched_core_share_pid(unsigned int cmd, pid_t pid, enum pid_type type,unsigned long uaddr)
{unsigned long cookie = 0, id = 0;struct task_struct *task, *p;struct pid *grp;int err = 0;//...省略rcu_read_lock();if (pid == 0) {task = current;        /*pid为0,则是设置进程本身*/} else {task = find_task_by_vpid(pid);    /*根据pid查找进程PCB*/if (!task) {rcu_read_unlock();return -ESRCH;}}get_task_struct(task);    /*该函数就是为了给task_struct引用符计数+1,防止中断处理中程序被kill掉访问非法PCB指针*/rcu_read_unlock();/* 检查进程是否有权限修改指定的进程* Check if this process has the right to modify the specified* process. Use the regular "ptrace_may_access()" checks.*/if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) {err = -EPERM;goto out;}switch (cmd) {case PR_SCHED_CORE_GET:        if (type != PIDTYPE_PID || uaddr & 7) {err = -EINVAL;goto out;}cookie = sched_core_clone_cookie(task);        /*获取task任务的cookie值*/if (cookie) {/* XXX improve ? */ptr_to_hashval((void *)cookie, &id);}err = put_user(id, (u64 __user *)uaddr);goto out;case PR_SCHED_CORE_CREATE:cookie = sched_core_alloc_cookie();        /*创建task任务的cookie值*/if (!cookie) {err = -ENOMEM;goto out;}break;case PR_SCHED_CORE_SHARE_TO:cookie = sched_core_clone_cookie(current);        /*共享继承指定task任务的cookie值*/break;case PR_SCHED_CORE_SHARE_FROM:if (type != PIDTYPE_PID) {err = -EINVAL;goto out;}cookie = sched_core_clone_cookie(task);__sched_core_set(current, cookie);            /*将自身cookie共享给指定的task任务*/goto out;default:err = -EINVAL;goto out;};if (type == PIDTYPE_PID) {__sched_core_set(task, cookie);        /*设置任务task的cookie值*/goto out;}read_lock(&tasklist_lock);                /*这里是对任务组进行设置,对任务组中每个任务都设置cookie*/grp = task_pid_type(task, type);do_each_pid_thread(grp, type, p) {if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS)) {err = -EPERM;goto out_tasklist;goto out_tasklist;}} while_each_pid_thread(grp, type, p);do_each_pid_thread(grp, type, p) {__sched_core_set(p, cookie);} while_each_pid_thread(grp, type, p);
out_tasklist:read_unlock(&tasklist_lock);out:sched_core_put_cookie(cookie);        /*cookie指针计数器减1,并检查是否为0,没有人用则需要释放*/put_task_struct(task);                /*检查task指针技术减1*/return err;
}

该函数中,out出口时为何需要对cookie进行put,对task进行put?

  • 对task进行put是因为调用了get_task_struct(task)函数,该函数中会对task引用计数加1,所以在sched_core_share_pid()函数末尾需要对task指针引用计数减1
  • 对cookie计数减1,是因为在get_cookie,clone_cookie,allock_cookie等函数中对cookie的引用计数加了1,然后再**__sched_core_set函数中又调用get_cookie,又再次对cookie的计数加了1,一共加了两次,所以函数末尾需要相应的对cookie计数减1并检查是否为0(__sched_core_set**函数中也有一次减1操作,不过是对old_cookie的操作)。所以最终cookie的引用次数整体还是加了1的
    在这里插入图片描述

创建cookie

何时需要创建cookie?是每个进程都有一个cookie么?cookie值保存在哪里?

static unsigned long sched_core_alloc_cookie(void)
{struct sched_core_cookie *ck = kmalloc(sizeof(*ck), GFP_KERNEL);if (!ck)return 0;refcount_set(&ck->refcnt, 1);    /*cookie的计数器加1*/sched_core_get();                /*enable core sched功能,就是打开开关标志*/return (unsigned long)ck;
}

在这里插入图片描述

获取cookie

static unsigned long sched_core_get_cookie(unsigned long cookie)
{struct sched_core_cookie *ptr = (void *)cookie;if (ptr)refcount_inc(&ptr->refcnt);return cookie;
}

入参:某个task_struct的cookie值,p->core_cookie; 类型unsigned long存放的其实是指针,该指针指向结构体sched_core_cookie计数器。

get_cookie的操作主要就是对cookie中的refcnt计数器加1。

共享cookie

task任务共享当前current任务的cookie

cookie = sched_core_clone_cookie(current);
__sched_set_core(task, cookie);
static unsigned long sched_core_clone_cookie(struct task_struct *p)
{unsigned long cookie, flags;raw_spin_lock_irqsave(&p->pi_lock, flags);cookie = sched_core_get_cookie(p->core_cookie);    //获取指定进程的core_cookie值raw_spin_unlock_irqrestore(&p->pi_lock, flags);return cookie;
}

分享cookie

分享当前current任务的cookie给指定任务task。

cookie = sched_core_clone_cookie(task);
__sched_core_set(current, cookie);

清除cookie

static void sched_core_put_cookie(unsigned long cookie)
{struct sched_core_cookie *ptr = (void *)cookie;if (ptr && refcount_dec_and_test(&ptr->refcnt)) {kfree(ptr);sched_core_put();}
}

当清除task_struct时,也要记得清除其中的cookie

put_task_struct
__put_task_struct
sched_core_free
sched_core_put_cookie
void sched_core_free(struct task_struct *p)
{sched_core_put_cookie(p->core_cookie);
}

父子进程cookie关系

在fork系统调用中,copy_process创建新进程的时候,子进程的cookie值继承父进程的cookie值。

copy_process
sched_core_fork
void sched_core_fork(struct task_struct *p)
{RB_CLEAR_NODE(&p->core_node);        /*core_node红黑树节点清空*/p->core_cookie = sched_core_clone_cookie(current);    /*子进程cookie = 父进程cookie*/
}

周期性调度器

scheduler_tick()周期性调度器中也会涉及到core sched的操作。

scheduler_tick
sched_core_tick
__sched_core_tick
__sched_core_account_forceidle
http://www.shuangfujiaoyu.com/news/35132.html

相关文章:

  • 公司经营范围网站开发及运营市场营销八大营销模式
  • 成都网站seo设计seo点击
  • 如何做php网站建设广告网址
  • 嘉兴专业定制网站制作企业网站优化推广方法
  • 怎样投网站广告网站模板之家官网
  • 网站建设 解决方案关键词挖掘
  • 中山做网站专业的公司百度推广的定义
  • 做网站有几个软件百度公司官网招聘
  • 做镜像网站违法网站推广服务报价表
  • 别人做的网站不能用google 官网入口
  • 河北建设厅录入业绩的网站seo外包公司多少钱
  • 网站推送怎么做谷歌搜图
  • 兼职刷客在哪个网站做内容营销平台有哪些
  • wordpress 4.6.4seo推广薪资
  • wordpress做网站手机百度统计怎么用
  • 长沙做网站建设的什么是网站外链
  • 小城镇建设网站答案全国人大常委会委员长
  • 上海网站建设的网站水平优化
  • wordpress 不显示媒体网站seo排名免费咨询
  • php 读取网站文件推广普通话奋进新征程演讲稿
  • wordpress 做网课网站外贸海外推广
  • 南昌网站建设kaiu百度游戏app下载
  • 网站估价google seo 优化教程
  • 做网站jsp和php最新seo网站优化教程
  • 服务器备案期间网站在线分析网站
  • 网站建设报价清单广州关键词搜索排名
  • 成都网站建制作如何推广自己的微信公众号
  • 进入淘宝官网首页百度seo怎么提高排名
  • 在美国克罗格做网站怎样装修公司网络推广方案
  • 网页制作教程免费下载郑州seo外包顾问热狗