对当前进程记账

转载 2012年02月19日 14:44:44

http://book.51cto.com/art/200810/93784.htm

 Linux 2.6内核标准教程》第6章时间度量,这一章围绕墙上时间xtims和相对时间jiffies两个主体进行阐述,从硬件支持到软件架构;从时间度量模块的初始化到如何使用时间度量的工作机制;从软件定时器的使用到软件定时器的工作原理。本节讲述的是如何对当前被中断的进程(用户进程或内核线程)进行记帐,以及记帐时完成了那些工作。

AD:


6.4.3  对当前进程记账

下面分析时钟中断处理过程如何对当前被中断的进程(用户进程或内核线程)进行记帐,以及记帐时完成了那些工作。下面是对负责进程记帐的函数update_process_times()的分析。

代码清单6.15--函数update_process_times

功能简介:该函数负责对当前进程进行记账,减小进程剩余可用的时间片。然后激活其他内核模块的处理函数,如同步机制RCU的处理函数、内核定时器的处理函数。

文件:src/kernel/timer.c

784  void update_process_times(int user_tick)
785  {
786       struct task_struct *p = current;
787       int cpu = smp_processor_id();
788  
789       /* Note: this timer irq context must be accounted for as well. */
790       if (user_tick)
791            account_user_time(p, jiffies_to_cputime(1));
792       else
793            account_system_time(p, HARDIRQ_OFFSET, jiffies_to_cputime(1));
794       run_local_timers();
795       if (rcu_pending(cpu))
796            rcu_check_callbacks(cpu, user_tick);
797       scheduler_tick();
798       run_posix_cpu_timers(p);
799  } 
第784行,我们首先分析一下do_timer_interrupt_hook()调用该函数时传递进来的实际参数user_mode(regs),该参数使用函数user_mode()来判断被中断时系统处于用户态还是内核态。该函数根据被打断的上下文所使用的指令段选择子寄存器cs的CPL的字段是否为3,如果为3则返回1,表示是用户态;否则返回0,表示为内核态。该函数在文件src/include/asm- i386/ptrace.h中的第71行开始定义,代码如下:
static inline int user_mode(struct pt_regs *regs) 
{
return (regs->xcs & 3) != 0;
}

第786~787行代码通过宏定义current、smp_processor_id()获得当前进程描述符指针和当前处理器编号,并将其分别保存到指针变量p和整型cpu中。

第790~793行代码根据被中断进程运行于用户态还是系统态分别调用account_ user_time()、account_system_time()对被中断进程进行记账。它们分别将进程描述符中用户态时间字段utime、内核态时间字段stime的值加上jiffies_to_cputime(1),表示进程在用户态或者内核又运行了一个系统时钟滴答。然后更新处理器历史统计信息。其中jiffies_to_cputime()是一个宏定义,该宏定义用于将一个时钟中断转换为处理器时间。

第794行调用函数run_local_timers()设置时钟中断处理的下半部处理标记、激活时钟中断处理的下半部。该下半部负责维护、更新内核定时器链表,对于超时的内核定时器执行相应的超时处理函数,并将超时的定时器移出内核定时器链表。详情请参见6.5节。其中函数run_local_timers()在文件src/kernel/timer.c中的第867行定义如下。关于函数raise_softirq的功能请参见5.5.1小节。

void run_local_timers(void)
{
raise_softirq(TIMER_SOFTIRQ); 
}

第795~796行代码用于处理内核同步机制RCU所使用的数据,将老版本的数据删除。详情请参见8.4.2小节。

第797行调用函数scheduler_tick()判断被中断进程的时间片是否用完。如果用完设置该进程描述中的调度标记,在中断处理完毕、中断返回时系统会检查该标记;如果设置了该标记,系统会重新调度选择合适的进程运行。

第798行调用函数run_posix_cpu_timers()处理向用户进程提供的POSIX标准的时钟,这里不作更深入的介绍。

linux进程调度的实现——进程记账

linux进程调度的实现一共由四部分组成                  (1)、时间记账(就是记录进程已经运行了多长时间了,还要运行多长时间)                  (2)、进程选...
  • Og192
  • Og192
  • 2012年10月16日 14:23
  • 2333

Linux下进程终止过程

无论是在什么系统中,当进程终止之后,系统都需要释放进程占有的资源。否则,系统资源会被耗尽。下面将详细说明Linux系统中,进程终止的过程。 进程终止方式 linux的进程终止方式有8种,其中5种是...
  • tuzhutuzhu
  • tuzhutuzhu
  • 2014年06月11日 11:55
  • 1043

windows核心编程-获取进程当前目录

一:代码#include #include int _tmain() { TCHAR szPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szPath);...
  • qq_22423659
  • qq_22423659
  • 2016年11月25日 09:25
  • 373

支付系统-财务记账 复式记账

业务->会计分录(借和贷)->资产负债表(时间点) 和 利润表(时间段) 利润: 收入,成本(补贴),费用(人工成本) 毛利润: 收入-成本....
  • fei33423
  • fei33423
  • 2017年02月13日 14:51
  • 516

SAP给供应商付款记帐设置

给供应商付款记帐一.说明    本操作是FI模块应付总帐中的一个记帐操作,用银行存款(或现金)给供应商支付应付款项,并将相应的发票作清帐。    供应商的发票可以是FI模块用TCODE:FB60生成的...
  • heng0757
  • heng0757
  • 2011年07月16日 15:52
  • 3948

Linux如何查看当前进程的ID

2012-11-22 22:25 4943人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许不得转载。 Linux如何查看当前进程的ID ...
  • liangdsh
  • liangdsh
  • 2016年07月20日 17:21
  • 2203

android 获取当前运行进程的名称

获取当前运行进程的名称public static String getProcessName(Context cxt, int pid) { ActivityManager am = (A...
  • lmjssjj
  • lmjssjj
  • 2016年12月22日 21:32
  • 825

IOS 获取iOS设备当前运行的进程

转自:http://blog.sina.com.cn/s/blog_a843a8850101ehf1.html 目前这段代码能获取iOS设备上所有的进程名字,以及进程的ID, 能不能获...
  • Jason_chen13
  • Jason_chen13
  • 2016年11月15日 15:04
  • 1492

Android开发之获取当前进程的信息的集合

Android开发之获取当前进程的信息的集合Android开发对于大家来说越来越接近。我们不用只局限于使用别人开发的应用。在开发部分手机卫士等类型的app时,肯定要获取到当前所有运行的进程 。并且...
  • li521wang
  • li521wang
  • 2016年12月24日 14:54
  • 1020

个人记账软件(C++ & mysql)

一、功能 个人账单信息的增删查改 个人用户的注册和登录 管理员管理所有用户的账户信息 二、平台 Linux(CentOs 7) 三、功能展示 进入界面 注册用户 登录用户记账功能 查账功能 改账功能 ...
  • dw_deven
  • dw_deven
  • 2015年10月12日 15:35
  • 683
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对当前进程记账
举报原因:
原因补充:

(最多只允许输入30个字)