当前位置:  技术问答>linux和unix

求助:分析linux的一段代码-课程设计及用

    来源: 互联网  发布时间:2015-03-21

    本文导语:  进程调度: asmlinkage void schedule(void) {  struct task_struct prev,next,*p;  /*prev表示调度之前的进程,next表示调度之后的进程*/  struct list_head *tmp;  int this_cpu,c;  if (!current->active_mm) BUG(); /*如果当前进程的active_mm为空,...

进程调度:
asmlinkage void schedule(void)
{
 struct task_struct prev,next,*p;  /*prev表示调度之前的进程,next表示调度之后的进程*/
 struct list_head *tmp;
 int this_cpu,c;
 if (!current->active_mm) BUG(); /*如果当前进程的active_mm为空,出错*/
 need_resched_back;
prev=current;      /*让prev成为当前进程*/
 this_cpu=prev->processor;
 if (in_interrupt())    {
  /*如果schedule是在中断服务程序内部执行,就说明发生了错误*/
      printk(“Scheduling in interruptn”);
      BUG();
   }
  release_kernel_lock(prev,this_cpu);    /*释放全局内核锁,并开this_cpu的中断*/
  spin_lock_irq(&runqueue_lock);   /*锁住运行队列,并且同时关中断*/
  if (prev_>policy = = SCHED_RR)  /*将一个时间片用完的SCHED_RR实时进程放到队列的末尾*/
goto move_rr_last;
move_rr_back:
switch(prev->state)  {
 /*根据prev的状态做相应的处理*/
      case TASK_INTERRUPTIBLE:   /*此状态表明该进程可以被信号中断*/
          if (signal+pending(prev))   {
            /*如果该进程有未处理的信号,则让其变为可运行状态*/
              prev->state=TASK_RUNNING;
              break;
            }
       default;        /*如果为可中断的等待状态或僵死状态*/
           del_from_runqueue(prev);        /*从运行队列中删除*/
       case TASK_RUNNING:;     /*如果为可运行状态,继续处理*/
    }
prev->need_resched=0;
 /*先面是调度程序的正文*/
repeat_schedule:   /*真正开始选择值得运行的进程*/
next=idle_task(this_cpu);    /*缺省选择空闲进程*/
 c=-1000;
if (prev->state= =TASK_RUNNING)
 still_running_back:
list_for_each(tmp,&runqueue_head)   {
   /*遍历运行队列*/
  p=list_entry(tmp,struct tadk_struct,run_list);
 if (can_schedule(p,this_cpu))   {
   /*单cpu中,该函数总返回1*/
  int weight=goodness(p,this_cpu,prev->active_mm);
        if (weight,next=p;
          )
     }
/*如果c为0,说明运行队列中所有进程的权值都为0,也就是分配给各个进程的时间片都已用完,需重新计算各个进程的时间片*/
 if (!c)  {
      struct tadk_struct  *p;
      spin_unlock_irq(&runqueue_lock);    /*锁住运行队列*/
      read_lock(&tasklist_lock);          /*锁住进程的双向链表*/
      for_each_task(p)                 /*对系统中的每个进程*/
      p->counter=(p->counter>>1)+NICE_TO_TICKS(p->nice);
      read_unlock(&tasklist_lock);
         spin_lock_irq(&runqueue_lock);
       goto repeat_schedule;
   }
apin_unlock_irq(&runqueue_lock);    /*对运行队列解锁,并开中断*/
  if (prev= =next)  {
                     /*如果选中的进程就是原来的进程*/
        prev-?policy &= ~SCHED_YIELD;
           goto same_process;
      }
/*下面开始进行进程切换*/
kstat.context_swtch++;    /*统计上下问切换的次数*/
{
        struct mm_struct *mm=next->mm;
        struct mm_struct *oldmm=prev->active_mm;
       if (!mm) {
                   /*如果是内核线程,则借用prev的地址空间*/
                   if (next->active_mm)  BUG();
                   next->active_mm=oldmm;
                  }
       else  {
                 /*如果是一般进程,则切换到next的用户空间*/
               if (next->active_mm!=MM)  BUG();
               switch_mm(oldmm,mm,next,this_cpu);
              }
       if (!prev->mm) {
                  /*如果切换出去的是内核线程*/
                 prev->active_mm=NULL;/*归还它所借用的地址空间*/
                 mmdrop(oldmm);    /*mm_struct中的共享计数减1*/
              }
    }
 switch_to (prev,next,prevc);  /*进程的真正切换,即堆栈的切换*/
_schedule_tail(prev);      /*置prev->policy的SCHED——YIELD为0*/
 same_process:
     reacquire_kernel_lock(current);   /*针对SMP*/
     if (current->need_resched)      /*如果调度标志被置位*/
               goto need_resched_back;    /*重新开始调度*/
     return;
}



|
为甚么不到Linux/Unix开发版里去发贴呢???

|
www.linuxaid.com.cn
www.linuxforum.net

|
建议你去看机械工业出版社的《Linux 2.4源代码分析大全》,此外还有人民邮电出版社的《深入分析Linux源代码》等等。

    
 
 

您可能感兴趣的文章:

  • 向在校大学生求助!(《操作系统》的课程设计)(给高分!)
  • 求助 ==> 代码移殖:从Linux到的Windows,请高手指点一二,谢谢啦
  • 求助:linux的源代码怎么才可以看见?
  • 求助:如何调出linux下kppp源代码?
  • 求助 程序中添加互斥锁代码后编译怎么通不过 ?
  • 100分求助 能不能提供一些有关图像分割的算法和实现代码!谢谢
  • 求助:snort源代码
  • 各位师哥师姐,我急切求助,关于文件的上传下载程序代码
  • 求助:Linux下ftp客户端代码编写
  • 求助如何顺利的阅读linux内核源代码
  • 求助:能给出一个在jsp里调用ActiveX控件的代码吗?
  • 求助java聊天室、公告栏、记数器、email的源代码
  • 【求助】一小段perl代码~谢谢
  • 求助!!关于两行代码的理解问题!请大虾近来看看!!(在线等待)
  • 求助:信号 --13 进程中断 iis7站长之家
  • 来者有分,在线等待!100分求助:我在用JBuild运行JAVA代码时,出现下面的Message,为什么?
  • 求助:LINUX内核代码中# 与define之间有空格是怎么回事?
  • 【求助】快来人呐~!大家帮我看看我写的破代码哈!
  • 求助: 一段非常奇怪的代码( 关于fcntl文件锁 )
  • 求助: 用shell 给某个目录下所有.c文件的第一个#include<**>前面加几行代码
  • 急求助:linux下ftp客户端代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求助: 进程调度内核分析
  • 新手求助,有没有什么好的流量分析软件介绍一下
  • 日志分析求助
  • 求助:BOSS让我在短期之内分析一个开源软件 杂办?
  • [求助]分析这种特效菜单实现时遇到的问题!请帮助!---在线恭候!!!
  • 求助:分析嵌入实时操作系统uc/os-22内核(第一个字母是“谬”,我这边连office都慢得要死,还请大家多包涵)
  • 高级脚本分析-求助
  • [求助]Shell编写apache日志分析脚本
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题
  • 求助:信号 --13 进程中断
  • 求助,安装了红帽子后进不了
  • 新装linux求助
  • linux的 iptables问题求助
  • (高分求助)请问,那里有软件开发的<设计文档>
  • 一个简单的问题,高分求助!!!
  • 紧急求助:Unix下给文件夹重命名用什么命令?谢谢!!!!
  • VJ的一个问题,高分求助,熟悉VJ得请进!
  • 高分求助


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3