精华内容
下载资源
问答
  • 某一时间点CPU寄存器和程序计数器的内容,被称为上下文。 寄存器是CPU内部的少量速度很快的闪存。 程序计数器是一个专用的寄存器,被用来表示指令序列中CPU正在执行的位置。

    某一时间点CPU寄存器和程序计数器的内容,被称为上下文。

    寄存器是CPU内部的少量速度很快的闪存。
    程序计数器是一个专用的寄存器,被用来表示指令序列中CPU正在执行的位置。

    展开全文
  • 线程上下文切换

    千次阅读 2018-08-29 10:05:04
    一、为什么要减少线程上下文切换  当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为...

                一、为什么要减少线程上下文切换
                    当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”(“context switch”)。CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。上下文切换并不廉价,是比较耗时的
                二、线程上下文切换发生的条件
                    1.中断处理:中断分为硬件中断和软件中断,软件中断包括因为IO阻塞、未抢到资源或者用户代码等原因,线程被挂起
                    2.多任务处理:每个程序都有相应的时间处理片,当前任务的时间片用完之后,系统CPU正常调度下一个任务
                    3.用户状态切换:这种情况下,上下文切换并非一定发生,只在特定操作系统才会发生上下文切换
                三、上下文切换的步骤
                    1.为了理解为什么上下文切换的时候会损耗性能,我们应该先看看上下文切换的过程中究竟发生了什么。在切换过程中,正在执行的进程的状态必须以某种方式存储起来,这样在未来才能被恢复。这里说的进程状态包括该进程正在使用的所有寄存器(尤其是程序计数器),和一些必要的操作系统数据。保存进程状态的数据结构叫做“进程控制块”(PCB,process control block);
                    2.PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,它使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位或一个能与其他进程并发执行的进程。
                    上下文切换的具体步骤是(假设当前进程是进程A,要切换到的下一个进程是进程B):
                        1.保存进程A的状态(寄存器和操作系统数据);
                        2.更新PCB中的信息,对进程A的“运行态”做出相应更改;
                        3.将进程A的PCB放入相关状态的队列;
                        4.将进程B的PCB信息改为“运行态”,并执行进程B;
                        5.B执行完后,从队列中取出进程A的PCB,恢复进程A被切换时的上下文,继续执行A。
                        6.线程分为用户级线程和内核级线程。同一进程中的用户级线程切换的时候,只需要保存用户寄存器的内容,程序计数器,栈指针,不需要模式切换。但是这样会导致线程阻塞和无法利用多处理器。而同一进程中的内核级线程切换的时候,就克服了这两个缺点,但是除了保存上下文,还要进行模式切换。
                    线程切换和进程切换的步骤不同。进程的上下文切换分为两步:1.切换页目录以使用新的地址空间;2.切换内核栈和硬件上下文。对于linux来说,线程和进程的最大区别就在于地址空间。对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。所以明显是进程切换代价大。线程上下文切换和进程上下文切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
                四、如何减少线程上下文切换
                        1.无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 
                        2.CAS算法:Java的Atomic包使用CAS(compare and swap)算法来更新数据,而不需要加锁。 
                        3.使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。 
                        4.协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

    一、上下文切换
        1.即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒。
        2.CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是在切换之前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
    二、多线程并不一定快
    三、测试上下文切换的次数和时长
        1.通过Lmbench3测量上下文切换的次数
        2.通过vmstat测量上下文切换的次数
    五、避免死锁的常见方法
        1.避免一个线程同时获取多个锁
        2.避免一个线程在锁内同时占用多个资源
        3.尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
        4.对于数据库锁,加锁和解锁必须在一个数据库连接中,否则会出现解锁失败的情况
    六、资源限制的挑战
        1.什么是资源限制:资源限制是指在进行并发编程的时候,程序的执行速度受限于计算机硬件资源或软件资源。例如:硬件资源限制有带宽的上传和下载速度、硬盘读写速度和CPU的处理速度,软件资源限制有数据库的连接数和socket连接数等
        2.资源限制引起的问题:在并发编程中,将代码执行速度加快的原则是将代码中串行执行的部分变为并发执行,但是如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这个时候系统性能反而会变慢,因为增加了上下文切换和资源调度的时间。
        3.如何解决资源限制的问题:对于硬件资源限制,可以考虑使用资源池将资源服用。
        4.在资源限制下进行并发编程:如何在资源限制的情况下,让程序执行的更快呢?根据不同的资源限制调整程序的并发度。

    展开全文
  • 易语言源码易语言线程上下文注入源码.rar 易语言源码易语言线程上下文注入源码.rar 易语言源码易语言线程上下文注入源码.rar 易语言源码易语言线程上下文注入源码.rar 易语言源码易语言线程上下文注入源码.rar ...
  • 进程上下文与线程上下文

    千次阅读 2016-07-04 15:06:02
    6.1.2 线程上下文 操作系统管理很多进程的执行。有些进程是来自各种程序、系统和应用程序的单独进程,而某些进程来自被分解为很多进程的应用或程序。当一个进程从内核中移出,另一个进程成为活动的,这些进程之间...

    6.1.2  线程上下文

    操作系统管理很多进程的执行。有些进程是来自各种程序、系统应用程序的单独进程,而某些进程来自被分解为很多进程的应用或程序。当一个进程从内核中移出,另一个进程成为活动的,这些进程之间便发生了上下文切换。操作系统必须记录重启进程和启动新进程使之活动所需要的所有信息。这些信息被称作上下文,它描述了进程的现有状态。当进程成为活动的,它可以继续从被抢占的位置开始执行。进程的上下文信息包括:

    进程id

    指向可执行文件的指针

    静态和动态分配的变量的内存

    处理器寄存器

    进程的上下文的多数信息都与地址空间的描述有关。进程的上下文使用很多系统资源,而且会花费一些时间来从一个进程的上下文切换到另一个进程的上下文。线程也有上下文。表6-1将线程上下文和第5章讨论的进程上下文进行了对比。当线程被抢占时,就会发生线程之间的上下文切换。如果线程属于相同的进程,它们共享相同的地址空间,因为线程包含在它们所属于的进程的地址空间内。这样,进程需要恢复的多数信息对于线程而言是不需要的。尽管进程和它的线程共享了很多内容,但最为重要的是其地址空间和资源,有些信息对于线程而言是本地且唯一的,而线程的其他方面包含在进程的各个段的内部。

    6-1

    上下文内容

        

    线    

    指向可执行文件的指针

    x

     

    x

    x

    内存(数据段和堆)

    x

     

    状态

    x

    x

    优先级

    x

    x

    程序I/O的状态

    x

     

    授予权限

    x

     

    调度信息

    x

     

    审计信息

    x

     

    有关资源的信息

    ● 文件描述符

    ● /写指针

    x

     

    有关事件和信号的信息

    x

     

    寄存器组

    ● 栈指针

    ● 指令计数器

    ● 诸如此类

    x

    x


    对线程唯一或本地的信息包括线程id、处理器寄存器(当线程执行时寄存器的状态,包括程序计数器和栈指针)、线程状态及优先级、线程特定数据(thread-specific dataTSD)。线程id是在创建线程时指定的。线程能够访问它所属进程的数据段,因此线程可以读写它所属进程的全局声明数据。进程中一个线程做出的任何改动都可以被进程中的所有线程以及主线程获得。在多数情况下,这要求某种类型的同步以防止无意的更新。线程的局部声明变量不应当被任何对等线程访问。它们被放置到线程栈中,而且当线程完成时,它们便会被从栈中移走。

    注意:

    线程间的同步将在第7章中讨论。

    TSD是一种结构体,包含线程私有的数据和信息。TSD可以包含进程全局数据的私有副本,还可以包含线程的信号掩码。信号掩码用来识别特定类型的信号,这些信号在发送给进程时不会被该线程接收。否则,如果操作系统给进程发送一个信号,进程的地址空间中的所有线程也会接收到那个信号。线程会接收所有没有被掩码遮蔽的信号。

    线程与它所属的进程共享代码段和栈段。它的指令指针指向进程的代码段的某个位置,是下一条可执行的线程指令,而且栈指针指向进程栈中线程的栈的顶部位置。线程还可以访问任何环境变量。进程的所有资源(例如文件描述符)都将与线程共享。

    展开全文
  • 1、首先,需要搞明白什么是上下文切换?(面试题) 上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。 2、 然后,需要...

    1、首先,需要搞明白什么是上下文切换?(面试题)
    上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。

    2、 然后,需要明白进程与线程的区别?(网上很多,这里简单说明)
    1).线程是进程的一部分。 进程是表示资源分配的基本单位,又是调度运行的基本单位,是程序执行的一个实例; 线程是进程中执行运算的最小单位,即执行处理机调度的基本单位,是进程中的一个执行流。
    2).内存空间不同。 每一个进程拥有自己独立的内存空间,而线程共享进程的内存空间。
    进程上下文切换与线程上下文切换最主要的区别就是线程的切换虚拟空间内存是相同的(因为都是属于自己的进程),但是,进程切换的虚拟空间内存则是不同的。
    同时,这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

    3、线程上下文切换比进程上下文切换快的多。
    补充:多线程是如何实现的?
    主要是CPU通过给每个线程分配CPU时间片来实现多线程的。即使是单核处理器(CPU)也可以执行多线程处理。
    时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程时同时执行的,时间片一般是几十毫秒(ms)。

    4、在进行上下文切换时,CPU通过时间片分配算法来循环执行任务,Java中的时间片分配算法有哪些?
    最简单最常用的就是基于时间片轮转调度算法。 时间片轮转调度算法是非常公平的处理机分配方式,可以使就绪队列的每个进程每次仅运行一个时间片。
    原理:在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。当时间片结束或进程执行结束,系统再次将CPU分配给队首进程。

    展开全文
  • 如何减少线程上下文切换

    千次阅读 2019-04-15 22:35:18
    频繁的线程上下文切换会成为一个系统瓶颈,本来引入线程就是为了提高系统运行效率,这下倒好了,频繁的线程上下文切换可能会给系统造成更大的系统开销,让系统苦不堪言。 首先了解一下,线程切换似乎有两种方式,第...
  • 进程切换分两步 1.切换页目录以使用新的地址空间 ...线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通
  • jvm之线程上下文加载器与SPI

    万次阅读 2020-07-11 19:05:57
    线程上下文加载器 线程上下文类加载器(Thread Context Class Loader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用来获取和设置...
  • 进程上下文切换与线程上下文切换

    千次阅读 2020-04-06 22:45:33
    进程上下文切换 进程上下文包含了进程执行所需要的所有信息。 用户地址空间:包括程序代码,数据,用户堆栈等; 控制信息:进程描述符,内核栈等;...线程上下文切换 对于linux来说,线程和进程的最大...
  • 首先,需要搞明白什么是上下文切换? 上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。 然后,需要明白进程与线程的...
  • 修改线程上下文注入DLL

    千次阅读 2016-11-03 17:58:48
    修改线程上下文,注入ShellCode加载dll
  • 易语言线程上下文注入源码
  • 1 线程上下文类加载器 2 何时使用Thread.getContextClassLoader()? 3 类加载器与Web容器 4 类加载器与OSGi 总结 1 线程上下文类加载器  线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的...
  • 【多线程】线程上下文切换

    千次阅读 2021-05-12 17:27:13
    线程的CPU时间片用完后,会先保存当前的状态,以便下次切换回来后,可以再加载这个状态。从保存到再加载的过程就是一次上下文切换。 上下文切换会消耗大量的CPU时间。
  • 线程上下文切换详解

    万次阅读 多人点赞 2019-05-30 14:35:17
    什么是上下文切换? CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。 ——任务从保存到再加载的过程...
  • 线程上下文类加载器

    千次阅读 2015-08-13 11:14:06
    线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果...
  • 什么是线程上下文切换? 多线程执行是cpu抢占时间片的方式执行。多线程创建并切换到另一个线程的过程,称之为线程上下文切换 如何减少上下文切换 减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和...
  • 什么是线程上下文切换 首先要了解,就算我们的CPU是单核的,也是支持多线程运行代码的。那么能做到这点的关键就在于CPU利用了时间片轮询来为每一个任务都服务一段时间。时间片指的就是CPU分配给每一个线程的时间...
  • 线程上下文切换与进程上下文切换

    千次阅读 2017-09-27 18:29:24
    硬件上下文:(注意中断也要保存硬件上下文只是保存的方法不同)。 2、进程切换分3步 a.切换页目录以使用新的地址空间 b.切换内核栈 c.切换硬件上下文 3、线程切换  对于linux来说,线程和进程的最大区别就...
  • 何时需线程上下文拷贝 比如用户认证和 tracing 调用链相关信息都在请求线程上下文中,但是异步时就会丢失,所以需要一直携带。可实现 spring 的如下接口 TaskDecorator 装饰器的回调接口,该接口将应用于将要执行的...
  • 进程、线程上下文切换

    千次阅读 2020-05-24 22:12:02
    什么是上下文切换 上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程或线程切换到另一个进程或线程上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:(1...
  • 真正理解线程上下文类加载器(多案例分析)

    万次阅读 多人点赞 2016-09-25 13:31:36
    线程上下文类加载器破坏了“双亲委派模型”,可以在执行线程中抛弃双亲委派加载链模式,使上层代码可以逆向使用下层的系统类加载器。本文通过JDBC和Tomcat两个案例分析,详细解释了其中的原理。
  • 1.首先,需要搞明白什么是上下文切换? 上下文切换就是从当前执行任务切换到另一个任务执行的过程。但是,为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态。 2. 然后,需要明白进程与线程...
  • 线程上下文切换

    千次阅读 2016-04-26 17:18:54
    前言 本文来自方腾飞老师《Java并发编程的艺术》第一章。 并发编程的目的是为了让程序运行得更快,但是并不是启动更多的线程就能让程序最大限度地并发执行。...什么是上下文切换 即使是单核CPU也支持多线程执行
  • 线程上下文与ClassLoader

    千次阅读 2011-08-29 22:59:23
    每个线程都有一个关联的上下文ClassLoader。如果在使用new Thread()方式生成新的线程,新线程将继承其父进程的上...如果程序对线程上下文ClassLoader没有任何改动的话, 程序中所有的线程都使用System ClassLoader作
  • 双亲委派模型与线程上下文类加载器

    万次阅读 多人点赞 2019-04-14 11:39:54
    SPI机制是什么,有哪些应用场景,又带来了哪些问题? 双亲委派模型是Java推荐的类加载模型,但违背该模型的案例有哪些?为什么会违背,又是怎么解决这种case的?...线程上下文类加载器的作用与应用场景?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 280,474
精华内容 112,189
关键字:

线程上下文是什么