`
20386053
  • 浏览: 461436 次
文章分类
社区版块
存档分类
最新评论

【操作系统笔记】线程的实现与调度(结合Java)

 
阅读更多

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17371269


并发不一定要依赖多线程(也可以多进程并发),但是在Java中谈论并发,大多数都与线程脱不开关系。线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的最基本单位)。


操作系统线程的实现

实现线程主要有三种方式:使用内核线程实现,使用用户线程实现,使用用户线程加轻量级进程混合实现。

使用内核线程实现

内核线程(Kernel Thread, KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Light Weight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。这种轻量级进程与内核线程之间1:1的关系称为一对一的线程模型。轻量级进程要消耗一定的内核资源(如内核线程的栈空间),而且系统调用的代价相对较高,因此一个系统支持轻量级进程的数量是有限的。

使用用户线程实现

广义上来讲,一个线程只要不是内核线程,那就可以认为是用户线程(User Thread,UT),而狭义的用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知到线程存在的实现,用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。如果程序实现得当,这种线程不需要切换到内核态,因此操作可以是非常快速且低消耗的,也可以支持规模更大的线程数量,部分高性能数据库中的多线程就是由用户线程实现的。这种进程与用户线程之间1:N的关系称为一对多的线程模型。
使用用户线程的优势在于不需要系统内核的支援,劣势在于没有系统内核的支援,所有的线程操作都需要用户程序自己处理,因而使用用户线程实现的程序一般都比较复杂,现在使用用户线程的程序越来越少了。Java、Ruby层语言都曾经使用过用户线程,最终又都放弃了使用它。

混合实现

混合环境下,既存在用户线程,又存在轻量级进程。用户线程还是完全建立在用户空间中,而操作系统所支持的轻量级进程则作为用户线程和内核线程之间的桥梁。这种混合模式下,用户线程与轻量级进程的数量比是不定的,是M:N的关系。许多Unix系列的系统,都提供了M:N的线程模型实现。


Java线程的实现

Java线程在JDK1.2之前,是基于名为“绿色线程”的用户线程实现的,而在JDK1.2中,线程模型被替换为基于操作系统原生线程模型来实现。因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上就决定了Java虚拟机的线程是怎样映射的,这点在不同的平台上没有办法达成一致,虚拟机规范中也未限定Java线程需要使用哪种线程模型来实现。

线程调度

线程调度室指系统为线程分配处理器使用权的古城,主要的调度方式有两种:协同式和抢占式线程调度。

协同式线程调度

使用协同式的线程调度,线程的执行时间由线程本身来控制,线程把自己的工作执行完了后,要主动通知系统切换到另一个线程上去。协同式线程调度的最大优点是实现简单,而且由于线程要把自己的事情干完后才会进行线程切换,因此没有什么线程同步的问题。它的缺点很明显:线程执行时间不可控制,有可能出现线程饥饿、永久阻塞等问题。比如,如果一个线程编写有问题,一直不告知系统进行线程切换,那么程序就会一直阻塞在那里。

抢占式线程调度

使用抢占式的线程调度,每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定(在Java中,Thread.yield()可以让出执行时间,但是要获得执行时间的话,线程本身是没有办法的)。在这种实现线程调度的方式下,线程的执行时间是系统可控的,也不会因为一个线程而导致整个进程阻塞。Java使用的线程调度方式就是抢占式调度。另外,抢占式线程调度也与线程优先级有关,不过线程优先级并不是很靠谱,原因是Java的线程是被映射到系统的原生线程上来实现的,所以线程调度最终还是由操作系统说了算,虽然现在好恩多操作系统都有提供线程优先级的概念,但是并不见得能与Java线程的优先级一一对应。因此,不能太依赖优先级。





分享到:
评论

相关推荐

    Java多线程笔记

    在不同的 JVM 和操作系统中,线程规划会有差异,有些操作系统甚至会忽略对线程优先级的设定。程序的正确性不能依赖线程的优先级。 线程状态 Java 中的线程状态包括新建状态、就绪状态、运行状态、休眠状态、阻塞...

    JAVA 多线程学习笔记

    线程执行顺序由操作系统的线程调度策略决定,不保证同步。 二、线程状态 Java线程有五种状态:新建、就绪、运行、阻塞和终止。`Thread.State`枚举类型表示这些状态,理解它们有助于优化线程管理。 三、线程同步 ...

    java多线程笔记

    首先,我们要了解操作系统中的线程和进程。进程是运行中的程序实例,每个进程都有自己的内存空间和系统资源,而线程则是进程内的执行单元,共享同一进程的内存和资源。在多线程环境下,多个线程可以并行地在单个进程...

    java线程学习笔记

    线程与任务的区别在于线程是操作系统的最小调度单元,而任务是指需要执行的工作内容。在Java中,可以通过Runnable或Callable表示任务,而通过Thread或其他并发API来管理线程。 让后计算是指在某个计算操作完成后,...

    java多线程笔记全手打

    Java的`Thread`类提供了设置线程优先级的方法,如`setPriority(int priority)`,但实际效果受操作系统的调度策略影响,不一定能保证优先级高的线程先执行。 七、守护线程与用户线程 守护线程(Daemon Thread)不会...

    java多线程读书笔记

    多线程在操作系统层面是通过进程和线程实现的,而Java则提供了一套丰富的API来支持多线程编程。 在操作系统层面,多任务是通过多进程实现的,每个进程拥有独立的内存空间,而线程则是进程内的执行单元,它们共享...

    Java多线程自学笔记

    - 由操作系统负责调度线程,决定哪个线程获得CPU时间。 - Java虚拟机无法直接控制调度策略。 #### 八、守护线程 - **守护线程**: - 被标记为守护线程的线程,在所有非守护线程结束后,JVM会自动退出。 - 守护...

    多线程-狂神说Java学习笔记

    默认情况下,JVM根据优先级调度线程,但实际执行顺序还受到操作系统的调度策略影响。 ### 八、中断与异常处理 通过`Thread.interrupt()`方法可以请求线程中断,线程在执行过程中应检查`InterruptedException`并...

    java多线程编程笔记

    在深入理解Java多线程之前,我们首先要理解操作系统中的基本概念——进程和线程。 1. **线程与进程** - **进程**:在操作系统中,进程是指一个独立运行的应用程序,每个进程都有自己的内存空间,互不影响。例如,...

    Java多线程学习笔记

    Java中的线程调度是基于时间片的轮转策略,同时也支持线程优先级的概念。 ##### 1. 获取当前线程: ```java Thread currentThread = Thread.currentThread(); ``` ##### 2. 线程优先级: 线程优先级可以用来调整...

    多线程笔记_java/多线程_

    Java提供了10个线程优先级,但实际效果依赖于操作系统的调度策略。一般情况下,优先级高的线程更可能获得CPU时间片,但并不绝对。 七、中断与异常处理 Thread对象的interrupt()方法用于中断线程,而isInterrupted()...

    JAVA操作系统课程教学网站的设计与实现

    对于Java操作系统课程,网站可能需要提供模拟环境,让学生能在浏览器中实践操作系统概念,例如线程管理、内存分配、磁盘调度等。这需要利用Java Applet或WebAssembly技术在浏览器环境中运行Java代码。同时,为了保证...

    JAVA并发编程实践-线程执行-学习笔记

    占式线程调度是Java和大多数现代操作系统采用的线程调度策略。在这种模式下,操作系统决定何时以及哪个线程将获得CPU的执行时间。线程的执行不是由线程自身控制,而是由操作系统通过时间片轮转或者优先级调度等方式...

    java线程笔记.docx

    **进程**:进程是程序在计算机上的一次执行过程,它是操作系统资源分配的基本单位。一个进程通常包含了多个线程。 **线程**:线程是比进程更小的执行单元,可以看作是进程内的一个执行路径。一个进程可以包含多个...

    java笔记 java笔记

    - **线程原理**:线程是操作系统调度的最小单位。 - **实现方式**:通过继承`Thread`类或实现`Runnable`接口。 - **生命周期**:新建、就绪、运行、阻塞、死亡。 - **线程方法**:如`start()`、`run()`、`join()`等...

    Java多线程问题及处理笔记.doc

    优先级高的线程在CPU调度中可能会得到更多的时间片,但请注意,Java的线程优先级并不总是绝对的,具体取决于操作系统的调度策略。设置线程优先级应谨慎,过度依赖优先级可能导致不公平的执行顺序,甚至可能导致...

    Java实验9多线程设计.doc

    优先级可以通过setPriority()方法设置,但实际调度取决于操作系统的实现。 6. **线程同步**: - **synchronized**:用于同步方法或同步代码块,防止多个线程同时访问同一资源,实现互斥。 - **wait(), notify(), ...

    【Java基础笔记】线程.docx

    1. 进程:进程是操作系统资源分配的基本单位,它包含了程序运行所需的所有资源,如内存空间、打开的文件等。一个进程可以包含一个或多个线程。 2. 线程:线程是进程内部的执行路径,它拥有自己的程序计数器(PC)、...

    java多线程学习笔记

    - 优先级高的线程并不保证一定先执行,线程调度还受到操作系统的限制。 6. **线程中断** - **interrupt()**:设置线程的中断标志,不会立即停止线程,而是在线程检查中断标志时抛出InterruptedException。 - **...

Global site tag (gtag.js) - Google Analytics