关闭

单核、多核上锁、同步操作、原子操作

标签: 多核原子操作Test-and-Set锁内存总线内存屏障
636人阅读 评论(0) 收藏 举报
分类:

(1)      所有的同步操作最基础的理论就是原子操作,内存屏障、锁都是为了保证在不同平台或者cpu下的原子操作。

内存屏障作用:

A:在编译时,拒绝编译器优化之后的指令

B:在运行时,告诉内存地址总线,共享数据地址必须同步

 

锁是内存中一种整型数据,只有两种状态:空闲和上锁。

加锁过程

1、  read lock

2、  判断lock状态

3、  如果已经加锁,返回失败

4、  把锁状态设置为上锁

5、  返回成功

 

(2)      什么情况下会导致不同线程同时得到锁:

1、  中断,上面1到5步骤中出现中断,cpu被抢占

2、  多核,可以同步在不同核心上处理1到5步骤

 

(3)      解决办法

1:单核情况下,可以先关闭中断,加锁后再打开中断。Test-and-Set就是用来做这个事情的。Test-and-Set主要功能,取出内存某一单元的值。还有swap用来交换两个内存单元的值。这两个命令都是原子性的。

2:单核情况下Test-and-Set不会被中断打断所以是原子性的,对于多核来说Test-and-Set就不再是原子性的了。对于多核可以在锁内存总线的情况下进行Test-and-Set。原子操作里面的lock是锁内存总线,这里面的lock是保证执行的执行顺序严格按照lock前,lock中,lock后的顺序执行

1
0
查看评论

单核、多核上锁、同步操作、原子操作

(1)      所有的同步操作最基础的理论就是原子操作,内存屏障、锁都是为了保证在不同平台或者cpu下的原子操作。 内存屏障作用: A:在编译时,拒绝编译器优化之后的指令 B:在运行时,告诉内存地址总线,共享数据地址必须同步 &#...
  • shangshuai19901005
  • shangshuai19901005
  • 2016-08-29 14:01
  • 636

原子操作(Atomic)

<br /><br />现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成之后。更广泛的意义下原子操作是指一系列必须整体完成的...
  • onlyou930
  • onlyou930
  • 2011-05-20 13:00
  • 9332

原子操作在多核编程中的使用

 现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成之后。更广泛的意义下原子操作是指一系列必须整体完成的操作步骤,如果任何一步操作没有完成,...
  • yuntongsf
  • yuntongsf
  • 2009-11-09 13:34
  • 1104

单核,多核CPU的原子操作

一. 何谓"原子操作": 原子操作就是: 不可中断的一个或者一系列操作, 也就是不会被线程调度机制打断的操作, 运行期间不会有任何的上下文切换(context switch). 二. 为什么关注原子操作? 1. 如果确定某个操作是原子的, 就不用为了去保护这个操作而加上会耗费昂...
  • qq100440110
  • qq100440110
  • 2016-04-19 22:09
  • 594

并发,cpu,时间片轮转,原子操作

突然想到一个问题,并发就是cpu时间片轮转,如A,B两个任务两个并发使用一个cpu,那么A和B是怎么轮转的呢?执行到A的哪里,就去执行B,然后再回来执行A? 即cpu处理到什么时候,就将A挂起,然后去执行B? 是不是设计cpu的原子操作?即cpu处理完A的原子操作就去执行B。 http...
  • Ideality_hunter
  • Ideality_hunter
  • 2017-05-27 17:17
  • 290

单核、多核上锁、同步操作、原子操作

(1)      所有的同步操作最基础的理论就是原子操作,内存屏障、锁都是为了保证在不同平台或者cpu下的原子操作。 内存屏障作用: A:在编译时,拒绝编译器优化之后的指令 B:在运行时,告诉内存地址总线,共享数据地址必须同步 &#...
  • shangshuai19901005
  • shangshuai19901005
  • 2016-08-29 14:01
  • 636

单核多线程与多核多线程的区别---总结

在单核时代,多线程就有很广泛的应用,这时候多线程大多用于降低阻塞(意思是类似于 while(1) { if(flag==1) break; sleep(1); } 这样的代码)带来的CPU资源闲置,注意这里没有浪费CPU资源,去掉sleep(1)就是纯浪费了。 阻塞在什么时候发生呢?...
  • u010458863
  • u010458863
  • 2015-09-20 10:29
  • 8160

多核编程 与 单核多线程编程的区别

1、锁竞争: 单核中,如果单个线程取得所,则获取CPU运行时间,其他等待获取锁的线程被阻塞。使用了锁,影响的只是枷锁和解锁的耗时,CPU始终运行。 多核中,若2个(更多)线程使用同一把锁,则会导致CPU饥饿。实际还是串行化执行! 2、线程分解和执行的区别: 对单核CPU,对客...
  • mengfanteng
  • mengfanteng
  • 2016-05-30 22:32
  • 826

文件IO的原子操作

设计多个进程共同操作一个文件的,就需要原子的操作下面几个问题: 1.添加至一个文件 多个进程都要添加数据到一个文件的尾端 if(lseek(fd,0,SEEK_END)>=0) {     write(fd,buff,100); } 对单个进程而言,...
  • kinado
  • kinado
  • 2012-08-17 11:18
  • 1642

atomic_read原子操作

CPU指令原子的,不可能出现指令执行到一半就被中断的情况。中断只能发生在指令与指令之间。 所以,在单处理器情况下,一条指令能完成的事情就是原子的。不管这条指令究竟做了多少事情。 多处理器情况下就不一样,一条CPU指令如果包含多个内存操作,则这多次操作之间可能有其他CPU也在操作内存,并且...
  • lin2jian4liang4
  • lin2jian4liang4
  • 2015-11-02 17:05
  • 180
    个人资料
    • 访问:1735次
    • 积分:96
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档