临界数据、临界区和原子操作

1、首先给出这三个名词的定义。

临界数据指多个进程(或线程)会竞争修改的数据。

临界区指修改临界数据的代码区域。

原子操作指临界区的代码不会被这个临界数据的其他临界区的代码打断。

2、通过一个实例来理解这些概念。

在这个实例中临界数据是标准输出,临界数据对应的其中一个临界区就是图中红框部分,红框中的临界区代码不应该被其他临界区打断,否则就有可能出现标准输出被打乱。通过信号量使得临界数据同一时间只能被一个临界区访问。

也就是说如果现在一个临界区在访问这个临界数据,那么当进程进行调度时,绝对不会切换到另一个临界区,只可能切换到其他代码。这也就是上面“同一时间”的含义。

修改stdout的这一系列操作因为不会被其他临界区打乱,所以变成了原子操作。

参考:http://blog.csdn.net/ljianhui/article/details/10243617

时间: 2024-10-06 05:15:42

临界数据、临界区和原子操作的相关文章

linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一每CPU变量 二原子操作 三优化和内存屏障 四自旋锁 自旋锁 自旋锁的数据结构和宏函数 读写自旋锁 读写自旋锁的相关函数 linux内核中的各种“任务”都能看到内核地址空间,因而它们之间也需要同步和互斥.linux内核支持的同步/互斥手段包括: 技术 功能 作用范围 每CPU变量 为每个CPU复制一份数据

金属Rust:原子操作

金属Rust:原子操作 对于复杂的操作来说,使用互斥量(Mutex)来避免竞态条件相当省力.但是对于一些比较小规模的操作,比如让一个计数器+1之类,会考虑更方便的原子对象. 原子类型在标准库中的std::sync::atomic模块下.原子类型和平时使用的基础类型(primitive type)很像,唯一的区别是原子类型的操作能够保证对数据操作的访问顺序.也就是说,如果当前线程对一个变量进行的修改如果没有完成,其他线程是无法访问到该变量的. 操作顺序 对于一些比较耗时的操作,CPU会采用乱序执行

第3章 文件I/O(3)_内核数据结构、原子操作

3. 文件I/O的内核数据结构 (1) 内核数据结构表 数据结构 主要成员 文件描述符表 ①文件描述符标志 ②文件表项指针 文件表项 ①文件状态标志(读.写.追加.同步和非阻塞等状态标志) ②当前文件偏移量 ③i节点表项指针 ④引用计数器 i节点 ①文件类型和对该文件的操作函数指针 ②当前文件长度 ③文件所有者 ④文件所在设备.文件访问权限 ⑤指向文件数据在磁盘块上所在位置的指针等. (2)3张表的关系 4. 文件的原子操作 (1)文件追加 ①打开文件时使用O_APPEND标志,进程对文件偏移量

ThinkPHP3快速入门教程二:数据CURD

CURD(创建[Create].更新[Updata].读取[Read].删除[Delete]),定义了用于处理数据的基本原子操作. CURD在具体的应用中并非一定使用create.updata.read.delete字样的方法,但是他们完成的功能是一致的. 例如: ThinkPHP就是使用add.save.select和delete方法表示模型的CURD操作. 一.创建数据 CURD的Create操作通常会通过表单来提交数据,首先,我们在项目的Tpl/Form目录下面创建一个add.html模板

iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教程,于是待问题解决后抽时间截了图,自己写一遍封存在博客园中以便以后随时查阅. charles又名青花瓷,在iOS开发中的抓包中具有重要作用.最大的三点用处,一就是拦截别人软件的发送的请求和后端接口,练习开发.二是自己后端返回的response拦截修改后再接收以达到测试临界数据的作用.三写脚本重复拦截

iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解

charles又名青花瓷,在iOS开发中的抓包中具有重要作用.最大的三点用处,一就是拦截别人软件的发送的请求和后端接口,练习开发.二是自己后端返回的response拦截修改后再接收以达到测试临界数据的作用.三写脚本重复拦截抓取别人的数据.(因为不太道德,本文不提第三点) 1.开始之前的准备工作 首先安装一下这个软件 这个相信很多人电脑里应该都安装了,没安装的搜charles破解版也能很容易搜到.如果没安装java环境,首次进入charles会提示让你安装java包得,直接给你链接是苹果官网的,去

ThinkPHP3.1快速入门(2)数据CURD

上一篇中,我们了解了ThinkPHP的基础部分,以及如何创建一个控制器和模板,并知道了M方法的用法,本篇将会讲解下数据的CURD操作,探索下更多的数据操作. CURD CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD.它代表创建(Create).更新(Update).读取(Read)和删除(Delete)操作.CURD 定义了用于处理数据的基本原子操作.之所以将CURD 提升到一个技术难题的高度是因为完成一个涉及在多个数据库系统中进行CURD操作的汇总相关的活动

四、文件内核数据结构和原子操作

4.1 缓存 buff 说明 一般设置缓存 buff  的大小是由一定的规律的,就是根据磁盘块的大小来定. Linux下输入命令: df -k  查看磁盘 可以用命令查看下 /dev/sda1 磁盘的磁盘说明 1 sudo tune2fs -l /dev/sda1 Block size 就是磁盘块的大小,这个磁盘块的大小为 4M ,那么就可以设置缓存 buff 大小为 4096,一次就可以将数据写入. 设置的缓存大小最好与磁盘块的大小保持一致,有利于提升读写文件的效率. 4.2 操作文件中内核数

【转】自旋锁及其衍生锁

原文网址:http://blog.chinaunix.net/uid-26126915-id-3032644.html 自旋锁 自旋锁(spinlock)是用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁.自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞.自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下. 自旋锁用于多个CPU系统中,