精华内容
下载资源
问答
  • 顺序编程: 即程序中的所有事物在任意时刻都只能执行一个步骤。在未学习并使用并发编程前,你使用的都是顺序编程。 什么是程序、进程、线程、...进程是系统进行资源分配调度的一个基本单元,每个进程都有自己...

    顺序编程:

    即程序中的所有事物在任意时刻都只能执行一个步骤。在未学习并使用并发编程前,你使用的都是顺序编程。

    什么是程序、进程、线程、并发?

    程序和进程

    程序并不能单独执行(例如需要CPU的调度、寄存器、随机存储存储器RAM等等协助工作),只有将程序加载到内存中,系统为它分配资源后才能执行,这种正在执行的程序叫做进程。进程是系统进行资源分配调度的一个基本单元,每个进程都有自己独立的地址空间。

    1 .程序和进程的区别:

    程序是指令的集合,是进程运行的静态描述文本。
    进程是一个独立的完整的任务。例如:QQ、淘宝、DNF等,这些都是进程。系统会为这些任务分配唯一的端口号以示区分,运行在唯一端口号上的程序就是进程。

    2. 进程的特点

    • 独立性:进程是独立的实体,有自己独有的资源和地址空间。
    • 隔离性:每个进程之间互不打扰。
    • 动态性:拥有自己的声明周期和不同状态。

    为什么会产生线程呢?

    在顺序编程(单线程)模式下,可能发生进程阻塞(该程序控制范围之外的某些条件,例如I/O、抛异常等等,而导致不能继续向前执行),整个程序都将停止下来,直到外部条件发生变化。但是,如果使用并发编程,那么当一个任务阻塞时,程序中的其他任务还可以继续向前执行,事实上,从性能的角度来看,如果没有任务会阻塞,那么在单处理机上使用并发就没有任务意义,还会造成系统资源的浪费。

    线程

    线程是进程的一个实体,也是CPU调度和分配的基本单位,他是比进程更小的能独立运行的基本单位,有时又被称为轻权进程或轻量级进程。相对进程而言,线程是一个更加趋近于执行体的概念。进程在执行过程中拥有独立的内存单元,而线程自己基本上不拥有系统资源,也没有独立的地址空间(它的一切都是依赖于进程给的,是进程组成的基本单元),线程的改变只代表了CPU执行过程的改变,而没有发生进程所拥有的资源的变化。除了CPU之外,计算机内软硬件资源与线程无关,但它可与同属于一个进程的其他线程共享进程的全部资源。
    总结一句话:进程可以划分为多个分离的、独立运行的任务,这些任务就是线程。也可以说,线程就是进程的组成部分,多个线程组成一个进程。

    1. 特点:

    • 没有独立的系统资源,它的系统资源是父进程给它的。
    • 一个线程可以创建和撤销另一个线程。
    • 并发性:线程在执行过程中并发的执行。
    • 在系统调度中:例如时间片轮转法。线程是抢占式执行的。

    2. 好处:

    线程可以使程序从系统调度中抽身出来,即代码不必知道它是运行在具有一个还是多个CPU的机器上。所以,使用线程机制是一种建立透明的、可扩展的程序的方法,如果程序运行的太慢,为机器添加一个CPU就能很容易的加快程序的运行速度。多任务和多线程往往是使用多处理器系统的最合理方式。

    融合起来形成一个便于理解的例子

    例如我们需要通过代码的形式生产一台汽车,这些代码就是程序。生产汽车是一个整体的独立的任务,而这个任务就是进程。生产汽车需要很多小的任务支持它,如需要生产车胎、生产车窗、生产引擎等等。这些小的任务就是线程。大多数操作系统都会轮流的调用线程,但由于CPU的执行较快,可看做这些线程是在并发执行。

    展开全文
  • 前趋图 前趋图(Precedence Graph)是一个有向无循环图,记为DAG(Directed Acyclic Graph) 程序顺序执行 顺序性 封闭性 可再现性 程序并发执行

    前趋图

    前趋图(Precedence Graph)是一个有向无循环图,记为DAG(Directed Acyclic Graph)

    前趋图中必须不存在循环

    程序顺序执行

    顺序性
    这里写图片描述
    封闭性:即程序运行时独占全机资源
    可再现性

    程序并发执行

    间断性
    失去封闭性:是多个程序共享系统中的各种资源
    不可再现性

    展开全文
  • 程序的并发执行

    千次阅读 2018-09-09 21:23:31
    程序的顺序执行 在早期无操作系统及单道批处理系统时,程序都是按照顺序进行执行的。先进入内存的先执行,在执行的过程中不能执行其他的程序。程序中的指令也是按照顺序执行,条指令正在执行时不能开始执行另...

    一、程序的顺序执行

    在早期无操作系统及单道批处理系统时,程序都是按照顺序进行执行的。先进入内存的先执行,在执行的过程中不能执行其他的程序。程序中的指令也是按照顺序执行,一条指令正在执行时不能开始执行另一条指令。所以程序顺序执行有以下几个特点。

    1.1、顺序性

    处理机的操作,严格按照顺序执行,前一操作还没执行完毕,后继操作则不能继续执行。

    1.2、封闭性

    程序是在封闭的环境下运行的。即程序在运行时独占全机资源,各资源的状态只有本程序才能改变。程序一旦开始运行,其结果不受外界的影响。

    1.3、可再现性

    只要程序的环境和初始条件相同,无论程序执行多少次,执行结果相同。例如一个加法运算,无论执行多少次,相加的结果都不会发生改变。

    二、程序的并发执行

    程序的并发执行是指在同一时间间隔内运行多个程序。也就是在一个程序运行结束之前,可以运行其它的程序。对于用户来说,有多个程序在同时向前推进,但是从微观上来看,任意时刻CPU上都只有一个程序在执行。在多道程序系统和分时系统都允许程序并发执行,程序的并发执行有以下几个特点。

    2.1、间断性

    程序在并发执行时,因为要共享资源,但是资源往往都少于正在执行的程序数,所以会存在资源抢占的问题。因而,每个程序在CPU上运行,都是时断时续的。当一个资源被占用时,其他需要该资源的程序不得不暂停,待资源被释放时方可执行。

    2.2、失去封闭性

    程序正在并发执行时,由于它们共享资源或者合作完成同一项任务,系统的状态不再受其中一个程序的控制和改变,所以就失去了封闭性。比如淘宝卖商品,每卖出一件库存都要减去1,而进货又可以对库存进行增加,所以库存已经不是某个程序特有的了。伪代码如下:

    <?php
        //卖出商品
        sentProduct('商品1');
        $stock--;   //库存减一
    
        //进货
        purchase('商品1');
        $stock += 10;   //库存加10
    ?>

    2.3、不可再现性

    因为程序在并发执行时失去了封闭性,所以任何一个程序都有可能对系统的状态进行改变,这也意味着程序执行的结果可能会不相同。例如两个程序同时往一个文件追加内容,在执行数次之后,每个文件所展现出的内容可能各不相同。

    <?php
        //程序a往文件追加1
        for ($i = 0; $i < 5; $i++) {
            file_put_contents('/tmp/test.txt', 1, FILE_APPEND);
        }
    
        //程序b往文件追加2
        for ($i = 0; $i < 5; $i++) {
            file_put_contents('/tmp/test.txt', 2, FILE_APPEND);
        }
    ?>

    同时执行两次的结果:

    1212121212  //结果1
    1122122121  //结果2
    展开全文
  • 顺序编程,里面所有事物都只能按照...并发编程有两个好处,一个是提高应用程序执行速度,一个是对于有些程序,可以提供方便易用模型。但是并发编程也有很多问题,并行任务很容易互相干扰,这就导致很多问题出...

    顺序编程,里面所有的事物都只能按照既定顺序执行一个步骤。在Java编程中,很大一部分内容,都是通过顺序编程来实现的,但是对于有些情景,使用并发编程,效果更好,这样就可以在同一时刻,并发执行应用程序中多个内容,而且还可以通过多处理器来执行。

    bac83629bc88338859de7b48913faac4.png

    并发编程有两个好处,一个是提高应用程序执行速度,一个是对于有些程序,可以提供方便易用的模型。

    但是并发编程也有很多问题,并行任务很容易互相干扰,这就导致很多问题的出现,因此并发在实际运用中,具有不确定性。我们在实际编写代码过程中,往往觉得自己的代码能够正确的工作,但是在实际应用中,在一定的情况下,会出现很多问题。这些问题,往往不是在开发和测试阶段就能发现的,一般都是在客户使用过程中,才发现问题,而且是偶尔发生,个别问题还很难排查。

    说到这里,大家可能觉察到并发编程很危险。其实Java 1.5已经对并发做了很多改善,但是在编译阶段,依然很难排查出并发问题,所以要想编写出好的并发程序,一定要多想,多研究,把各种可能出现的问题都想到,从而做出应对措施,这样才能减少并发问题的出现。

    482e1e782086d02bf3c9c9869cc80f7b.png

    其实并发程序在现在的web程序中,应用的越来越多,比如servlet就具备天生的多线程特性, web服务器一般都是由多个服务器来支持,并发也是为了充分地运用多个处理器。

    Java语言它天生就具备多线程特性,但是在日常工作中,很少能发现并发问题,在实际运用中,市场会发生系统崩溃,导致重要数据丢失,而且在多处理器环境中,这种问题还会更严重。

    并发不止是Java语言的一部分,更是一套全新的概念,要想学好,就得多下功夫。

    b705df0509f7fc455756834e415d31d5.png

    上面我们讲到,如果串行执行程序,速度会很慢,但是如果将程序切分为多个部分,每个部分在各自的处理器上面独自运行,这样速度会大幅提高。现在计算机速度的提升主要靠多核,所以充分利用多核处理器,才能使程序跑的更快。

    一般web服务器都是多处理器,我们可以将用户请求分配到不同的线程中,然后就可以将这些请求转发到多个处理器中去处理。

    一般来说,并发往往是用来提高单处理器性能。但是单处理器上面执行并发的开销要比顺序执行大很多,原因是来回切换任务,增加损耗。顺序执行如果遇到阻塞,就会导致程序无法继续支干线,后面的任务都会停止,如果用并发来做,就可以有效解决这个问题,一个任务阻塞,其他任务照常进行。

    单处理器提高性能主要靠事件驱动编程。因为并发编程最重要的一个特点是它可以创建响应式界面。如果一个程序长期操作,就会忽略用户输入,变为不可响应。但是如果用并发,通过一个单独的线程来专门执行用户输入,这样才能及时响应。

    749653bbe984c630febfe51cf57f28a6.png

    在操作系统中,最常见的并发操作就是使用进程,一般操作系统会周期性进行进程切换,来实现多程序多进程,而且每个进程都是互相隔离的,不会彼此干预。但是Java并发编程会共享内存或者I/O等资源,所以Java多线程重要的是如何协调这些资源,防止出现多个线程同时访问一个资源,这就会造成死锁。

    举个简单例子,我想备份一个文件,我需要在本地硬盘中备份了一份,然后在ftp上备份一份,然后在U盘里面备份一份,但是这几个操作如果按照顺序来执行,速度会很慢,但是我如果并行来执行这三个备份操作,速度会翻倍,而且这三个任务都在自己的地址空间中运行,互相不干扰,所以他们是独立的,不会有什么影响。

    70b4eb11a2a8e4dda1ef745dbe9b91de.png

    顺序编程指的是所有的事物都只能按照既定顺序执行一个步骤。在Java编程中,很大一部分内容,都是通过顺序编程来实现的。但是对于有些情景,使用并发编程,效果更好,这样就可以在同一时刻,并发执行应用程序中多个内容,而且还可以通过多处理器来执行。

    并发编程有两个好处,一个是提高应用程序执行速度,一个是对于有些程序,可以提供方便易用的模型。

    但是并发编程也有很多问题,并行任务很容易互相干扰,这就导致很多问题的出现,因此并发在实际运用中,具有不确定性。我们在实际编写代码过程中,往往觉得自己的代码能够正确的工作,但是在实际应用中,在一定的情况下,会出现很多问题。这些问题,往往不是在开发和测试阶段就能发现的,一般都是在客户使用过程中,才发现问题,而且是偶尔发生,个别问题还很难排查。

    说到这里,大家可能觉察到并发编程很危险。其实Java 1.5已经对并发做了很多改善,但是在编译阶段,依然很难排查出并发问题,所以要想编写出好的并发程序,一定要多想,多研究,把各种可能出现的问题都想到,从而做出应对措施,这样才能减少并发问题的出现。

    其实并发程序在现在的web程序中,应用的越来越多,比如servlet就具备天生的多线程特性, web服务器一般都是由多个服务器来支持,并发也是为了充分地运用多个处理器。

    Java语言它天生就具备多线程特性,但是在日常工作中,很少能发现并发问题,在实际运用中,经常会发生系统崩溃,导致重要数据丢失,而且在多处理器环境中,这种问题还会更严重。

    并发不止是Java语言的一部分,更是一套全新的概念,要想学好,就得多下功夫。

    上面我们讲到,如果串行执行程序,速度会很慢,但是如果将程序切分为多个部分,每个部分在各自的处理器上面独自运行,这样速度会大幅提高。现在计算机速度的提升主要靠多核,所以充分利用多核处理器,才能使程序跑的更快。

    展开全文
  • 顺序编程,里面所有事物都只能按照...并发编程有两个好处,一个是提高应用程序执行速度,一个是对于有些程序,可以提供方便易用模型。但是并发编程也有很多问题,并行任务很容易互相干扰,这就导致很多问题出...
  • 一个计算由若干个操作组成,若这些操作必须按照某种先后次序来执行,以保证操作的结果是正确的,则这类计算过程称为程序的顺序执行过程。...并发程序的特点: 失去程序的封闭性、程序与计算不再一一对应、程序并发...
  • 并发编程有两个好处,一个是提高应用程序执行速度,一个是对于有些程序,可以提供方便易用模型。 但是并发编程也有很多问题,并行任务很容易互相干扰,这就导致很多问题出现,因此并发在实际运用中,具有不确定...
  • 1.6 并发获取多个URL Go最令人感兴趣和新颖的特点是支持并发...下一个程序fetchall和前一个一样获取URL内容,但是它并发获取很多URL内容,于是这个进程使用时间不超过耗时最长时间获取任务,而不是所有获...
  • 程序的顺序执行 在早期无操作系统及单道批处理系统时,程序都是按照顺序进行执行的。先进入内存的先执行,在执行的过程中不能执行其他的程序。程序中的指令也是按照顺序执行,条指令正在执行时不能开始执行另...
  • 1.进程的三大特征: 独立性:拥有自己的独立的地址空间,一个进程不可以直接去访问其他进程的地址空间。 动态性:是一个系统中活动的指令的集合。 并发性:单个进程可以在多个...一个线程必须有属于自己的一个父...
  • 《实战Java高并发程序设计》读书笔记六 ...函数可以作为另外一个函数返回值,也是函数式编程重要特点。 无副作用: 函数副作用是指在函数调用过程中除了给出了返回值以外还修改了其他函数外部状态。...
  • 本节介绍一个常用的并发容器 - ConcurrentHashMap,它是HashMap的并发版本,与HashMap相比,它有如下特点并发安全 直接支持一些原子复合操作 支持高并发、读操作完全并行、写操作支持一定程度并行 ...
  • 线程1 线程简介(1)线程的特点:(2)线程资源1)共享资源2)私有资源2 Linux线程库3 线程创建 - ...下图是一个进程读取数据流程 CPU先获取cache,读指令,访问数据,若cache中无数据,再从内存中加载一批数据。
  •  由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下工作,这是因为这些数据结构不是线程安全的。  4.3.1 并发List  Vector或者CopyOnWriteArrayList是两线程安全的...
  •  SMP是种紧耦合、共享存储系统模型,它的特点是CPU使用共同系统总线,因此可访问共同外设和存储器。   进程与抢占它进程访问共享资源情况类似于SMPCPU.   中断可打断正在
  • 操作系统并发程序执行的特点: 并发和并行作用 并行和并发区别 概念解释 并行性和并发性是既相似又有区别概念。 并行性是指两或多事件在同一时刻发生。 而并发性是指连或多事件在同一时间...
  • 文章目录1.基本概念1.1.进程和线程1.2.并行和并发1.3.多线程的特点2.Java线程创建和...在Java中,每一个启动JVM虚拟机就是一个进程,其中堆、方法区就是线程共享部分,而栈,程序计数器则是线程私有。 1.2.并行
  • 什么是并发

    2012-02-26 16:36:08
    定义:  在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点... 操作系统并发程序执行的特点:  并发环境下,由于程序的封闭性...
  • 函数可以作为另外一个函数返回值,也是函数式编程重要特点。 2)无副作用 函数副作用指是函数在调用过程中,除了给出了返回值外,还修改了函数外部状态。比如,函数在调用过程中,修改了一个全局状态。...
  • 本系列文章经补充和完善,已...本节介绍一个常用的并发容器 - ConcurrentHashMap,它是HashMap的并发版本,与HashMap相比,它有如下特点并发安全 直接支持一些原子复合操作 支持高并发、读操作完全并行、写操...
  • 进程是一个资源的容器,为进程里的所有线程提供共享资源,是对程序的一种静态描述,(例如:可以把一个应用看成是一个进程,PS:部分应用还有一个守护进程),对于单个(与单核不是一个概念)CPU来说,一个时刻只能...
  • 并发

    2013-08-16 15:37:15
    在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 在关系数据库中,允许多个用户同时访问和更改...
  • 指一个程序执行的过程:进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位;也是可并发执行的程序在一个数据集合上的运行过程。 进程是可被跟踪的:可以使用执行指令的序列来进行跟踪...
  • node个特点

    2018-10-28 16:07:54
    node.js是单进程单线程应用程序,但是因为V8引擎提供异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高 node.js基本上所有事件机制都是用设计模式中观察者模式来实现。   1. 单线程  ...
  • Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员欢迎。大多数待遇丰厚Java开发职位都要求开发者精通多线程技术并且有丰富Java程序开发、调试、优化经验,所以线程相关问题在面试中...
  • 1)原子性 原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。...这就是原子性的一个特点,不可被中断。 但是如果不使用int而使用long

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,743
精华内容 697
关键字:

并发程序的一个特点是