精华内容
下载资源
问答
  • 串行和并行的区别

    千次阅读 2017-02-09 09:13:40
    并行串行 分类:默认栏目计算机系统信息交换有两种方式:并行数据传输方式和串行数据传输方式。并行数据传输是以计算机字长,通常是8位、16位、32位为传输单位,一次传送一个字长数据。它适合于外部设备与CPU...
    并行与串行 分类:默认栏目计算机系统的信息交换有两种方式:并行数据传输方式和串行数据传输方式。并行数据传输是以计算机的字长,通常是8位、16位、32位为传输单位,一次传送一个字长的数据。它适合于外部设备与CPU之间近距离信息交换。在相同频率下,并口传输的效率是串口的几倍。
    
    但,随着传输频率的提高,并行传输线中信号线与信号线之间的串扰越加明显,所以这也制约了并行通讯传输频率的提高(达到100MHz已经是很难了)。
    而串行通信则不然,信号线只有一根(或两根),没有串扰(或不明显),所以传输频率可以进一步提高,足够可以将传输速度超过并行通讯。所以说你说的“传输数据并行比串行快”这句话严格来说是不准确的。
    好,所有问题都解决了,串口硬盘的速度为什么比硬盘快呢?因为串口干扰少,随着速度的提高,并口的信号之间相互干扰增加,到一定程度以后并行传输就不能得到正确的数据了。80通道的ATA100的并口硬盘数据线的一半,40根是地线,是用来防止并行信号之间的互相干扰的。
    SATA I的硬盘理论上传输速度可以到150M/s,而IDE 133的是133M/s,但是由于磁盘的机械部分都是一样的读取方式,使得磁盘内部的传输速度几乎没有什么变化。所以整体看速度变化不是特别明显。单块硬盘的速度在40~60M/s之间,双硬盘组成RAID0阵列读写速度可以达到100M/s以上。读写速度上会有明显的增加。
    展开全文
  • 串行运行:[xxx@zjtlcb bin]$ cat view_status_servers_single.pyfrom java.util import *from javax.management import *import javax.management.Attributeimport threadingimport time as systimedef status_...

    串行运行:

    [xxx@zjtlcb bin]$ cat view_status_servers_single.py

    from java.util import *

    from javax.management import *

    import javax.management.Attribute

    import threading

    import time as systime

    def status_server(server):

    try:

    state(server,'Server')

    except Exception:

    print("服务[" + server + "]不可停止")

    if len(sys.argv) != 5:

    print "python sys.argv[0] username passwd url server"

    else:

    username=sys.argv[1]

    passwd=sys.argv[2]

    url=sys.argv[3]

    arr_server=sys.argv[4]

    arr_server=arr_server.split('|')

    print 'starting the script .... '

    connect(username,passwd,url)

    poll = []

    for item in arr_server:

    status_server(item)

    disconnect()

    print 'End of script ...'

    exit()

    [xxx@zjtlcb bin]$ time java  xxx.WLST view_stat

    展开全文
  • 本文转自公众号语言随笔,欢迎关注入门参考:从Go中协程理解串行和并行​mp.weixin.qq.comGo语言设计亮点之一就是原生实现了协程,并优化了协程使用方式。使得用Go来处理高并发问题变得更加简单。今天我们来看...

    c99c7571bd2f85fa06c58ac12008fa19.png

    本文转自公众号语言随笔,欢迎关注

    入门参考:从Go中的协程理解串行和并行mp.weixin.qq.com

    Go语言的设计亮点之一就是原生实现了协程,并优化了协程的使用方式。使得用Go来处理高并发问题变得更加简单。今天我们来看一下Go中的协程。

    从串行到并行

    在处理器还是单个单核的时候,这个时候并不存在并行,因为只有一个处理器。所以那时候的编程都是串行编程。程序执行都是从头顺序执行到尾。到了多处理器多核的时代,为了充分利用处理器的处理能力,开始出现了并发编程。开发者开始在进程中启用多个线程来执行操作,利用CPU的调度能力来最大化程序处理效率。

    并发,并行

    在说到并发编程的时候总会遇到这两个概念,面试的时候也会问道,在这里就简单说一下这两者的区别:

    并发是一种能力,是指多个任务在一段时间内同时发生。 并行值得是多个任务同时发生,就是并行。

    并发值得是并行的能力,并发不一定是同时发生,可能是同一时间段内交替发生。

    进程,线程,协程

    进程和线程是操作系统的基本概念:

    进程:指计算机中已运行的程序,进程是程序的基本执行实体。 线程:是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程的实际运行单位。

    那么协程是在线程之上,更加轻量级的设计。协程因为只工作在用户控件,没有线程上下文切换带来的消耗。协程的调度由用户手动切换,所以更加灵活。

    协程的另一大优势就是因为在用户空间调度,所以不会出现代码执行一半被强制中断,所以无需原子操作锁。

    Go中的协程

    在Go中使用协程非常简单,就使用go关键字就可以了。我们来看一段串行代码使用协程如何进行操作:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main(){
        print1To10()
    }
    
    func print1To10(){
        for i := 1; i<=10; i++{
            fmt.Printf("%d ", i)
        }
    }
    
    // 输出
    // 1 2 3 4 5 6 7 8 9 10
    

    那么使用协程,我们来看一下运行结果:

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main(){
        fmt.Println("before go coroutine")
        go print1To10()
        fmt.Println("after go coroutine")
        time.Sleep(100 * time.Millisecond) //防止主协程直接结束了,打印协程还没来得及执行
    }
    
    func print1To10(){
        for i := 1; i<=10; i++{
            fmt.Printf("%d ", i)
        }
    }
    
    // 输出
    /***********
    before go coroutine
    after go coroutine
    1 2 3 4 5 6 7 8 9 10 
    *************/
    

    我们可以看出使用go关键词后,打印并不是按照顺序串行执行的,而是在主协程执行结束后,打印协程才开始执行。

    Go协程的调度机制

    Go中的协程调度模型是G-P-M模型:

    G代表Goroutine,也就是Go中的协程对象。 P代表Processor,代表虚拟的处理器。一般来说,和逻辑核一一对应。 M代表Machine,实际上是操作系统的线程。

    f3a16c45cd836277eecfe06dd300ea78.png

    这里我们简单说一下Go的调度机制,感兴趣或者有了解的可以自行看Go的源码:

    1. 在Go程序启动时,会给每个逻辑核分配一个P(虚拟处理器)
    2. 同时,Go会创建一个主协程G,来执行程序。新创建的G会被放到LRQ(P上的本地G队列)或者GRQ(全局G队列)。
    3. 给P分配一个M(内核线程),这些M由OS Scheduler调度而非Go Scheduler调度。M用来运行G
    4. P会尽可能获取G来运行,当没有G运行后,会销毁并重新进入调度

    其中第4条 尽可能获取G 则是Go的有趣的设计理念之一,当一个 P 发现自己的 LRQ 已经没有 G 时,会从其他 P “偷” 一些 G 来运行。看看这是什么精神!自己的工作做完了,为了全局的利益,主动为别人分担。这被称为 Work-stealing

    再看串行和并行

    这里我们以Go协程来继续说一下串行和并行,对于习惯于串行编程的程序员来说,理解并行可能稍微需要点时间,对于程序设计来说,并行的设计主要是为了提高程序运行的效率,使得程序能够充分利用多核多处理器的资源(或者多机器)。那么对于如何充分利用,大部分支持并行编程的语言都有其内部的调度机制,即使没有,也会使用系统的调度机制--线程调度。

    那么对于并行调度机制总体上分为两类:协作式和抢占式

    协作式:一个任务得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU ,所以任务之间需要协作使用一段时间的 CPU ,放弃使用,其它的任务也如此,才能保证系统的正常运行。如果有一个任务死锁,则系统也同样死锁。
    抢占式:总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务。如果有一个任务死锁,系统仍能正常运行。

    在 Go1.1 版本中,调度器还不支持抢占式调度,只能依靠 goroutine 主动让出 CPU 资源,存在非常严重的调度问题。

    Go1.12 中编译器在特定时机插入函数,通过函数调用作为入口触发抢占,实现了协作式的抢占式调度。但是这种需要函数调用主动配合的调度方式存在一些边缘情况。

    后面Go在1.14版本实现了基于信号的真抢占式调度。用于解决解决了垃圾回收和栈扫描时存在的问题。

    Go的协程调度目前虽然不能称得上完美,但是对于我们理解并行有一定的帮助。所谓并行编程,就是开启多个任务而不用等待任务结果。可以使得相互独立的任务同时运行,比如文件写入等。

    展开全文
  • java8串行和并行的区别 4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年,对于大多数开发人员来说,还有两件事仍然是个谜:垃圾收集和了解异性。 由于我对后者知之甚少,所以我认为我会对前者大吃一惊,...

    java8串行和并行的区别

    Blog_Trash-1

    4个Java垃圾收集器–错误的选择如何严重影响性能

    在2014年,对于大多数开发人员来说,还有两件事仍然是个谜:垃圾收集和了解异性。 由于我对后者知之甚少,所以我认为我会对前者大吃一惊,尤其是因为在该领域中,Java 8发生了一些重大变化和改进,尤其是去除了PermGen和一些新的和令人兴奋的优化(有关此方面的更多信息,请参见结尾)。

    当我们谈论垃圾收集时,我们绝大多数人都知道这个概念,并将其应用到日常编程中。 即使这样,很多事情我们还是不了解,那时候情况就变得很痛苦。 关于JVM的最大误解之一是它有一个垃圾收集器,实际上它提供了四种不同的垃圾收集器,每种垃圾都有其独特的优缺点。 使用哪种选择不是自动的,而是由您自己决定的,吞吐量和应用程序暂停之间的差异可能会很大。

    这四种垃圾收集算法的共同点是它们是代生成的,这意味着它们使用古老的假设(即堆中的大多数对象是短寿命的,应Swift回收)将托管堆分成不同的段。 由于这也是一个广为人知的领域,因此我将直接介绍不同的算法,以及它们的优缺点。

    1.串行收集器

    串行收集器是最简单的一种,您可能不会使用,因为它主要是为单线程环境(例如32位或Windows)和小型堆而设计的。 该收集器会在工作时冻结所有应用程序线程,这使它在所有目的和用途上都无法在服务器环境中使用。

    使用方法:您可以通过打开-XX:+ UseSerialGC JVM参数来使用它,

    2.并行/吞吐量收集器

    接下来是并行收集器。 这是JVM的默认收集器。 就像它的名字一样,它的最大优点是使用多个线程来扫描并压缩堆。 并行收集器的不利之处在于,在执行次要或完全GC收集时,它将停止应用程序线程。 并行收集器最适合可以容忍应用程序暂停并试图优化以减少由收集器引起的CPU开销的应用程序。

    3. CMS收集器

    紧跟在并行收集器之后的是CMS收集器(“ current-mark-sweep ”)。 该算法使用多个线程(“并发”)在堆(“标记”)中扫描可回收(“清扫”)未使用的对象。 在以下两种情况下,该算法将进入“世界停止”(STW)模式:初始化根的初始标记(从线程入口点或静态变量可以访问的旧代对象),以及应用程序更改状态时在算法同时运行时堆,迫使它返回并进行最后的修改以确保标记了正确的对象。

    使用此收集器时,最大的担忧是升级失败 ,在这种情况下,收集年轻一代和老一代之间出现了种族状况。 如果收集器需要将年轻物体提升给老一代,但又没有足够的时间清理空间,则必须首先这样做,这将导致完整的STW收集-这就是CMS收集器的初衷阻止。 为确保不会发生这种情况,您可以增加旧一代的大小(或为此增加整个堆的大小),或者为收集器分配更多的后台线程,以便他与对象分配率竞争。

    与并行收集器相比,此算法的另一个缺点是,它使用更多的CPU,以便通过使用多个线程来执行扫描和收集,从而为应用程序提供更高级别的连续吞吐量。 对于大多数长时间运行的服务器应用程序而言,这不利于应用程序冻结,这通常是一个不错的选择。 即使这样, 默认情况下不会启用该算法。 您必须指定XX:+ USeParNewGC才能真正启用它。 如果您愿意分配更多的CPU资源以避免应用程序暂停,那么这可能是您可能要使用的收集器,假设您的堆大小小于4Gb。 但是,如果大于4GB,则可能要使用最后一种算法-G1收集器。

    4. G1收藏家

    JDK 7更新4中引入的Garbage first收集器(G1)旨在更好地支持大于4GB的堆。 G1收集器利用多个后台线程来扫描它划分成区域的堆,范围从1MB到32MB(取决于堆的大小)。 G1收集器旨在首先扫描那些包含最多垃圾对象的区域,并为其命名(垃圾优先)。 使用–XX:+ UseG1GC标志打开此收集器。

    这种策略有可能在后台线程完成对未使用对象的扫描之前耗尽堆,在这种情况下,收集器将不得不停止应用程序,这将导致STW收集。 G1还具有另一个优点,即它可以在移动过程中压缩堆,这是CMS收集器仅在完整STW收集期间执行的操作。

    在过去的几年中,大堆一直是一个有争议的领域,许多开发人员从每台机器模型的单个JVM转移到每台机器具有多个JVM的更多微服务,组件化体系结构。 这是由许多因素驱动的,包括希望隔离不同的应用程序部分,简化部署并避免通常将应用程序类重新加载到内存中所带来的成本(在Java 8中实际上已得到改进)。

    即便如此,涉及到JVM的最大驱动程序之一还是希望避免大堆发生的长时间“停止世界”暂停(在大型集合中可能要花费几秒钟)。 诸如Docker之类的容器技术也加快了这一步,使您能够相对轻松地在同一台物理计算机上部署多个应用程序。

    Java 8和G1收集器

    Java 8 update 20刚刚推出的另一个漂亮的优化是G1收集器字符串重复数据删除 由于字符串(及其内部char []数组)占用了我们的大部分堆内存,因此进行了新的优化,使G1收集器可以识别在整个堆中重复多次的字符串,并更正它们以指向同一内部char []数组,以避免同一字符串的多个副本无效地驻留在堆中。 您可以使用-XX:+ UseStringDeduplication JVM参数来进行尝试。

    Java 8和PermGen

    Java 8中最大的更改之一是删除了堆中的permgen部分,该部分传统上分配给类元数据,内部字符串和静态变量。 传统上,这将要求开发人员使用的应用程序会加载大量的类(对于使用企业容器的应用程序很常见),以专门针对堆的这一部分进行优化和调整。 多年来,它已成为许多OutOfMemory异常的来源,因此(如果是非常不错的)添加JVM(主要是)要多加注意。 即使这样,它本身也可能不会减少开发人员将其应用程序分离到多个JVM中的浪潮。

    这些收集器中的每一个都通过一系列的拨动开关进行不同的配置和调整,每一个都有可能增加或减少吞吐量,所有这些都取决于应用程序的特定行为。 在下一篇文章中,我们将研究配置这些策略的关键策略。

    同时,您最想了解关于不同收藏家之间差异的哪些事情? 在评论部分打我!

    补充阅读

    1. InfoQ上对G1收集器进行了非常深入的深入审查。
    2. Java性能–权威指南。 我最喜欢的Java性能
    3. 有关CodeCentric 博客上有关字符串重复数据删除的更多信息。

    翻译自: https://www.javacodegeeks.com/2014/09/garbage-collectors-serial-vs-parallel-vs-cms-vs-g1-and-whats-new-in-java-8.html

    java8串行和并行的区别

    展开全文
  • *我们来说说Stream的并行和串行。Stream中有两个函数parallel()sequential(),分别代表了并行和串行串行比较好理解,就是在主线程上按顺序执行逻辑代码,那么并行呢?那么我们要来说说什么是并行和并发,以前...
  • 引言程序运行方式可以分为三种:串行(Sequential)、并行(Parallel)、并发(Concurrent)。串行是最一般情况,程序会按顺序执行每个任务,效率往往十分低下。与之相对并行,多个任务会同时运行在不同cpu线程...
  • 20世纪60年代初期, 由于晶体管以及...现代计算机发展历程可以分为2个时代:串行计算时代和并行计算时代。并行计算是在串行计算基础上发展起来。并行计算将一项大规模计算任务交由一组相同处理单元共同完...
  • 【历史背景】 岁月更迭中我已经从事MySQL-...”,关于“历史进程”在此不表,关于“自我奋斗”这里也只想谈一下 并行复制几个关键时间结点 总来说MySQL关于并行复制到目前为止经历过三个比较关键时间结点...
  • 由于处理器核心增长及较低硬件成本允许低成本集群系统,致使如今并行编程无处不在,并行编程似乎是下一个大事件。Java 8 针对这一事实提供了新 stream API 及简化了创建并行集合和数组代码。让我们看一下...
  • 串行和并行垃圾收集器之间主要区别在于并行垃圾收集器使用多线程去加快垃圾收集速度。使用命令行选项-XX:+UseParallelGC启用并行垃圾收集器。默认情况下,使用该选项,minor和major垃圾收集都并行运行,以进一步...
  • 并行流与串行并行流就是把一个内容分成多个数据块,并用不同线程分别处理每个数据块流。Java 8 中将并行进行了优化,我们可以很容易对数据进行并行操作。Stream API 可以声明性地通过parallel() 与...
  • 很多网友第一次听到这个词的时候一脸茫然,不清楚这两个的区别,那么今天小编来告诉大家这两个之间的区别吧!为了便于大家理解,有朋友这样介绍串并口硬盘的区别:通俗的说,串口形容一下就是一条车道,而并口就是有8...
  • “用简单语言,讲复杂强度问题~”01—什么是并行计算?工程数值模拟中会使用软件SMP或者MPP并行计算版本,比如...与并行计算相对应则是串行计算,指是按照解决问题步骤顺次执行,所有指令均在一个处理...
  • 串行总线和并行总线接口在高速串行总线流行起来之前,芯片之间互联通过系统同步或者源同步并行接口传输数据,而所谓并行接口,是指通信中一个或几个字节(8位)数据是在n*8条并行传输线上同时由源端传到目的地,...
  • Stream API可以声明性地通过parallel()sequential()在并行顺序流之间进行切换。在了解并行流之前,我们首先需要了解Fork/Join框架Fork/Join框架Fork/Join框架:在必要情况下,将一个大任务进行拆分(fork...
  • 为什么要构建并行系统我们暂时将计算机处理单元称之为“核”,想要提升一个“核”运算速度,最基本方式就是增加集成电路晶体管密度,但是这样在增加运算速度同时也增加了热量散失,并且在当今时代用空气...
  • 学过网页制作人一看到ASP,就会想到ASP JS PHP之类东西,电子行业所用简称有的和其它行业一样,但是意思完全不一样。电子行业中ASP VSP XSP经常用于表示编解码相关的串行接口,如下:VSP:VOICE SERIAL PORT...
  • 1、Java8中forkjoin框架使用更加简单了1.7中ForkJoin框架编码复杂且容易出错,而8中编码则十分简单JDK1.7时开发者需要自定义计算类,如package com.atguigu.java8;import java.util.concurrent.RecursiveTask;...
  • 下面主要介绍下mysql异步复制,半同步复制和并行复制。异步复制异步复制是mysql自带最原始复制方式,主库和备库成功建立起复制关系后,在备库上会有一个IO线程去主库拉取binlog,并将binlog写到本地,就是下图...
  • 作者 | 仿真小助手首发 | 仿真秀公众号(ID:fangzhenxiu2018)Fluent中用户自定义函数(user defined function)UDF功能是非常强大灵活技术,它可以帮助流体工程师实现很多标准界面之外功能;而且,用户还可以依托...
  • 32位64位系统32 位程序因为虚拟内存地址只有 32 位,理论上最多只能使用约 4GB内存(232次方),而 64 位程序虚拟内存地址有 64 位,实际可用 48 位,这就允许程序理论上最多使用 256TB 内存。这也就意味着,...
  • 而在Java8中,对于并行和串行流同样做了大量优化。对于并行和串行知识,也是在面试过程中,经常被问到知识点。当然,我们不能只是为了应付面试来学习这些知识,更重要是将这些知识运用到实际工作中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 689
精华内容 275
关键字:

串行和并行的区别