多线程开发必须知道的概念

操作系统

是管理和控制计算机硬件与软件资源的计算机程序,它是一个软件。

多任务

多任务是操作系统一次运行多个应用程序的能力。多任务有两种形式:协作式多任务和抢占式多任务

协作式多任务:处理器同一时间内只能处理一个程序,直到该程序将占用处理器资源释放时(执行完退出),其他运行的程序才可以得到处理器资源。这种多任务的缺点是,如果一个程序不释放处理器资源,其他应用程序就会被挂起。windows早期版本正是用的这种方式。

抢占式多任务:操作系统允许一个应用程序执行一小段时间,然后强制中断它,让另一应用程序执行。可简单理解为中断一个程序来允许另一个程序执行。它全程由操作系统来控制。这样做的好处是避免了协作式多任务带来的挂起问题但会造成数据同步的问题。比如两个应用程序同时访问并修改一个变量。

进程

当启动一个程序时,系统就会为该程序分配所需的内存及其他资源。内存和资源的物理隔离叫做进程。当然,一个程序可能不止一个进程,所以程序和进程并不是一个意思。分配给进程的内存与其他进程隔离,只有自身可以访问。

线程

线程是操作系统能够进行运算调度的最小单元。它被包含在进程中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

时间片

进程可以执行的时间称作“时间片”或者“时间量”。时间片的间隔是变化莫测的而且每个操作系统和每个处理器设定的都可能不一样。

本地存储(TLS)

当一个线程运行的时间超出了它分配的时间片是,它并不是停下来而是再次排队等待。每个处理器在同一时间只能处理一个线程,所以当前线程不得不移出当前处理器。然而,在线程跳出执行前,它得将离开前的状态信息保存下来以便再次执行。这个功能就称作线程本地存储(Thread Local Storage,TLS)。TCL包含寄存器、堆栈指针、调度信息、内存中的地址空间以及其他正在使用的资源信息。存储在TLS中的一个寄存器是程序计数器,该计数器用来告诉线程接下来该执行哪条指令。

中断

中断是一种机制,它能够使CPU指令由正常执行顺序转向计算机内存中的其他地方,而不需要知道目前正在执行什么程序。Windows通过中断知道它什么时候需要作出线程调度的决定。Windows决定一个线程执行多长时间并在当前线程的执行顺序中放入一条指令。这个时间在不同系统间甚至同一系统的不同线程间都可能是不同的。由于中断被显式地放入到指令集,所以通常被称为软件中断。一旦中断被设置,Windows就允许线程执行。当线程执行到中断时,Windows使用一个被称为中断处理的特定函数来将这个线程的状态存在在TLS中。当前线程的程序计数器也存储在TLS中。这个程序计数器仅仅是当前执行指令的地址。一旦线程执行超时,它会按照自身的优先级被移动到线程队列的末尾来等待再次被调度。

线程睡眠与时钟中断

线程自愿地退出执行队列一段时间,就称为睡眠。当一个线程进入睡眠状态,它被再次被打包到TLS中,但是这次不会放到TLS执行队列尾部。而是放到一个单独的睡眠队列中。为了使睡眠队列上的线程再次运行,需要用另一种中断来标记它们,称为时钟中断。当一个线程进入睡眠队列时,就会给它设置一个时钟中断,安排何时唤醒这个线程。当发生时钟中断时,如果这个时间与睡眠队列上的一个线程恢复运行的时间匹配,这个线程就会回到可执行的队列中,并安排恢复执行的时间。

线程的终止

线程的终止分为两种情况。一种是在一个线程执行过程中显式请求停止另一个线程;另一种是一个线程执行完成自动结束。

线程的优先级

线程执行的优先顺序称为线程的优先级。windows将线程的优先级分为0~31级别,数字越大表示优先级越高。只有系统才能设置0优先级,说明线程是空闲的。用户可以设置1~15的优先级,只有系统管理员才能设置高于15的优先级。16~31之间运行的线程是实时线程。“实时”,指的是优先级非常高,可以抢占优先级低的线程的执行时间。

