您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 争用条件 >

多线程的简单介绍(翻译)

发布时间:2019-06-20 01:17 来源:未知 编辑:admin

  现代电脑已经具有同一时间执行多个操作的能力。由于硬件的发展以及更智能的操作系统的支持,我们的程序可以执行反馈的更快。

  由于这个巨大的能力(同一时间执行多个操作),编程变得十分神奇同时又十分复杂。这项巨大的能力使得你必须去理解电脑内部的执行原理。在第一节中,我将解开多线程的一角,讲解多线程这项如此有魔力的东西。

  现代的操作系统可以在同一时间执行多个程序。那就是为什么你可以一边用你的浏览器看文章一边又可以听音乐的原因。每个程序都被看做一个进程被执行。操作系统知道许多软件技巧来使多个程序一起运行,当然也可以使用底层硬件。不管何种方式,最终的结果就是让你觉得你所有的程序都在同一时间进行着。

  在操作系统中运行进程并不是同时执行多个操作的唯一方法。每个进程也可以同时运行他的子任务——线程。在被启动的时候,每个进程至少会出发一个被叫做主线程的线程。然后根据程序的需要,额外的线程或被启动或被终止。多线程是指在一个进程中运行多个线程。

  例如,您的媒体播放器可能运行多个线程:一个用于呈现界面-这通常是主线程,另一个用于播放音乐等。

  你可以这样去想:操作系统是一个包含许多进程的容器。其中每个进行又是多个线程的容器。在这个文章里面,我将只关注于线程但是以上的所有主题都是有趣值得深究的。

  操作系统可以被看做一个包含进程的大盒子,而每个进程又包含了一个或多个线程(至少一个主线程)

  每个进程都拥有一个属于自己的内存块。这些自己的内存块无法被其他的进程访问分享:你的浏览器程序无法访问媒体播放器的内存,反之亦然。当然,如果你同时启动的相同程序两次(例如打开了谷歌浏览器两次),他们之间也无法进行内存之间的访问。操作系统将每个实例视为一个新进程,并分配其各自独立的内存部分。因此,默认情况下,两个或多个进程无法共享数据,除非它们执行高级技巧——所谓的进程间通信(IPC)

  与进程不同,线程共享操作系统分配给其父进程的同一块内存:媒体播放器主界面中的数据可以被音频引擎轻松访问,反之亦然。因此,两个线程更容易相互通信。除此之外,线程通常比进程更轻:它们占用的资源更少,创建速度更快,这就是为什么它们也被称为轻量级进程的原因。

  线程是使程序同时执行多个操作的简便方法。如果没有线程,您将不得不为每个任务编写一个程序,将它们作为进程运行,并通过操作系统对它们进行同步。这将更加困难(IPC比较棘手),并且速度较慢(进程比线程更重)。

  到目前为止提到的线程是一个操作系统的事情:一个想要启动一个新线程的进程必须与操作系统对话。不过,并非每个平台都支持线程。绿色线程(也称为光纤)是一种仿真,使多线程程序在不提供该功能的环境中工作。例如,如果底层操作系统没有本机线程支持,虚拟机可能实现绿色线程。

  绿色线程的创建和管理速度更快,因为它们完全绕过了操作系统,但也有缺点。我将在下一集中写下这个话题。

  “绿色线程”的名字是指Sun MyStand在90年代设计了原始Java线程库的绿色团队。如今Java不再使用绿色线返回到本地的线程。其他一些编程语言(go、haskell或rust等)实现了绿色线程的等价物,而不是本机线程。

  为什么一个进程应该使用多个线程?正如我之前提到的,并行工作大大加快了速度。假设您将要在电影编辑器中渲染电影。编辑器可能足够智能,可以将渲染操作分散到多个线程上,每个线程在多个线程上处理最终电影的一块。因此,如果使用一个线程,那么任务需要一个小时,而使用两个线分钟;使用四个线分钟,依此类推。

  不是每个程序都需要多线程。如果你的应用程序执行顺序操作或者经常等待用户做一些事情,多线程可能没有那么好;

  您只需不向应用程序抛出更多的线程,以使其更快地运行:每个子任务都必须经过仔细的思考和设计,才能执行并行操作;

  不能100%地保证线程将真正并行地执行其操作,也就是说,它实际上取决于底层硬件。

  最后一个是至关重要的:如果您的计算机不同时支持多个操作,那么操作系统必须伪造它们。我们马上就知道。现在,让我们把并发性看作是同时运行任务的感知,而真正的并行性则是同时运行的任务。

  (个人:单个CPU在执行指令的时候是一条一条执行的:通过CS:IP来获取指令)

  计算机中的中央处理器(CPU)完成运行程序的繁重工作。它由几个部分组成,主要部分是所谓的核心部分:这就是实际执行计算的地方。核心一次只能运行一个操作。

  这当然是一个主要的缺点。因此,操作系统开发了先进的技术,使用户能够同时运行多个进程(或线程),特别是在图形环境中,甚至在单核机器上。最重要的一个任务称为抢占式多任务处理,抢占是中断一个任务,切换到另一个任务,然后在以后恢复第一个任务的能力。

  因此,如果您的CPU只有一个内核,那么操作系统的一部分工作就是将单核计算能力分散到多个进程或线程上,这些进程或线程在循环中一个接一个地执行。这个操作会让你产生一个以上的程序并行运行的错觉,或者一个程序同时做多个事情(如果是多线程的话)。虽然满足并发性,但真正的并行性——同时运行进程的能力——仍然缺失。

  今天,现代CPU在引擎盖下有多个核心,每个核心一次执行一个独立的操作。这意味着对于两个或多个内核,真正的并行性是可能的。例如,我的Intel Core i7有四个内核:它可以同时运行四个不同的进程或线程。

  操作系统能够检测CPU核心的数量,并为每个核心分配进程或线程。线程可以分配给操作系统喜欢的任何核心,并且这种调度对于正在运行的程序是完全透明的。另外,如果所有核心都忙的话,先发制人的多任务可能会出现。这使您能够运行比计算机中可用的实际数量或核心更多的进程和线程。

  在单核机器上实现真正的并行是不可能的。然而,如果您的应用程序可以从中受益,那么编写多线程程序仍然是有意义的。当一个进程使用多个线程时,即使其中一个线程执行缓慢或阻塞的任务,抢占式多任务也可以保持应用程序的运行。

  比如说,你正在开发一个桌面应用程序,它从一个非常慢的磁盘上读取一些数据。如果只使用一个线程编写程序,整个应用程序将冻结,直到磁盘操作完成:分配给唯一线程的CPU电源在等待磁盘唤醒时被浪费。当然,操作系统正在运行除此之外的许多其他进程,但是您的特定应用程序将不会有任何进展。

  让我们以多线程的方式重新考虑您的应用程序。线程A负责磁盘访问,而线程B负责主接口。如果线程A由于设备速度慢而被卡住,那么线程B仍然可以运行主界面,从而保持程序响应。这是可能的,因为有两个线程,操作系统可以在两个线程之间切换CPU资源,而不会陷入较慢的线程。

  如我们所知,线程共享其父进程的同一块内存。这使得他们中的两个或多个在同一个应用程序中交换数据非常容易。例如:一个电影编辑器可能拥有一大部分包含视频时间线的共享内存。这样的共享内存正被几个指定用于将电影呈现到文件中的工作线程读取。它们都只需要一个指向该内存区域的句柄(例如指针),就可以从该内存区域中读取数据并将渲染帧输出到磁盘。

  只要从同一个内存位置读取两个或多个线程,就可以顺利运行。当其中至少一个写到共享内存中,而其他人正在从中读取时,麻烦就开始了。此时可能出现两个问题:

  数据争用-当编写器线程修改内存时,读线程可能正在从内存中读取数据。如果编写器还没有完成它的工作,读卡器将得到损坏的数据;

  竞态条件-读线程应该只有在写入之后才能读取。如果正好相反呢?比数据争用更微妙的是,争用条件是两个或多个线程以不可预知的顺序执行它们的工作,而实际上,操作应该按照正确的顺序执行。您的程序可以触发一个争用条件,即使它受到数据争用的保护。

  如果一段代码工作正常,即没有数据争用或争用条件,即使许多线程同时执行它,也可以说它是线程安全的。您可能已经注意到一些编程库声明自己是线程安全的:如果您正在编写一个多线程程序,您希望确保任何其他第三方函数可以跨不同的线程使用,而不会触发并发问题。

  我们知道一个CPU内核一次只能执行一条机器指令。这种指令被称为原子指令,因为它是不可分割的:它不能被分解成更小的操作。

  不可分割的属性使得原子操作本质上是线程安全的。当一个线程对共享数据执行原子写入时,没有其他线程可以读取修改的一半。相反,当一个线程对共享数据执行原子读取时,它会读取在某一时刻出现的整个值。线程无法通过原子操作,因此不会发生数据争用。

  坏消息是绝大多数的操作都是非原子的。甚至一些硬件上的x=1这样的简单分配也可能由多个原子机器指令组成,使分配本身成为一个整体而非原子。因此,如果一个线程读取X而另一个线程执行分配,则会触发数据争用。

  抢占式多任务使操作系统能够完全控制线程管理:它可以根据高级调度算法启动、停止和暂停线程。作为程序员,您不能控制执行的时间或顺序。事实上,不能保证这样的简单代码:

  将以该特定顺序启动两个线程。运行这个程序几次,您会注意到它在每次运行时的行为是不同的:有时编写器线程首先启动,有时读卡器启动。如果您的程序需要编写器始终在读者面前运行,那么您肯定会遇到竞争情况。

  这种行为被称为不确定性:结果每次都会改变,你无法预测。调试受竞争条件影响的程序非常烦人,因为您不能总是以可控方式重现问题。

  同步-一种确保一次只有一个线程使用资源的方法。同步是将代码的特定部分标记为“受保护的”,这样两个或多个并发线程就不会同时执行它,从而破坏共享数据;

  原子操作-借助操作系统提供的特殊指令,可以将一组非原子操作(如前面提到的分配)转换为原子操作。这样,无论其他线程如何访问共享数据,共享数据始终保持有效状态;

  不可变数据-共享数据被标记为不可变,没有什么可以更改它:线程只能从中读取,消除了根本原因。正如我们所知,线程可以安全地从相同的内存位置读取,只要它们不修改它。这是函数式编程背后的主要原理。

  什么是进程?所有运行中的程序通常对应一个进程。当一个程序进入内存运行时,就会变成一个进程。进程是出于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的独立单位。进程包含散打特征:...

  接下来我们就要正式讲解在java中怎么执行多线程了。首先我们知道关于java文件在jvm上运行,对象的建立,执行以及最后的回收都有jvm完成。具体的方法是什么呢。我们来打开Object类,发现一个方法...博文来自:

  本工具基础gulp自动化工具构建,可适用于整个前端开发时间线,使用时较简单,在配置完后输入自定义命令即可使用本工具。...博文来自:Franks.T.D

  阅读数 129一.同步和异步同步和异步是任务执行的两种方式1.什么是同步我们之前写程序的时候都是从上到下,代码顺序执行的1个人执行多个任务,也是要依次执行,因为1个人同一时间只能执行1个任务多个任务按序依次执行,就...

  阅读数 402一、进程和线.什么是进程  进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内   比如同时打开QQ、Xcode,系统就会分别启动2个进程 通...

  阅读数 47同步和的区别:(同步和异步是描述一个任务处理的方式)一个线程只做一个任务,在这个任务完成之前不会做其他任务这叫线程同步一个线程做一个任务,在这个任务完成之前也会做其他任务这叫线程异步串行和并发:(串行...

  线程与进程进程是一个活动的程序,一个容器是系统资源管理的最小单位切换代价较高线程是在进程容器中运行,实际工作的代码是程序执行的最小单位切换代价较低(由于线程是在同一块内存中进行切换的)一个NSThre...博文来自:Man_OC的专栏

  一、进程和线.什么是进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内  比如同时打开QQ、Xcode,系统就会分别启动2个进程通过“活动...博文来自:的博客

  多线程概述进程:正在运行的程序线程:程序的执行单元,一条执行路径。多线程就是一个进程中有多个执行路径。多线)创建类继承Thread类2)重写run()方法3)启动线程并执行。注意:使用...博文来自:晓风的博客

  java多线程(简单介绍) 简单介绍线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这...博文来自:weixin_42981419的博客

  iOS开发多线程篇—多线程简单介绍 一、进程和线.什么是进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内  比如同时打开QQ、Xcode...博文来自:luobo140716的专栏

  进程和线程:       一个进程至少有一个线程,同一个进程中的多个线程可以并发执行。所谓的并发只是不停的切换,只是电脑切换的太快了,人我们的大脑感觉到是在并发执行。       线程是程序中的一个执...博文来自:SimilarDuckweed的博客

  一、进程和线.什么是进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内比如同时打开QQ、Xcode,系统就会分别启动2个进程通过“活动监视器...博文来自:kkk8990的博客

  简单介绍GCD能充分利用设备的多核核心概念一、队列:用来存放任务1.并发队列(1).全局并发队列:四种优先级对应的全局并发队列,默认就已经存在了使用dispatch_get_global_queue函...博文来自:weixin_33811539的博客

  目录一、什么是线程二、线程状态三、中断线程四、线程属性说明:这一系列博客内容摘自《Java核心技术卷I》一、什么是线程线程和进程的区别联系,如何实现多线程:博文来自:wyplj2015的博客

  1.JavaJUC简介 
    在Java5.0提供了current(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线...博文来自:wu_amber的博客

  [易燃固体自燃和遇湿易燃品]自然物品.二级自燃物品拷纱[别]香云纱[缩]KS 【化学特性】栗色或元色织物【火灾危险】植物性油脂浸染上纤维后,与空气接触面大,容易氧化发热引起自燃.【处置方法】雾状水、砂...博文来自:

  Examples:框架自带的Demo例子,如果只需要框架的同学,里面的资源可以删除掉。去“疑难解答”里面查看方法。 ---Builds:里面都是一些NGUI定义的图集啊、Prefab等资源。用于生成a...

  1.   引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把...

  前言:数据库的种类很多,Oracle、SqlServer、mySQL、Access等他们个自有自己的特点和应用范围,之前用的比较多的是SqlServer,接触过通过navicat接触过mysql的可视...博文来自:

  多线程程序设计.part101-03侯捷翻译 win32.多线程程序设计下载

  多线程初学该模式是生产者--消费者模式。规定了两个任务内部类,Consumer和Producer.Producer负责给num加1,Consumer负责给num减1。run()方法只是负责任务,不负责...

  09-22阅读数 6万+对于J2EE项目导入导出Excel是最普通和实用功能,本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 请看一下这个类都有哪些功能:   ...

  09-12阅读数 1万+最近正好又用到 DM368 开发板,就将之前做的编解码的项目总结一下。话说一年多没碰,之前做的笔记全忘记是个什么鬼了。还好整理了一下出图像了。不过再看看做的这个东西,真是够渣的,只能作为参考了。项目效...

  06-29阅读数 28万+最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...

  04-16阅读数 78万+概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 单例模式有一下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创建自...

  11-02阅读数 2万+一、组合模式适用场景把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式对部分对象和整体对象进行管理。二、组合模式结构 抽象构件(Conponent)角色:所有类的共有接口,定义了叶子和...

  11-22阅读数 1万+RTree源代码——C语言实现cheungmine一、什么是RTree“R树是B树向多维空间发展的另一种形式,它将空间对象按范围划分,每个结点都对应一个区域和一个磁盘页,非叶结点的磁盘页中存储其所有子...

  02-15阅读数 629这几天开始研究linux下的驱动程序编写了,遇到的问题也挺多的,好在linux是开源的,很多高人编写的技巧和思路都会在他们的源代码中体现,我也在他们的源码中学到了很多好东西,我归纳了下贴出来,希望自己...

  阅读数 2万+本Blog主要介绍Kinect2在Ubuntu下驱动的安装, 并获取Kinect图像以ROS的方式发布到ROS环境中, 最后简要的介绍了一些源码, 以及一些简单的修改...

  11-25阅读数 54万+jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  11-16阅读数 66万+强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  02-27阅读数 8万+自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ...

  03-05阅读数 2万+方法一:步骤:进入pycharm 安装路径下的bin目录下,输入如下命令:./pycharm.sh方法二:设置桌面快捷方式:参考博客:

  授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

  授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周上午根据用户上周的博文发布情况由系统自动颁发。

  授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周上午根据用户上周的博文发布情况由系统自动颁发。

http://attaribros.com/zhengyongtiaojian/103.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有