原子

PHP正则表达式完全复习手册

杀马特。学长 韩版系。学妹 提交于 2020-03-12 04:51:33
/*--> */ /*--> */ 正则表达式定义 正则表达式,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 简单说,正则表达式就是用来匹配文本的表达式。 正则表达式组成 包含:定界符、原子、元字符、修正符。 名词解释 定界符: 作为定界符常使用反斜线“/”,如“/apple/”。用户只需要匹配的模式内容放入定界符之间即可。作为定界符也不仅限于“/”。除了字母、数字和斜线“\”以外的任何字符都可以作为定界符。像“#”、“|”、“!”等都可以。 原子: 是正则表达式的最基本的组成单元,每个模式中最少包含一个原子。原子是那些未显示指定元字符的打印和非打印字符组成,具体分为5类。 1.普通字符作为原子,例如:a~z A~Z 0~9 2.一些特殊字符和转义后元字符作为原子,例如所有标点符号(但语句特殊意义的符号需要转义后才可作为原子,如:\" \' \* \+ \? \.) 3.一些非打印字符作为原子,例如:\f \n \r \t \v \CX 4.使用“通用字符类型”作为原子,例如:\d \D \w \W \s \S 5.自定义原子表([])作为原子,例如:'/[api]sp/' '^[api]sp/' 元字符: 用于扩展和限定原子功能,不能单独使用,必须与原子配合使用。 修正符:

(5)UML

二次信任 提交于 2020-03-11 03:55:57
活动图本质上就是流程图 动作状态: 执行原子的不可中断的动作,用圆形矩形表示 活动状态: 不具有原子性,可以有入口动作和出口动作 动作流: 动作状态之间的转换 分支与合并: 用空心小菱形表示 分叉与汇合 用来表示并发线程,使用加粗的水平线段或垂直线段表示称为同步棒 泳道: 用矩形块表示,将这个活动的actor名放在矩形框的顶部,泳道没有顺序,每个活动只能属于一个泳道 对象流: 来源: CSDN 作者: 人总是要有梦想的QAQ 链接: https://blog.csdn.net/qq_43410618/article/details/104777647

原子操作

元气小坏坏 提交于 2020-03-09 04:21:18
CPU术语 缓存行(Cache line):缓存的最小单位 比较并交换(Compare and Swap):CAS操作需要输入两个数值,一个旧值,一个新值,在操作期间先比较旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换 CPU流水线(CPU pipeline):在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5~6步后再由这些电路单元分别执行,这样就能实现在一个CUP时钟周期完成一条指令,从而提高CPU的运算速度 内存顺序冲突(Memory order violation):内存顺序冲突一般是由假共享引起的,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现内存顺序冲突时,CPU必须清空流水线 处理器实现原子操作 1.使用总线锁保证原子性:    如果多个处理器同时对共享变量进行读写操作(i++),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。 总线锁其实就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。 2.使用缓存锁保证原子性:    在同一时刻,只需保证对某个内存地址的操作是原子性即可,但总线锁把CPU和内存之间的通信锁住了

关于单CPU,多CPU上的原子操作

五迷三道 提交于 2020-03-09 04:19:06
所谓原子操作,就是"不可中断的一个或一系列操作" 。 硬件级的原子操作: 在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。这也是某些CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的原因。 在对称多处理器(Symmetric Multi-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。 在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的 原子性。 软件级的原子操作: 软件级的原子操作实现依赖于硬件原子操作的支持。 对于linux而言,内核提供了两组原子操作接口:一组是针对整数进行操作;另一组是针对单独的位进行操作。 2.1. 原子整数操作 针对整数的原子操作只能对atomic_t类型的数据处理。这里没有使用C语言的int类型,主要是因为: 1)

Java自学-多线程 原子访问

試著忘記壹切 提交于 2020-03-08 09:48:26
多线程 原子访问 步骤 1 : 原子性操作概念 所谓的 原子性操作 即不可中断的操作,比如赋值操作 int i = 5; 原子性操作本身是线程安全的 但是 i++ 这个行为,事实上是有3个原子性操作组成的。 步骤 1. 取 i 的值 步骤 2. i + 1 步骤 3. 把新的值赋予i 这三个步骤,每一步都是一个原子操作,但是合在一起,就不是原子操作。就 不是线程安全 的。 换句话说,一个线程在步骤1 取i 的值结束后,还没有来得及进行步骤2,另一个线程也可以取 i的值了。 这也是分析同步问题产生的原因 中的原理。 i++ ,i--, i = i+1 这些都是非原子性操作。 只有int i = 1,这个赋值操作是原子性的。 步骤 2 : AtomicInteger JDK6 以后,新增加了一个包 java.util.concurrent.atomic ,里面有各种原子类,比如 AtomicInteger 。 而AtomicInteger提供了各种自增,自减等方法,这些方法都是原子性的。 换句话说,自增方法 incrementAndGet 是线程安全的,同一个时间,只有一个线程可以调用这个方法。 package multiplethread; import java.util.concurrent.atomic.AtomicInteger; public class

volatile与synchronized使用比较

烈酒焚心 提交于 2020-03-06 13:38:44
volatile英文含义【易变的】其实就是告诉CPU使用前必须重新去取值。 volatile比synchronized轻量级,不会造成阻塞,但是只实现了部分synchronized的功能。 volatile能保证可见性和有序性。但是保证不了原子性。synchronized可见性、有序性、原子性都可以保证。 来源: oschina 链接: https://my.oschina.net/u/3866531/blog/1939115

原子性、可见性和有序性

