zoukankan      html  css  js  c++  java
  • 并发编程常见术语

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11409772.html

    并发编程领域可以抽象成三个核心问题:分工、同步、互斥。

    并发:指两个或多个事件在同一时间间隔内发生,这些事件宏观上是同时发生的,但微观上是交替发生的。比如:某天上午先约女生A出去玩,再约女生B出去玩

    并行:指两个或多个事件在同一时刻同时发生。比如:某天上午同时约两个女生出去玩

    程序:指的是一个指令序列。

    进程控制块PCB:指的是系统为每个运行的程序配置的一个数据结构,用来描述进程的各种信息(如程序代码的存放位置)。

    进程实体:由程序段、数据段、PCB三部分组成,是静态的。

    进程:是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,是动态的。

    线程:是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。

    互斥:同一时刻,只允许一个线程访问共享变量。

    同步:线程之前如何通信、协作

    临界区:一段互斥执行的代码

    可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到

    原子性:一个或多个操作在CPU执行的过程中不被中断的特性。原子性的本质其实不是不可分割,不可分割只是外在表现,其本质是多个资源间有一致性的要求,操作的中间状态对外不可见。所以解决原子性的问题,是要保证中间状态对外不可见。

    有序性:程序按照代码的先后顺序执行,编译器为了优化性能,有时候会改变程序中语句的先后顺序

    幂等性:幂等是一个数学上的概念,它的含义是多次执行同一个操作和执行一次操作,最终得到的结果是相同的

    Happens-Before: 前面一个操作的结果对后续操作是可见的。A Happens-Before B意味着A事件对B事件来说是可见的,无论A事件和B事件是否发生在同一个线程里。Happens-Before约束了编译器的优化行为,虽允许编译器优化,但是要求编译器优化后一定遵守Happens-Before规则。

    等待-通知机制:一个完整的等待-通知机制,线程首先获取互斥锁,当线程要求的条件不满足时,释放互斥锁,进入等待状态;当要求的条件满足时,通知等待的线程,重新获取互斥锁。

    线程安全:在多线程调用情况下,依然表现正常,程序按照我们期望的执行。

    数据竞争:当多个线程同时访问同一数据,并且至少有一个线程会写这个数据的时候,如果不采取保护措施,那么就会导致并发bug 

    竞态条件:程序的执行结果依赖线程执行的顺序

    死锁:一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象

    活锁:线程没有发生阻塞,但仍然会存在执行不下去的情况

    饥饿:线程因无法访问所需资源而无法执行下去的情况

    吞吐量:指的是单位时间内能处理的请求数量。吞吐量越高,说明性能越好。

    延迟:指的是从发出请求到收到响应的时间。延迟越小,说明性能越好。

    并发量:指的是能同时处理的请求数量。一般来说随着并发量的增加、延迟也会增加。所以延迟这个指标,一般都会是基于并发量来说的。例如:并发量是1000的时候,延迟是50毫秒。

    在并发编程领域,提升性能本质上是提升硬件的利用率,再具体点来说,就是提升I/O的利用率和CPU的利用率

    管程:指的是管理共享变量以及对共享变量的操作过程,让它们支持并发。翻译为Java领域的语言,就是管理类的成员变量和成员方法,让这个类是线程安全的。

    通用的线程生命周期:初始状态、可运行状态、运行状态、休眠状态、终止状态

    Java语言中线程共有6钟状态:NEW(初始化状态)、RUNNABLE(可运行状态)、BLOCKED(阻塞状态)、WAITING(无时限等待)、TIMED_WAITING(有时限等待)、TERMINATED (终止状态)

    调用栈:指的是CPU通过堆栈寄存器找到调用方法的参数和返回地址。

    栈帧:每个方法在调用栈里都有自己的独立空间。每个栈帧里都有对应方法需要的参数和返回地址。当调用方法时,会创建新的栈帧,并压入调用栈;当方法返回时,对应的栈帧就会被自动弹出,也就是说,栈帧和方法是同生共死的。局部变量的作用域是方法内部,所以局部变量同样是放到了调用栈里;局部变量和方式是同生共死的,一个变量如果想跨越方法的边界,就必须创建在堆里。

    线程封闭:两个线程可以同时用不同的参数调用相同的方法,每个线程都有自己独立的调用栈,局部变量保存在线程各自的调用栈里面,不会共享,所以自然也就没有并发问题。

  • 相关阅读:
    Java多线程 ReadWriteLock、StampedLock用法
    Java多线程基础
    Java中创建多线程
    Java中多线程同步
    Java多线程 synchronized与ReentrantLock用法
    Linux6配置bond链路聚合
    Bash Shell命令流程
    location uri 添加 / 和不添加 / 的区别?
    Nginx负载均衡健康检查nginx_upstream_check_module
    Zabbix4.0源码安装基于LNMP
  • 原文地址:https://www.cnblogs.com/agilestyle/p/11409772.html
Copyright © 2011-2022 走看看