1.GIL与线程调度
Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用
为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL。
GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下一条指令并不会互相影响。
在调用任何Python C API之前,要先获得GIL
GIL缺点:多处理器退化为单处理器;优...
分类:
编程语言 时间:
2014-06-25 19:48:52
阅读次数:
358
1>GCD,全称Grand Central Dispatch,”牛逼的中枢调度器”,纯C语言,提供了非常多强大的函数2>GCD优势:(1)GCD是苹果公司为多核的并行运算提出的解决方案(2)GCD会自动利用更多地CPU内核(双核,四核等)(3)GCD会自动管理线程的生命周期(创建线程,调度任务,销毁...
分类:
编程语言 时间:
2014-06-24 11:54:27
阅读次数:
273
一、锁的劣势
锁定后如果未释放,再次请求锁时会造成阻塞,多线程调度通常遇到阻塞会进行上下文切换,造成更多的开销。
在挂起与恢复线程等过程中存在着很大的开销,并且通常存在着较长时间的中断。
锁可能导致优先级反转,即使较高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别。
二、硬件对并发的支持
处理器填写了一些特殊指令,例如:比较并交换...
分类:
编程语言 时间:
2014-06-07 14:25:12
阅读次数:
310
总结下python中线程调度机制.
对于线程调度机制而言,同操作系统的进程调度一样,最关键是要解决两个问题:
1.在何时选择挂起当前线程,并选择处于等待的先一个线程呢?
2.在众多等待的线程中,选择哪一个作为激活线程呢?
在python多线程机制中,这个两个问题是有两个层次解决的。
如,进程间的切换,当发生了时钟中断,操作系统响应时钟中断,并在这个时候开始进程的调...
分类:
编程语言 时间:
2014-06-05 10:07:35
阅读次数:
314
1 调度
Windows不是实时操作系统,它是抢占式多线程操作系统。在假设所有优先级相同的情况下,CPU对线程的调度原则是每隔20m就会切换到下一个线程,根据Context中的IP和SP来接着执行上次的东西。Windows永远不会让1个线程去独占一段时间。
2 可调度性
系统只调用可以调度的线程,其实系统的大部分线程都是处于不可调度的状态,要么处于暂停的状...
分类:
编程语言 时间:
2014-06-03 00:16:07
阅读次数:
402
--基本知识--多线程状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当syn...
分类:
其他好文 时间:
2014-05-20 12:46:41
阅读次数:
229
1.Thread.yield()方法作用是:
暂停当前正在执行的线程对象,并执行其他线程。 yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相 同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。 结论:yield()从未导致线...
分类:
编程语言 时间:
2014-05-13 00:30:15
阅读次数:
589
在Java多线程程序中,由于线程调度,指令间的次序在每次运行时都可能不相同,有时候,我们需要得到指令次序,用来分析程序的行为。这样细粒度的底层行为用一般方法很难完成,我们需要借助 JVM Tool Interface,即JVMTI,来帮助我们获取Java虚拟机执行时的信息。本文先介绍编写JVMTI程序的基本框架,然后介绍如何使用JVMTI来获取多线程程序中指令之间的次序。...
分类:
编程语言 时间:
2014-04-29 13:11:22
阅读次数:
892