精华内容
下载资源
问答
  • 2015-07-18 19:22:00

    多道程序设计技术是在计算机主存中同时存放几道相互独立的程序,它们在操作系统控制之下,相互穿插的运行。

     

    多道程序运行的特征:

      1、多道:计算机主存中同时存放几道相互独立的程序。

      2、宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们都开始运行,但都未运行完毕。

      3、微观上串行:从微观上看,主存中的多道程序轮流或分时地占有处理机,交替运行。

    转载于:https://www.cnblogs.com/luo841997665/p/4657409.html

    更多相关内容
  • 下面从程序的顺序执行、程序的执行环境和程序并发执行几方面介绍多道程序设计模型。 一、程序的顺序执行 程序是一个在时间上按严格次序前后相继的操作序列,这些操作是机器指令或高级语言编写的语句。人们习惯的...

    采用多道程序设计可以提高处理器的利用率。多道程序设计技术充分发挥了处理器与外围设备以及外围设备之间的并行工作能力,从而提高处理器和其他各种资源的利用率。下面从程序的顺序执行、程序的执行环境和程序的并发执行几方面介绍多道程序设计模型。

    一、程序的顺序执行

    程序是一个在时间上按严格次序前后相继的操作序列,这些操作是机器指令或高级语言编写的语句。人们习惯的传统程序设计方法是顺序程序设计,计算机也是以顺序方式工作的:处理器一次执行一条指令,对内存一次访问一个字节或字,对处部设备一次传送一个数据块。顺序处理也是人们习惯的思考方法,为了解决一个复杂的问题,人们把它分解成一些较为简单、易于分析的小问题,然后逐个解决。也可以把一个复杂的程序划分为若干个程序段,然后按照某种次序逐个执行这些程序段。

    我们把一个具有独立功能的程序独占处理器直到得到最终结果的过程称为程序的顺序执行。程序的顺序执行具有如下特点。

    1.顺序性

    程序所规定的动作在机器上严格地按顺序执行。每个动作的执行都以前一个动作的结束为前提条件,即程序和机器执行它的活动严格一一对应。

    2.封闭性

    程序运行后,其计算结果只取决于程序自身,程序执行得到的最终结果由给定的初始条件决定,不受外界因素的影响。程序所使用的资源(包括处理器、内存、文件等)是专有的,这些资源的状态(除了初始状态外)只有程序本身的动作才能改变。

    3.程序执行结果的确定性

    也称为程序执行结果与时间无关性。程序执行的结果与它的执行速度无关,即处理器在执行程序时,任意两个动作之间的停顿对程序的计算结果都不会产生影响。

    4.程序执行结果的可再现性

    如果程序在不同的时间执行,只要输入的初始条件相同,则无论何时重复执行该程序都会得到相同的结果。

    程序的顺序性和封闭性是一切顺序程序所应具有的特性,从这两个特性出发,不难引出程序执行时所具有的另外两个特性。顺序程序与时间无关的特性,可使程序的编制者不必去关心不属于他控制的那些细节(如操作系统的调度算法和外部设备操作的精确时间等);顺序程序执行结果的可再现性,则对程序检测和校正程序的错误带来了方便。

    二、程序的并发执行

    所谓程序并发执行,是指两个或两个以上程序在计算机系统中,同时处于已开始执行且尚未结束的状态。能够参与并发执行的程序称为并发程序。程序的并发执行,可以充分利用系统的资源,提高计算机的处理能力。但是,程序的并发执行产生了一些和程序顺序执行时不同的特性。程序的并发执行有如下特征。

    1.在执行期间并发程序相互制约

    资源的共享和竞争存在于多道程序的并发执行中,从而制约了各道程序的执行速度。由于本来并无逻辑关系的程序之间产生了相互制约的关系,而各个程序活动的工作状态与所处环境有密切关系,使并发程序的执行出现了“执行——暂停——执行”的活动现象。

    2.程序与计算不再一一对应

    在并发执行中,允许多个用户进程调用一个共享程序段,从而形成了多个“计算”。如在分时系统中,一个编译程序往往同时为几个用户提供编译服务,该编译程序便对应了几个“计算”。

    3.并发程序的执行结果不可再现

    并发程序执行结果与其执行的相对速度以及并发执行的多道程序之间的相互关系有关,导致并发程序的执行结果不可再现,即执行结果是不确定的。

    4.程序的并行执行与程序的并发执行

    多道程序的并发执行是指它们在宏观上,即在某一段时间周期内是同时进行的(这个时间周期,比处理器的指令处理周期要长得多,但是从操作人员的感觉来看,仍然时一个瞬间)。但从微观上看,除了多处理器系统外,在单处理器系统中,这些程序仍然是顺序执行的。

    程序的并行执行与程序的并发执行,这两者存在着差别。前者是指不论从宏观的时间周期上看,还是从微观上看,若干程序确实在同时运行;而程序的并发执行,如果在单处理器系统中,它们在宏观上是同时进行的,但在微观上,这些程序仍然是顺序执行的

    展开全文
  • 程序和进程 程序:是指编译好的二进制文件,存放在磁盘上,并不占用系统资源(系统资源包括CPU、内存、打开的文件、设备、锁…) 进程:是一个抽象的概念,与操作系统原理密切相关。进程是活跃的程序,占用系统资源...

    程序和进程

    • 程序:是指编译好的二进制文件,存放在磁盘上,并不占用系统资源(系统资源包括CPU、内存、打开的文件、设备、锁…)
    • 进程:是一个抽象的概念,与操作系统原理密切相关。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来之后,产生一个进程)。
    • 那么我们可以形象的将程序比作一个剧本,这个剧本就是一张一张的纸组成的,那么就是进程就要演的戏,一出戏上面包括舞台、演员、灯光、道具等等。同一个剧本可以在多个舞台上同时上演,同样的,同一个程序也可以加载为不同的进程(而且彼此之间互不影响)。
    • 举个例子,在linux终端上同时打开两个终端。他们各自都有一个bash但是彼此的ID却是不同的。

    二:并发的认识

    • 并发:在操作系统中,一个时间段中有多个进程都处于已经启动运行—到-----运行完毕之间的状态。但是呢,任一时刻点上CPU上只有一个进程在运行。
    • 举个例子,现在,我们使用计算机可以边听音乐边聊天边上网。那么我用自己的话来说,意思就是说CPU先运算音乐进程几纳秒,然后停下来在运算聊天几微秒,然后在停下来再运算上网几微秒,由于速度很快,我们肉眼几乎发现不了进程在切换着运行。

    单道程序设计

    • 所有进程一个一个排对执行。若A阻塞,B只能等待,即使CPU处于空闲状态。而在人机交互时阻塞的出现时必然的。所有这种模型在系统资源利用上极其不合理,在计算机发展历史上存在不久,大部分便被淘汰了。像以前的Dos就是单道程序设计系统。

    多道程序设计

    • 在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之下,相互穿插的运行。多道程序设计必须有硬件基础作为保证。
    • 时钟中断即为多道程序设计模型的理论基础。 并发时,任意进程在执行期间都不希望放弃cpu。因此系统需要一种强制让进程让出cpu资源的手段。时钟中断有硬件基础作为保障,对进程而言不可抗拒。 操作系统中的中断处理函数,来负责调度程序执行。
    • 在多道程序设计模型中,多个进程轮流使用CPU (分时复用CPU资源)。而当下常见CPU为纳秒级,1秒可以执行大约10亿条指令。由于人眼的反应速度是毫秒级,所以看似同时在运行。
    • 实质上,并发是宏观并行,微观串行!

    CPU

    • 中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。中央处理器主要包括运算器(算术逻辑运算单元,ALU,ArithmeTIc Logic Unit)和高速缓冲存储器(Cache)及实现它们之间联系的数据(Data)、控制及状态的总线(Bus)。它与内部存储器(Memory)和输入/输出(I/O)设备合称为电子计算机三大核心部件。
    • cpu的基本结构
        从功能上看,一般CPU的内部结构可分为:控制单元、逻辑运算单元、存储单元(包括内部总线和缓冲器)三大部分。其中控制单元完成数据处理整个过程中的调配工作,逻辑单元则完成各个指令以便得到程序最终想要的结果,存储单元就负责存储原始数据以及运算结果。浑然一体的配合使得CPU拥有了强大的功能,可以完成包括浮点、多媒体等指令在内的众多复杂运算,也为数字时代加入了更多的活力。
    1. 逻辑部件

    英文Logic components;运算逻辑部件。可以执行定点或浮点算术运算操作、移位操作以及逻辑操作,也可执行地址运算和转换。

    1. 寄存器

    寄存器部件,包括寄存器、专用寄存器和控制寄存器。 通用寄存器又可分定点数和浮点数两类,它们用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果。 通用寄存器是中央处理器的重要部件之一。

    1. 控制部件

    英文Control unit;控制部件,主要是负责对指令译码,并且发出为完成每条指令所要执行的各个操作的控制信号。

    其结构有两种:一种是以微存储为核心的微程序控制方式;一种是以逻辑硬布线结构为主的控制方式。

    微存储中保持微码,每一个微码对应于一个最基本的微操作,又称微指令;各条指令是由不同序列的微码组成,这种微码序列构成微程序。中央处理器在对指令译码以后,即发出一定时序的控制信号,按给定序列的顺序以微周期为节拍执行由这些微码确定的若干个微操作,即可完成某条指令的执行。

    简单指令是由(3~5)个微操作组成,复杂指令则要由几十个微操作甚至几百个微操作组成。

    CPU的逻辑单元
    • 更细一点,从实现的功能方面看,CPU大致可分为如下八个逻辑单元:

    1. 指令高速缓存,俗称指令寄存器 : 它是芯片上的指令仓库,有了它CPU就不必停下来查找计算机内存中的指令,从而大幅提高了CPU的运算速度。

    2. 译码单元,俗称指令译码器 : 它负责将复杂的机器语言指令解译成运算逻辑单元(ALU)和寄存器能够理解的简单格式,就像一位外交官。

    3. 控制单元 : 既然指令可以存入CPU,而且有相应指令来完成运算前的准备工作,背后自然有一个扮演推动作用的角色——它便是负责整个处理过程的操作控制器。根据来自译码单元的指令,它会生成控制信号,告诉运算逻辑单元(ALU)和寄存器如何运算、对什么进行运算以及对结果进行怎样的处理。

    4. 寄存器 : 它对于CPU来说非常的重要,除了存放程序的部分指令,它还负责存储指针跳转信息以及循环操作命令,是运算逻辑单元(ALU)为完成控制单元请求的任务所使用的数据的小型存储区域,其数据来源可以是高速缓存、内存、控制单元中的任何一个。

    5. 逻辑运算单元(ALU) : 它是CPU芯片的智能部件,能够执行加、减、乘、除等各种命令。此外,它还知道如何读取逻辑命令,如或、与、非。来自控制单元的讯息将告诉运算逻辑单元应该做些什么,然后运算单元会从寄存器中间断或连续提取数据,完成最终的任务。

    6. 预取单元 : CPU效能发挥对其依赖非常明显,预取命中率的高低直接关系到CPU核心利用率的高低,进而带来指令执行速度上的不同。根据命令或要执行任务所提出的要求,何时时候,预取单元都有可能从指令高速缓存或计算机内存中获取数据和指令。当指令到达时,预取单元最重要的任务就是确保所有指令均排列正确,然后发送给译码单元。

    7. 总线单元 : 它就像一条高速公路,快速完成各个单元间的数据交换,也是数据从内存流进和流出CPU的地方。

    8. 数据高速缓存 : 存储来自译码单元专门标记的数据,以备逻辑运算单元使用,同时还准备了分配到计算机不同部分的最终结果。

    • 通过以上介绍可以看出CPU虽小,方寸之地却能容纳大世界,内部更像一个发达的装配工厂,环环相扣,层层相套。正因为有了相互间的协作配合,才使得指令最终得以执行,才构成了图文并茂、影像结合的神奇数字世界。
    cpu的工作原理:
    • 我们都知道CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列。CPU从逻辑上可以划分成3个模块,分别是控制单元、运算单元和存储单元,这三部分由CPU内部总线连接起来。如下所示:
      在这里插入图片描述

      • 控制单元:控制单元是整个CPU的指挥控制中心,由指令寄存IR(InstrucTIon Register)、指令译码器ID(InstrucTIon Decoder)和操作控制器OC(OperaTIon Controller)等,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。

      • 运算单元:是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。

    • 存储单元:包括CPU片内缓存和寄存器组,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。采用寄存器,可以减少CPU访问内存的次数,从而提高了CPU的工作速度。但因为受到芯片面积和集成度所限,寄存器组的容量不可能很大。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据。而通用寄存器用途广泛并可由程序员规定其用途,通用寄存器的数目因微处理器而异。这个是我们以后要介绍这个重点,这里先提一下。

    • 我们将上图细化一下,可以得出CPU的工作原理概括如下:
      在这里插入图片描述

    • 总结一下,CPU的运行原理就是:
        1. 取指令:CPU的控制器从内存读取一条指令并放入指令寄存器。指令的格式一般是这个样子滴:
      在这里插入图片描述

    操作码就是汇编语言里的mov,add,jmp等符号码;操作数地址说明该指令需要的操作数所在的地方,是在内存里还是在CPU的内部寄存器里。

    1. 指令译码:指令寄存器中的指令经过译码,决定该指令应进行何种操作(就是指令里的操作码)、操作数在哪里(操作数的地址)。

    2. 执行指令,分两个阶段“取操作数”和“进行运算”。

    3. 修改指令计数器,决定下一条指令的地址。
      在这里插入图片描述
      在这里插入图片描述

    • 如上图所示,存储介质中,从上到小,内存越来越大,价格越来越便宜,但是传输速率越来越慢。因此将他们搭配起来使用是最好的。
    • 假如数据在硬盘上放着,当我们执行某个程序的时候,从硬盘中先拿到内存中,在拿到cache缓存器中,然后由预取器预取指令,再交给译码器进行译码,译码器再交给ALU算术逻辑单元执行运算,然后,将运算好的数据交给寄存器,由寄存器交给内存,再由内存交给硬盘。

    MMU(内存管理单元)

    在这里插入图片描述

    • 我就简答的说一下关于MMU,MMU就是为了完成物理内存和虚拟内存之间的映射,还有修改内存的访问级别。
    • 在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写。而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到内存管理单元——MMU(主角终于出现了)。他由一个或一组芯片组成,一般存在与协处理器中,其功能是把虚拟地址映射为物理地址。
    MMU工作过程
    • 大多数使用虚拟存储器的系统都使用一种称为分页(paging)。虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。接下来配合图片我以一个例子说明页与页框之间在MMU的调度下是如何进行映射的:
      在这里插入图片描述

    • 在这个例子中我们有一台可以生成16位地址的机器,它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,因此他可以运行64K的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放64K程序的外部存储器(例如磁盘或是FLASH)以保证程序片段在需要时可以被调用。在这个例子中,页的大小为4K,页框大小与页相同(这点是必须保证的,内存和外围存储器之间的传输总是以页为单位的),对应64K的虚拟地址和32K的物理存储器,他们分别包含了16个页和8个页框。

    • 关于MMU,我后面再来介绍。

    展开全文
  • Windows下基于socket线程并发通信的实现

    千次下载 热门讨论 2015-04-07 15:06:06
    Socket 接口是TCP/IP 网络最为通用的应用接口,也是在Internet 上进行网络程序应用开发最通用的API[1],本文介绍了Socket通信的基本机制以及采用线程技术实现并发通信的基本原理,并给出实例。
  • 在实际工作中,错误使用线程非但不能提高效率还可能使程序崩溃。以在路上开车为例: 在一个单向行驶的道路上,每辆汽车都遵守交通规则,这时候整体通行是正常的。『单向车道』意味着『一个线程』,『辆车』意味...

    目录

    线程安全问题

    活跃性问题

    性能问题

    有态度的总结

     

    头发很多的程序员:『师父,这个批量处理接口太慢了,有什么办法可以优化?』
    
    架构师:『试试使用多线程优化』
    
    第二天
    
    头发很多的程序员:『师父,我已经使用了多线程,为什么接口还变慢了?』
    
    架构师:『去给我买杯咖啡,我写篇文章告诉你』
    
    ……吭哧吭哧买咖啡去了
    

    在实际工作中,错误使用多线程非但不能提高效率还可能使程序崩溃。以在路上开车为例:

    在一个单向行驶的道路上,每辆汽车都遵守交通规则,这时候整体通行是正常的。『单向车道』意味着『一个线程』,『多辆车』意味着『多个job任务』。

    单线程顺利同行

    单线程顺利同行

    如果需要提升车辆的同行效率,一般的做法就是扩展车道,对应程序来说就是『加线程池』,增加线程数。这样在同一时间内,通行的车辆数远远大于单车道。

    多线程顺利同行

    多线程顺利同行

    然而成年人的世界没有那么完美,车道一旦多起来『加塞』的场景就会越来越多,出现碰撞后也会影响整条马路的通行效率。这么一对比下来『多车道』确实可能比『单车道』要慢。

    多线程故障

    多线程故障

    防止汽车频繁变道加塞可以采取在车道间增加『护栏』,那在程序的世界该怎么做呢?

    程序世界中多线程遇到的问题归纳起来就是三类:『线程安全问题』『活跃性问题』『性能问题』,接下来会讲解这些问题,以及问题对应的解决手段。

    线程安全问题

    有时候我们会发现,明明在单线程环境中正常运行的代码,在多线程环境中可能会出现意料之外的结果,其实这就是大家常说的『线程不安全』。那到底什么是线程不安全呢?往下看。

    原子性

    举一个银行转账的例子,比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元,两个操作都成功才意味着一次转账最终成功。

    试想一下,如果这两个操作不具备原子性,从A的账户扣减了1000元之后,操作突然终止了,账户B没有增加1000元,那问题就大了。

    银行转账这个例子有两个步骤,出现了意外后导致转账失败,说明没有原子性。

    原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

    原子操作:即不会被线程调度机制打断的操作,没有上下文切换。

    在并发编程中很多操作都不是原子操作,出个小题目:

    i = 0; // 操作1
    i++;   // 操作2
    i = j; // 操作3
    i = i + 1; // 操作4
    

    上面这四个操作中有哪些是原子操作,哪些不是的?不熟悉的人可能认为这些都是原子操作,其实只有操作1是原子操作。

    • 操作1:对基本数据类型变量的赋值是原子操作;

    • 操作2:包含三个操作,读取i的值,将i加1,将值赋给i;

    • 操作3:读取j的值,将j的值赋给i;

    • 操作4:包含三个操作,读取i的值,将i加1,将值赋给i;

    在单线程环境下上述四个操作都不会出现问题,但是在多线程环境下,如果不通过加锁操作,往往可能得到意料之外的值。

    在Java语言中通过可以使用synchronize或者lock来保证原子性。

    可见性

    talk is cheap,先show一段代码:

    /**
    * Author: leixiaoshuai
    */
    class Test {
      int i = 50;
      int j = 0;
      
      public void update() {
        // 线程1执行
        i = 100;
      }
      
      public int get() {
        // 线程2执行
        j = i;
        return j;
      }
    }
    

    线程1执行update方法将 i 赋值为100,一般情况下线程1会在自己的工作内存中完成赋值操作,却没有及时将新值刷新到主内存中。

    这个时候线程2执行get方法,首先会从主内存中读取i的值,然后加载到自己的工作内存中,这个时候读取到i的值是50,再将50赋值给j,最后返回j的值就是50了。原本期望返回100,结果返回50,这就是可见性问题,线程1对变量i进行了修改,线程2没有立即看到i的新值。

    可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    如上图每个线程都有属于自己的工作内存,工作内存和主内存间需要通过store和load等进行交互。

    为了解决多线程可见性问题,Java语言提供了volatile这个关键字。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通共享变量不能保证可见性,因为变量被修改后什么时候刷回到主存是不确定的,另外一个线程读的可能就是旧值。

    当然Java的锁机制如synchronize和lock也是可以保证可见性的,加锁可以保证在同一时刻只有一个线程在执行同步代码块,释放锁之前会将变量刷回至主存,这样也就保证了可见性。

    关于线程不安全的表现还有『有序性』,这个问题会在后面的文章中深入讲解。

    活跃性问题

    上面讲到为了解决可见性问题,我们可以采取加锁方式解决,但是如果加锁使用不当也容易引入其他问题,比如『死锁』。

    在说『死锁』前我们先引入另外一个概念:活跃性问题

    活跃性是指某件正确的事情最终会发生,当某个操作无法继续下去的时候,就会发生活跃性问题。

    概念是不是有点拗口,如果看不懂也没关系,你可以记住活跃性问题一般有这样几类:死锁活锁饥饿问题

    (1)死锁

    死锁是指多个线程因为环形的等待锁的关系而永远的阻塞下去。一图胜千语,不多解释。

    (2)活锁

    死锁是两个线程都在等待对方释放锁导致阻塞。而活锁的意思是线程没有阻塞,还活着呢。

    当多个线程都在运行并且修改各自的状态,而其他线程彼此依赖这个状态,导致任何一个线程都无法继续执行,只能重复着自身的动作和修改自身的状态,这种场景就是发生了活锁。

    ![](/Users/ray/Library/Application Support/typora-user-images/image-20210408232019843.png)

    如果大家还有疑惑,那我再举一个生活中的例子,大家平时在走路的时候,迎面走来一个人,两个人互相让路,但是又同时走到了一个方向,如果一直这样重复着避让,这俩人就是发生了活锁,学到了吧,嘿嘿。

    (3)饥饿

    如果一个线程无其他异常却迟迟不能继续运行,那基本是处于饥饿状态了。

    常见有几种场景:

    • 高优先级的线程一直在运行消耗CPU,所有的低优先级线程一直处于等待;

    • 一些线程被永久堵塞在一个等待进入同步块的状态,而其他线程总是能在它之前持续地对该同步块进行访问;

    有一个非常经典的饥饿问题就是哲学家用餐问题,如下图所示,有五个哲学家在用餐,每个人必须要同时拿两把叉子才可以开始就餐,如果哲学家1和哲学家3同时开始就餐,那哲学家2、4、5就得饿肚子等待了。

    性能问题

    前面讲到了线程安全和死锁、活锁这些问题会影响多线程执行过程,如果这些都没有发生,多线程并发一定比单线程串行执行快吗,答案是不一定,因为多线程有创建线程线程上下文切换的开销。

    创建线程是直接向系统申请资源的,对操作系统来说创建一个线程的代价是十分昂贵的,需要给它分配内存、列入调度等。

    线程创建完之后,还会遇到线程上下文切换

    CPU是很宝贵的资源速度也非常快,为了保证雨露均沾,通常为给不同的线程分配时间片,当CPU从执行一个线程切换到执行另一个线程时,CPU 需要保存当前线程的本地数据,程序指针等状态,并加载下一个要执行的线程的本地数据,程序指针等,这个开关被称为『上下文切换』。

    一般减少上下文切换的方法有:无锁并发编程CAS 算法使用协程等。

    有态度的总结

    多线程用好了可以让程序的效率成倍提升,用不好可能比单线程还要慢。

    用一张图总结一下上面讲的:

    image-20210412234350204

     

    文章讲了多线程并发会遇到的问题,你可能也发现了,文章中并没有给出具体的解决方案,因为这些问题在Java语言设计过程中大神都已经为你考虑过了。

    Java并发编程学起来有一定难度,但这也是从初级程序员迈向中高级程序员的必经道路,接下来的文章会带领大家逐个击破!

     

    不如顺手点个赞?!

    作者:雷架

    Github 开源项目:https://github.com/smileArchitect/JavaMap

    作者简介:
    ☕读过几年书:华中科技大学硕士毕业;
    😂浪过几个大厂:华为、网易、百度……
    😘一直坚信技术能改变世界,愿保持初心,加油技术人!

    微信搜索公众号【爱笑的架构师】,关注这个对技术有追求且有趣的打工人。

    展开全文
  • 操作系统的基本特征有四个即:并发性、共享性、虚拟性、异步性
  • 共享和并发是操作系统的两个最基本特征,虚拟以并发和共享为前提,异步是并发和共享的必然结果。 目录 现代计算机操作系统的四大基本特性(并发/共享/虚拟/异步) 1、并发性 1.1、并发与并行区别 2、共享...
  • 线程与高并发基本概念

    万次阅读 2018-07-26 23:27:52
    1.同步(Synchronous)与异步(Asynchronous) 同步和异步通常形容一次方法的调用。同步方法调用开始后调用者必须等到方法调用返回才能进行后续行为。... 并发和并行都能表示两个或个任务一起执...
  • 线程&并发-实例与解决方案

    千次阅读 2020-06-23 11:27:24
    一般业务,web层–> service层 -->dao --> sql基本用不到线程 数据量很大(1000w级别、TB级别)的I/O操作,可以考虑线程 举一些例子 自己做并发测试的时候,假如想写想模拟3000个并发请求。 线程下单抢单,...
  • EBS 并发程序配置

    千次阅读 2017-01-17 11:52:32
    本文档描述了EBS系统中的并发程序(即请求)和可执行程序的配置步骤,简要的介绍了如何配置一个简单的并发程序的过程。 一般的并发程序配置主要包含以下几个方面: 可执行(非必须)、并发程序、参数(非必须) 其中的并发...
  • 操作系统的基本特征

    千次阅读 2019-08-02 15:08:38
    多道程序 环境下,并发性是指在一段时间内宏观上有程序在同时运行,但在单处理机系统中, 每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算 机系统中有个处理机,则这些...
  • 现代操作系统的两个基本特征是资源共享和程序并发执行。操作系统是管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。操作系统是计算机系统的关键组成部分,负责管理与配置内存、...
  • 面向对象思想写好并发程序

    万次阅读 2022-01-09 22:36:14
    在工作中很时候在设计之初都是直接按照单线程的思路来写程序的,而忽略了本应该重视的并发问题;等上线后的某天,突然发现诡异的 Bug,再历经千辛万苦终于定位到问题所在,却发现对于如何解决已经没有了思路。 ...
  • Java开发中线程与高并发需要注意的 15 个细节

    千次阅读 多人点赞 2022-03-29 10:22:44
    迎关注公众号"Java学习之",查看更干货! volatile(大厂默认必会的知识点),意思:可变的、易变的, 保证线程可见性,不是实时监控。每一个线程有自己的局部内存,当需要使用共享内存中的变量时,会copy一份到...
  • Java并发编程的技能基本涵括以下5方面: 线程 线程池 线程锁 并发工具类 并发容器 线程的4种创建方式 继承Thread 实现Runnable接口 实现Callable接口 以及线程池来创建线程 Java线程的生命周期 线程的...
  • 操作系统重要概念——并发

    千次阅读 2021-03-13 15:28:09
    并发是指两个或个事件可以在同一个时间间隔发生。 更形象一些,请看下面的例子: 8:00PM.咚咚呛老师在准备课程,同时8:00PM.同学们在认真学习,这两件事属于并行的关系。 8:00P.M.咚咚呛老师在准备课程,8:...
  • C++线程并发(一)--- 线程创建与管理

    万次阅读 多人点赞 2020-03-16 22:21:32
    在应用程序中使用并发的原因主要有两个:关注点分离和性能。事实上,甚至可以说它们差不多是使用并发的唯一原因;当你观察的足够仔细时,一切其他因素都可以归结到这两者之一(或者可能是二者兼有)。
  • 并发基本概念及实现,进程、线程基本概念 一、并发、进程、线程的基本概念和综述 并发,线程,进程要求必须掌握 1.1 并发 两个或者更的任务(独立的活动)同时发生(进行):一个程序同时执行个独立的任务...
  • 操作系统的基本特征:1、并发性 并行性是指两个或个事件在同一时刻发生,而并发性是指两个或个事件在同一时间间隔内发生;2、共享性 所谓共享是指系统中的资源可供内存中并发执行的进程(...
  • 线程和高并发的常见面试题整理

    千次阅读 2020-07-12 11:46:03
    消息队列的可靠性怎么保证 了解高并发吗,线程里怎么保证线程安全 Fork/Join Fork/Join就是利用了分治的思想组建的框架,平日里很场景都能利用到分治思想。框架的核心ForkJoinPool,因为含有任务队列和窃取的...
  • python 进程并发线程并发总结

    千次阅读 2017-05-22 18:41:27
    概念上来说,进程并发即运行个独立的程序,优势在于并发处理的任务都由操作系统管理,不足之处在于程序与各进程之间的通信和数据共享不方便;线程并发则由程序员管理并发处理的任务,这种并发方式可以方便地在...
  • 系统上线之前需要压力测试,本文以“模拟大量微信小程序用户对平台进行并发访问的性能测试”为案例说明。 一、用程序生成访客数据,最好是项目中在用编程语言,我这里用的是JAVA;因为是模拟小程序用户,所以需要...
  • 数据库是一个共享资源,应该允许个用户程序并行地存取数据,当对数据库进行并行操作时,有可能出现数据不一致的情况。 并行操作:在单处理机系统中,事务的并行执行实际上是这些并行事务的操作轮流交叉进行。 为...
  • 引入进程的目的正是为了使其程序能和其它建立了进程的程序并发执行,而程序本身是不能并发执行的。2、动态性动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而...
  • 只有为程序创建进程后,程序才能正确地并发执行。并发是引入进程的目的,也是进程的另一个最基本特征。 3)独立性。进程实体是一个能够独立运行、独立分配资源和独立接受调度的基本单位。在并发环境中,程序已...
  • 并发编程面试题(2020最新版)

    万次阅读 多人点赞 2020-03-14 17:28:01
    在 Java 程序中怎么保证线程的运行安全?并行和并发有什么区别?什么是线程,线程的优劣?线程和进程区别什么是线程和进程?进程与线程的区别什么是上下文切换?守护线程和用户线程有什么区别呢?如何在 Windows...
  • 计算机操作系统的最基本特征是:1、并发性;计算机系统中同时存在程序,宏观上看,这些程序是同前推进的。2、共享性。3、随机性;操作系统的运行是在一个随机的环境中。4、虚拟;通过技术将一个物理实体变成若干...
  • 并发,并行,异步,线程

    千次阅读 多人点赞 2019-02-23 16:44:00
    你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的) 你吃饭吃到...
  • 1.2操作系统的四个基本特征

    千次阅读 2020-03-16 19:33:05
    3,没有并发和共享,就没有异步和虚拟,所以他们是两个最基本特征 一,并发: 含义:指两个或者个事件在同一时间间隔内发生,这些事件在宏观上是同时发生的,但微观上是交替发生的。 并行:指两个或者个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 460,711
精华内容 184,284
关键字:

多道程序并发的基本特征