会有一股神秘感。 提交于 2020-03-06 13:36:24
1. 原子性 操作是原子的,则它不可被分割。从另一个线程的视角来看,它不应该看到这个操作的中间状态,只能看到两种状态:①还没开始执行 ② 已经执行结束。 在多个线程访问临界资源时,如果临界区的代码不是原子的,则一个线程执行到某个中间状态,然后被时钟中断,另一个线程接着执行,就会覆盖数据或访问到不正确的数据。 2. 可见性 由于在存储器层次结构中,更高层的数据是更低层数据的一个子集,该数据副本可能存在存储系统的不同层中。为了提高性能,高层数据写回底层并不是实时的,因此可能造成在某时刻高层数据和底层数据的不一致。 在多核cpu下,由于每个核内部都内置了cache,各个核的cache可能缓存了同一个内存地址的数据,cache之间如果没有某种机制协调,会导致数据不一致(各个线程看到相同数据的值不一样)。 当一个线程修改了共享数据后,我们希望其他线程也能看到这个改变后的结果。如果其他线程看不到这个修改后的数据,继续访问缓存的旧数据,就可能出现问题。 3. 有序性 ① 哪些地方可能产生重排序? 源代码-->字节码/机器码-->存储系统-->CPU 会造成重排序的有:① 编译器 ② 存储系统 ③ CPU的执行单元。 ② 为什么要重排序呢? 为了提高性能。比如更利于cpu的流水、乱序执行;cpu的异步写入store buffer;store buffer的合并写操作等。 ③ 重排序会造成什么影响呢

第二周实验-化学

独自空忆成欢 提交于 2020-03-06 10:00:37
题目描述:化学很神奇,以下是烷烃基。 假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基 你的任务是甄别烷烃基的类别。 原子没有编号方法,比如 1 2 2 3 3 4 4 5 5 6 和 1 3 2 3 2 4 4 5 5 6 是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了 输入: 输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b) 数据保证,输入的烷烃基是以上5种之一 输出: 每组数据,输出一行,代表烷烃基的英文名 sample: Input 2 1 2 2 3 3 4 4 5 5 6 1 4 2 3 3 4 4 5 5 6 Output n-hexane 3-methylpentane 题目思路: 本题的思路就是找到这五种烷烃的规律,首先题目中说明了原子编号没有固定的方法,这样我们只能看原子与化学键之间的数量关系,那么观察可以看到,n-hexane所有的化学键只能连接两个原子,2,3-dimethylbutane有两个原子连接三个化学键,2,2-dimethylbutane有一个原子连接四个化学键,对于这三种烷烃比较容易求得,也就是用一个一维数组记录下来每个原子连接的化学键个数

【实验二】

百般思念 提交于 2020-03-05 20:57:07
【A题_化学】 题目: 化学很神奇,以下是烷烃基。 (注:为了表示方便,暂且按先从左到右再从上到下的顺序将其表示为12345号) 假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基。 你的任务是甄别烷烃基的类别。 思路: 既然是判别不同的种类,首先应该做的就是快速发现其中的不同,然后分类判别。观察比较容易得出的结果是 1 号有4 个点连接了两根线、两个点只有一根线;4号2个点3根线、四个点1根线;5号1个点4根线 、1个点两根线、两个点一根线;在这方面2 和3 号相同,因此针对这两个要附加判别标准,继续观察,同有3根线的原子相连的原子,所拥有的连线的一个是4 一个是5,据此可判别所有的类别。 根据以上判别原则,为判别145号建立一个可建立一个二维数组,用以表示每个种类拥有不同连线的原子个数,可以直接判断。针对2 3号,利用散列技术,将每个原子所连接的原子表示出来,然后计算特殊点邻接的原子所拥有的总连线数。 总结: 这次的思路不好的地方是太麻烦了,针对2 3 号而建立的哈希表,却要在每一组元素输入的时候都要做一遍,这样就额外耗费了时间和空间。但是因为单纯用数组或者哈希表的话,(因本人还是太菜)暂时没有想到可以分辨出来的方法。 还有一点需要提的是哈希链表每一个桶插入的元素里

【诡异并发三大恶人】原子性

余生颓废 提交于 2020-03-05 14:58:13
转:https://mp.weixin.qq.com/s/UiaXvnjc0NFfNMLf2lUq4A 前言、原子性的阐述 一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。 我理解是一个操作不可再分,即为 原子性 。而在并发编程的环境中,原子性的含义就是只要该线程开始执行这一系列操作,要么全部执行,要么全部未执行,不允许存在执行一半的情况。 我们试着从数据库事务和并发编程两个方面来进行对比: 1、在数据库中 原子性概念是这样子的:事务被当做一个不可分割的整体,包含在其中的操作要么全部执行,要么全部不执行。且事务在执行过程中如果发生错误,会被回滚到事务开始前的状态,就像这个事务没有执行一样。(也就是说:事务要么被执行,要么一个都没被执行) 2、在并发编程中 原子性概念是这样子的: 第一种理解:一个线程或进程在执行过程中,没有发生上下文切换。 上下文切换:指 CPU 从一个进程/线程切换到另外一个进程/线程(切换的前提就是获取 CPU 的使用权)。 第二种理解:我们把一个线程中的一个或多个操作(不可分割的整体),在 CPU 执行过程中不被中断的特性,称为原子性。(执行过程中,一旦发生中断,就会发生上下文切换) 从上文中对原子性的描述可以看出,并发编程和数据库两者之间的原子性概念有些相似: 都是强调,一个原子操作不能被打断! ! 而非原子操作用图片表示就是这样子的: