转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
Linux 2.4进程调度分析 3         ★★★★

Linux 2.4进程调度分析 3

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1752 更新时间:2009/4/22 20:45:51
nbsp;                :"m" (next->thread.esp),  \%3

                       "m" (next->thread.eip),     \%4

                            "a" (prev), "d" (next),                    \eax,edx

                            "b" (prev));                               \ebx

} while (0)

 

 

 

进程切换过程可以分成两个阶段,上面这段汇编代码可以看作第一阶段,它保存一些关键的寄存器,并在栈上设置好跳转到新进程的地址。第二阶段在switch_to()中启动,实现在__switch_to()函数中,主要用于保存和更新不是非常关键的一些寄存器(以及IO操作许可权映射表ioperm)的值:

  • unlazy_fpu(),如果老进程在task_struct的flags中设置了PF_USEDFPU位,表明它使用了FPU,unlazy_fpu()就会将FPU内容保存在task_struct::thread中;
  • 用新进程的esp0(task_struct::thread中)更新init_tss中相应位置的esp0;
  • 在老进程的task_struct::thread中保存当前的fs和gs寄存器,然后从新进程的task_struct::thread中恢复fs和gs寄存器;
  • 从新进程的task_struct::thread中恢复六个调试寄存器的值;
  • 用next中的ioperm更新init_tss中的相应内容

switch_to()函数正常返回,栈上的返回地址是新进程的task_struct::thread::eip,即新进程上一次被挂起时设置的继续运行的位置(上一次执行switch_to()时的标号"1:"位置)。至此转入新进程的上下文中运行。

在以前的Linux内核中,进程的切换使用的是far jmp指令,2.4采用如上所示的手控跳转,所做的动作以及所用的时间均与far jmp差不多,但更利于优化和控制。

 

五. 调度器:具体实现时函数的调用关系,并对各函数的基本功能进行说明

Linux的调度器主要实现在schedule()函数中。

1.调度器工作流程

schedule()函数的基本流程可以概括为四步:

1). 清理当前运行中的进程

2). 选择下一个投入运行的进程

3). 设置新进程的运行环境

4). 执行进程上下文切换

5). 后期整理

其中包含了一些锁操作:就绪队列锁runquque_lock,全局核心锁kernel_flag,全局中断锁global_irq_lock,进程列表锁tasklist_lock。下面先从锁操作开始描述调度器的工作过程。

A. 相关锁

  • runqueue_lock,定义为自旋锁,对就绪队列进行操作之前,必须锁定;
  • kernel_flag,定义为自旋锁,因为很多核心操作(例如驱动中)需要保证当前仅由一个进程执行,所以需要调用lock_kernel()/release_kernel()对核心锁进行操作,它在锁定/解锁kernel_flag的同时还在task_struct::lock_depth上设置了标志,lock_depth小于0表示未加锁。当发生进程切换的时候,不允许被切换走的进程握有kernel_flag锁,所以必须调用release_kernel_lock()强制释放,同时,新进程投入运行时如果lock_depth>0,即表明该进程被切换走之前握有核心锁,必须调用reacquire_kernel_lock()再次锁定;
  • global_irq_lock,定义为全局的内存长整型,使用clear_bit()/set_bit()系列进行操作,它与global_irq_holder配合表示当前哪个cpu握有全局中断锁,该锁挂起全局范围内的中断处理(见irq_enter());
  • tasklist_lock,定义为读写锁,保护以init_task为头的进程列表结构。

上一页  [1] [2] 


[C语言系列]C# 和 Linux 时间戳转换  [Web开发]PHP flock文件锁介绍
[Web开发]flock() Linux下的文件锁  [电脑应用]Linux下的六个免费的虚拟主机管理系统介绍
[电脑应用]Linux数据库大比拚  [操作系统]在Windows中玩转Linux操作系统
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]掌握 Linux 调试技术
[办公软件]理解 Linux 配置文件  [聊天工具]Real10 & Xpdf installation on Linux Box
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台