浅谈linux线程切换问题

浅谈linux线程切换问题浅谈linux线程切换问题

处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间;

一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

用户级上下文:  正文、数据、用户堆栈以及共享存储区;

寄存器上下文:  通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);

系统级上下文:  进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。系统中的每一个进程都有自己的上下文。一个正在使用处理器运行的进程称为当前进程(current)。当前进程因时间片用完或者因等待某个事件而阻塞时,进程调度需要把处理器的使用权从当前进程交给另一个进程,这个过程叫做进程切换。此时,被调用进程成为当前进程。在进程切换时系统要把当前进程的上下文保存在指定的内存区域(该进程的任务状态段TSS中),然后把下一个使用处理器运行的进程的上下文设置成当前进程的上下文。当一个进程经过调度再次使用CPU运行时,系统要恢复该进程保存的上下文。所以,进程的切换也就是上下文切换。在系统内核为用户进程服务时,通常是进程通过系统调用执行内核代码,这时进程的执行状态由用户态转换为内核态。但是,此时内核的运行是为用户进程服务,也可以说内核在代替当前进程执行某种服务功能。在这种情况下,内核的运行仍是进程运行的一部分,所以说这时内核是运行在进程上下文中。内核运行在进程上下文中时可以访问和修改进程的系统数据。此外,若内核运行在进程上下文中需要等待资源和设备时,系统可以阻塞当前进程。

Linux下的线程实质上是轻量级进程(light weighted process),线程生成时会生成对应的进程控制结构,只是该结构与父线程的进程控制结构共享了同一个进程内存空间。 同时新线程的进程控制结构将从父线程(进程)处复制得到同样的进程信息,如打开文件列表和信号阻塞掩码等。创建线程比创建新进程成本低,因为新创建的线程使用的是当前进程的地址空间。相对于在进程之间切换,在线程之间进行切换所需的时间更少,因为后者不包括地址空间之间的切换。

线程切换上下文切换的原理与此类似,只是线程在同一地址空间中,不需要MMU等切换,只需要切换必要的CPU寄存器,因此,线程切换比进程切换快的多。

以上就是小编为大家带来的浅谈linux线程切换问题全部内容了,希望大家多多支持脚本之家~

欢迎分享,转载请注明来源:内存溢出

原文地址:http://outofmemory.cn/yw/902885.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-15
下一篇2022-05-15

随机推荐

  • 在Android上叠加屏幕

    概述如何将视图图像添加到主屏幕?最好的例子是facebookmessenger:如果你长按聊天项目,你可以选择“弹出作弊头”,然后你的屏幕上会有一个小按钮.还有像屏幕破碎机这样的应用程序,来自破碎显示屏的图像覆盖了手机上的所有内容.我已经

    2022-05-29
    1100
  • android–SlidingMenu(jfeinstein).仅禁用二级菜单

    概述是否可以在SlidingMenulib中仅禁用辅助菜单?我用这个时:mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);它会禁用这两个菜单.更新:mSlidingMenu

    2022-05-29
    1000
  • Android Actionbar FragmentActivity

    概述在我的应用程序中我有标签,但现在我需要添加SherlockActionbar我知道我需要使用扩展SherlockActivity但早期我有FragmentActivity如何解决它?publicclassMainActivityexte

    2022-05-29
    1000
  • android– 如何隐藏我的应用程序但不关闭完成它

    概述我想让用户通过隐藏它但不完成它来离开我的应用程序.我可以在我的主要活动中调用finish(),但这需要一些时间.这对用户体验不利,因此更好的选择可能是隐藏它.只是我不知道如何实现它.谢谢你的回答.我不是想在后台做点什么,因为我已经有了服

    2022-05-29
    800
  • JDK安装—JAVA

    概述下载JDK下载地址:http:www.oracle.comechnetworkjavajavasedownloadsindex.html关于版本选择需要注意的问题:如果eclipse安装的是32位的,则JDK也应该装Wind

    2022-05-29
    800
  • Android Firebase SDK中的自动ID?

    概述Android中是否存在FirebaseiOSSDK中提供的childByAutoId功能?基本上在iOS中我创建的id如下:letkey=getAddPlayersQueueRef().child("tasks")

    2022-05-29
    1100
  • php– 如何解决org.json.JSONException中的错误?

    概述我正在创建一个可以通过将ID号放在editText中来检索单词的应用程序.我继续得到这个错误.如何解决这个问题呢?org.json.JSONException:{“server_response”:“Bird”}没有值这是我的主Acti

    2022-05-29
    600
  • MVC的 @Html.DropDownList()的一种用法

    概述前台代码 @Html.DropDownList("SerialName", ViewBag.selList1 as IEnumerable<SelectListItem>, new { @class =

    2022-05-29
    700
  • c# –Xamarin自定义键盘

    概述我正在尝试为特定页面创建自定义键盘,并且在处理所有键的侦听器时遇到一些问题,并且此文档非常有限.我正在使用Xamarin和C#进行开发:所以我在这里有一个活动(OrderActivity):mKeyboard=newKeyboard(t

    2022-05-29
    1100

发表评论

登录后才能评论

评论列表(0条)

    保存