时间: 2024-11-05 16:07:14

多线程开发必须知道的概念的相关文章

[Android学习笔记]Android中多线程开发的一些概念

线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关工作就叫做线程同步. android中,处理线程同步的手段就是:锁 一般分为公平锁和非公平锁: synchronized(内部锁,互斥锁):synchronized是JVM提供的线程同步机制,如果出现问题,JVM能捕获异常,并释放资源,具体实现机制需要查看JVM源码 synchronized的使用特

.NET基础拾遗(5)多线程开发基础

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 一.多线程编程的基本概念 下面的一些基本概念可能和.NET的联系并不大,但对于掌握.NET中的多线程开发来说却十分重要.我们在开始尝试多线程开发前,应该对这些基础知识有所掌握,并且能够在操作系统层面理解多线程的运行方式. 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块

Java多线程开发系列之四:玩转多线程(线程的控制2)

在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接进入正题:  3.线程睡眠  sleep() 所有介绍多线程开发的学习案例中,基本都有用到这个方法,这个方法的意思就是睡眠(是真的,请相信我...).好吧,如果你觉得不够具体,可以认为是让当前线程暂停一下,当前线程随之进入阻塞状态,当睡眠时间结束后,当前线程重新进入就绪状态,开始新一轮的抢占计划!

为什么要多线程开发

一.单线程和多线程概述. 单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行. 单线程较多线程来说,系统稳定.扩展性极强.软件丰富.多用于点对点的服务.很多软件都有CPU单核单线程能力测试(single thread).我们都知道,多核多线程能力代表着整机性能的最高表现,而单核单线程能力则是可以体现在某些低功耗运行设定下的实际性能表现.用户需要知道自己的设备性能极限在哪里,也需要知道自己能日常够用到的性能大概有多少. 在固有的观念中,CPU核心数量的增多会被认

Java多线程开发系列之一:走进多线程

对编程语言的基础知识:分支.选择.循环.面向对象等基本概念后,我们需要对java高级编程有一定的学习,这里不可避免的要接触到多线程开发. 由于多线程开发整体的系统比较大,我会写一个系列的文章总结介绍 多线程开发的概念.使用.线程状态.同步.线程池.希望与大家共勉. 在第一部分,也就是本节我们先介绍下 什么是多线程程序.线程和进程又是什么,以及为什么要搞多线程. (一)什么是多线程程序 多线程听上去是非常专业的概念,其实非常简单,我们在日常生活中,经常的接触到多线程. 比如 (1)在工厂,工人努力

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

谈谈多线程开发中的线程和任务的理念

前段时间写了一个iOS端的数据统计SDK,数据统计有些复杂的计算和数据上报操作.由于有些操作比較耗时.所以不得不在后台线程进行操作,由此引发了我对多线程的思考,在iOS开发中,一般非常难再见到直接使用NSThread进行多线程编程的了.由于苹果提供了另外几种多线程开发的解决方式.而这些解决方式面向的不再是线程,而是面向的是任务,以下就来以iOS和Android为例简单谈谈的线程和任务的相关概念. 线程: 我们在学习基础的编程语言的时候,肯定听说过线程的概念,线程是操作系统调度的最小单位,共享进程

Java进阶(三)多线程开发关键技术

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/java/multi_thread/ sleep和wait到底什么区别 其实这个问题应该这么问--sleep和wait有什么相同点.因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点. wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法.sleep方法是Thread类的静态方法. wait是在当前线程持有wait对象锁

iOS多线程开发——GCD的使用与多线程开发浅析(二)

对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己.最近刚看完了<Objective-C高级编程 iOS与OS X多线程和内存管理>这本书后,对多线程有了更为深入的理解,故在此做一个总结与记录.这本书我已经上传至网盘  https://pan.baidu.com/s/1c2fX3EC ,这本书是iOS开发者必读的书之一,写得很不错,欢迎大家下载阅读.书的封面如下,故也称狮子书: . (1)多线程会遇到的问题 . 多线程会出现什么问题呢?当多个线程对同一