Linux环境编程
1.__sync_fetch_and_add和__sync_bool_compare_and_swap
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。
其声明如下:
type __sync_fetch_and_add (type *ptr, type value, ...)
type __sync_fetch_and_sub (type *ptr, type value, ...)
type __sync_fetch_and_or (type *ptr, type value, ...)
type __sync_fetch_and_and (type *ptr, type value, ...)
type __sync_fetch_and_xor (type *ptr, type value, ...)
type __sync_fetch_and_nand (type *ptr, type value, ...)
type __sync_add_and_fetch (type *ptr, type value, ...)
type __sync_sub_and_fetch (type *ptr, type value, ...)
type __sync_or_and_fetch (type *ptr, type value, ...)
type __sync_and_and_fetch (type *ptr, type value, ...)
type __sync_xor_and_fetch (type *ptr, type value, ...)
type __sync_nand_and_fetch (type *ptr, type value, ...)
这两组函数的区别在于第一组返回更新前的值,第二组返回更新后的值。
type可以是1,2,4或8字节长度的int类型,即:
int8_t / uint8_t
int16_t / uint16_t
int32_t / uint32_t
int64_t / uint64_t
后面的可扩展参数(...)用来指出哪些变量需要memory barrier,因为目前gcc实现的是full barrier(类似于linux kernel 中的mb(),表示这个操作之前的所有内存操作不会被重排序到这个操作之后),所以可以略掉这个参数。
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
这两个函数提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr,
第一个函数在相等并写入的情况下返回true.
第二个函数在返回操作之前的值。
__sync_synchronize (...)发出一个full barrier.
关于memory barrier,cpu会对我们的指令进行排序,一般说来会提高程序的效率,但有时候可能造成我们不希望得到的结果,举一个例子,比如我们有一个硬件设备,它有4个寄存器,当你发出一个操作指令的时候,一个寄存器存的是你的操作指令(比如READ),两个寄存器存的是参数(比如是地址和size),最后一个寄存器是控制寄存器,在所有的参数都设置好之后向其发出指令,设备开始读取参数,执行命令,程序可能如下:
write1(dev.register_size,size);
write1(dev.register_addr,addr);
write1(dev.register_cmd,READ);
write1(dev.register_control,GO);
如果最后一条write1被换到了前几条语句之前,那么肯定不是我们所期望的,这时候我们可以在最后一条语句之前加入一个memory barrier,强制cpu执行完前面的写入以后再执行最后一条:
write1(dev.register_size,size);
write1(dev.register_addr,addr);
write1(dev.register_cmd,READ);
__sync_synchronize();
write1(dev.register_control,GO);
memory barrier有几种类型:
acquire barrier : 不允许将barrier之后的内存读取指令移到barrier之前(linux kernel中的wmb())。
release barrier : 不允许将barrier之前的内存读取指令移到barrier之后 (linux kernel中的rmb())。
full barrier : 以上两种barrier的合集(linux kernel中的mb())。
还有两个函数:
type __sync_lock_test_and_set (type *ptr, type value, ...)
将*ptr设为value并返回*ptr操作之前的值。
void __sync_lock_release (type *ptr, ...)
将*ptr置0
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>static int count = 0;void *test_func(void *arg)
{int i=0;for(i=0;i<20000;++i){__sync_fetch_and_add(&count,1);}return NULL;
}int main(int argc, const char *argv[])
{pthread_t id[20];int i = 0;for(i=0;i<20;++i){pthread_create(&id[i],NULL,test_func,NULL);}for(i=0;i<20;++i){pthread_join(id[i],NULL);}printf("%d\n",count);return 0;
}
编译# cc __sync_fetch_and_add.c
/tmp/ccse5ep7.o: In function `main':
__sync_fetch_and_add.c:(.text+0x86): undefined reference to `pthread_create'
__sync_fetch_and_add.c:(.text+0xb3): undefined reference to `pthread_join'
参考:http://www.linuxidc.com/Linux/2011-06/37403.htm
2.undefined reference to 'pthread_create'问题解决
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。
问题解决:在编译中要加 -lpthread参数
重新编译上述代码#cc __sync_fetch_and_add.c -o add -lpthread
3.汇编中为什么会有NOP指令
1).”NOP"指令即空指令,nop并不是汇编指令,只是一条汇编伪指令,编译器会将这条指令替换成像mov r7,r7之类的没什么用处的操作,通常用于延时或等待。
2). 运行该指令时单片机什么都不做,但是会占用一个指令的时间。也就是做精确延时,这和for的延时程序比时间短,易控制。
3). 当指令间需要有延时(给外部设备足够的响应时间;或是软件的延时等),可以插入“NOP”指令。
4)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu 就可以从第四个字节处读取指令了。)
5)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!
6)i/o传输时,也会用一下 nop,等待缓冲区清空,总线恢复;
7)清除由上一个算术逻辑指令设置的flag位;
8).NOP通常在破解软件时有特殊用途,例如检查序列号,特定硬件或软件需求,加密狗等的软件。这是通过更改函数和/或子程序以跳过安全检查,直接返回期望的检测值实现的。由于大多数安全检查子程序中的指令会被废弃,它们会被NOP所代替。
更多参考:http://blog.csdn.net/erazy0/article/details/6071281 http://zh.wikipedia.org/wiki/NOP
4.__asm__ ("pause" )和__asm__ ("nop" )
_asm pause 的反汇编代码如下
00401480 . F2: prefix repne:
00401481 . 90 nop
00401482 . C3 retn
__asm nop 的反汇编代码也如下
00401481 . 90 nop
00401482 . C3 retn
1).pause的编码如上,是NOP加F3前缀,这条指令是为支持超线程的CPU做优化用的,不支持超线程的CPU也能用,具体看INTEL手册。
2).asm("NOP");是汇编语言,执行空操作。通过一定次数的空操作达到延时的目的。具体次数通常经过测试获得。
参考:http://bbs.pediy.com/archive/index.php?t-88477.html
1.pause指令提升了自旋等待循环(spin-wait loop)的性能。当执行一个循环等待时,Intel P4或Intel Xeon处理器会因为检测到一个可能的内存顺序违规(memory order violation)而在退出循环时使性能大幅下降。PAUSE指令给处理器提了个醒:这段代码序列是个循环等待。处理器利用这个提示可以避免在大多数情况下的内存顺序违规,这将大幅提升性能。因为这个原因,所以推荐在循环等待中使用PAUSE指令。
2.pause的另一个功能就是降低Intel P4在执行循环等待时的耗电量。Intel P4处理器在循环等待时会执行得非常快,这将导致处理器消耗大量的电力,而在循环中插入一个pause指令会大幅降低处理器的电力消耗。
3.pause指令虽然是在Intel P4处理器开始出现的,但是它可以向后与所有的IA32处理器兼容。在早期的IA32 CPU中,pause就像NOP指令。Intel P4和Intel Xeon处理器将pause实现成一个预定义的延迟(pre-defined delay)。这种延迟是有限的,而且一些处理器可以为0。pause指令不改变处理器的架构状态(也就是说,它实际上只是执行了一个延迟——并不做任何其他事情——的操作)。
参考:http://blog.csdn.net/kofshower/article/details/7432612
5.按8字节对齐
希望malloc分配的数据区是按8字节对齐,所以在size不为8的倍数时,我们需要将size调整为大于size的最小的8的倍数
size_t align8(size_t s) {
if(s & 0x7 == 0)
return s;
return ((s >> 3) + 1) << 3;
}
参考:http://blog.codinglabs.org/articles/a-malloc-tutorial.html
6.大小写字符转换
#define ngx_tolower(c) (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)
#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)
参考:http://blog.csdn.net/21aspnet/article/details/41251915
7.多线程和原子操作
原子操作就是执行时不会被中断的指令。
两个原子操作不可能同时作用于同一个变量,这个是原子操作的一个保证,至于处理器或者操作系统如何实现那是另外一回事。
原子操作是指某些操作的不可中断。分为bitops和atomic_t两类,bitops用于标志的设置;而atomic_t用于原子性的加减之类的运算。
在原子操作中运用了很多的volatile声明。这样系统会阻止编译器对volatile声明的变量进行优化,确保变量使用用户定义的精确地址,而不是使用有着同一信息的别名。
参考:
http://blog.sina.com.cn/s/blog_6237dcca0100fjgl.html
http://www.cppblog.com/woaidongmao/archive/2009/10/19/98965.html
http://preshing.com/20130618/atomic-vs-non-atomic-operations/
http://hedengcheng.com/?p=803#more-803
8.负数变正数
负数&0x7fffffff -1&0x7fffffff=2147483647 -2&0x7fffffff=2147483646
-1的二进制是1111 1111 1111 1111 1111 1111 1111 1111
2147483647是0111 1111 1111 1111 1111 1111 1111 1111 用+N标记
-2147483648是1000 0000 0000 0000 0000 0000 0000 0000 用 -N标记
+N +1溢出=-N
最大正数溢出就是-1,0对应最小负数 ,见上图。
相关文章:
AI新基建如何构建?浪潮给出了一个答案
作者 | Just出品 | AI科技大本营(ID:rgznai100)伴随生产力升级,社会基础设施也正在发生变化。而智慧时代的新型基础设施,要能够对外提供各种算力服务、数据服务和AI服务。浪潮认为,其核心是计算力的生产中心。因此&…

协作是企业管理的重点和难点
这个问题让我想起了一道数学题,11?。在生活中这个题目的答案会千差万别,更别说一个企业。在我眼中,企业中最难管的是关系,更准确的说是协作。 经理过好几个信息系统建设的项目,小到一个简单的邮件系统&…

使用CSS3美化复选框checkbox
我们知道HTML默认的复选框样式十分简陋,而以图片代替复选框的美化方式会给页面表单的处理带来麻烦,那么本文将结合实例带您一起了解一下使用CSS3将复选框checkbox进行样式美化,并且带上超酷的滑动效果。 查看演示 下载源码HTML 通常我们使用以…

Thift安装
thrift官网http://thrift.apache.org/ #wget http://mirror.bit.edu.cn/apache/thrift/0.9.2/thrift-0.9.2.tar.gz #tar -zvxf thrift-0.9.2.tar.gz # ./configure --prefix/usr/local/thrift #make && makeinstall 增加到环境变量 #export PATH$PATH:/usr/…
“手把手撕LeetCode题目,扒各种算法套路的裤子”
出品 | AI科技大本营(ID:rgznai100)刷LeetCode刷到懵还是一头雾水?莫慌,这里有一个标星27000的算法详解教程。从项目命名来看,作者labuladong就有着要干翻算法的精气神。当然,这个教程不只是为了机械刷题。…

c语言标准库低通的qsort函数不适宜所有排序任务的原因
c语言标准库低通的qsort函数不适宜所有排序任务的原因: 第一:它只能用于内存中的数组排序,不能对链表中的数据排序; 第二:因为它是参数化的函数,所以能对各种数据进行操作,也造成它的运行速度比…

第三周学习进度条
星期日 星期一 星期二 星期三 星期四 星期五 所花时间 下午: 3:00-5:00 上午: 8:00-10:00 下午: 3:00-5:00 下午: 2:30-4:30 下午: 4:30-5:30 下午࿱…
jca分析java dump日志
可以使用jca分析java dump的日志 jca:https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid2245aa39-fa5c-4475-b891-14c205f7333c 运维报说是某机房突然全部都线程阻塞了 其中锁住了tcp的socket,在研究无果的情况下…

shell脚本10
对于使用/bin/bash作为登录shell的系统用户,检查他们在/opt目录中拥有的子目录或文件数量,如果超过100个,则列出具体数值及对应的用户帐号.具体实现: #!/bin/bash DIR"/etc" LMT100 validusersgrep "/bin/bash" /etc/passwd|cut -d ":" -f 1 for…
百度重磅发布云手机:低配置也可玩大型游戏 21
又一个科技巨头发力云游戏。4月15日,百度举行"云手机"线上直播会,发布基于自主研发的ARM服务器的百度"云手机"产品,让用户摆脱硬件的制约,中低端设备也能流畅运行大型游戏和应用。百度"云手机"可以…

创业思维 - Qunar的故事
在这里特别想介绍下Qunar,因为他和我们的最主要的系统-交易系统相关。大家都知道淘宝的交易平台可以说是国内甚至全球最复杂的交易系统。但是我们的交易系统由于承担业务太多,发展太久,历史包裹太重,在业务架构上可以说有很大的问…
“机器学习还是很难用!”
作者 | Caleb Kaiser译者 | 香槟超新星,责编 | 郭芮出品 | CSDN(ID:CSDNnews)我是一名Cortex贡献者,Cortex是一个用于在生产中部署模型的开源平台。首先声明,以下内容是基于我对一些机器学习团队的观察总结…

silverlight 无法发布 如何灵活配置IP
灵活配置IP可以有一个工具的 我为了比赛花了 两天工具做了一个配置Silverlight IP的小工具 可以参考 http://download.csdn.net/source/2714688
使用GoAccess分析Nginx日志
下载 GoAccess 的源代码、编译和安装: http://www.goaccess.io/download # wget http://tar.goaccess.io/goaccess-0.9.6.tar.gz# tar -xzvf goaccess-0.9.6.tar.gz# cd goaccess-0.9.6/# ./configure --prefix/usr/local/goaccess --enable-geoip --enable-utf8#…
STM32中GPIO的8种工作模式
一、推挽输出:可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。形象点解释:推挽,就是有推有拉&…
深挖谷歌 DeepMind 和它背后的技术
作者 | James Murphy译者 | 天道酬勤 责编 | Carol出品 | AI科技大本营(ID:rgznai100)人工智能(AI)的子集已经成倍增长,并完成了只有人类才能完成的各种任务。像机器学习这样的技术可以执行管理任务、人脸识别、下棋,甚至翻译语言…
Java编译原理
代码Test.java public class Test {public static void main(String[] args) {int a 0xae;int b 0x10;int c a b;int d c 1;String s;s "hello";}} # javac Test.java # javap -c Test 参考:http://codemacro.com/2015/03/31/intro-java-bytecod…

RHEL5.5学习--安装vmtools
首先先说明两点: (1)vmtools的安装需要gcc的支持,所以首先确定gcc是否已经安装。可运行gcc -v,若能显示gcc版本信息则说明安装完成,否则请查看上一篇文章(RHEL5.5学习--查看gcc是否安装以及如何…

SQL server 专业词汇
sql组成:DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert、delete、updateDCL:数据库控制语言 ,关键字:grant、removeDQL:数…
只会高中数学运算就能发现算法?Google开源的AutoML-Zero有多厉害
译者 | 刘畅出品 | AI科技大本营(ID:rgznai100)机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等。而使此类研究自动化的工作(称为AutoML)也有重大进展。这一进展主要集中在神经网络的体…
Tsar安装使用
Tsar是淘宝开发的一个非常好用的系统监控工具,在淘宝内部大量使用,它不仅可以监控CPU、IO、内存、TCP等系统状态,也可以监控Apache,Nginx/Tengine,Squid等服务器状态。值得一提的是,Tsar 支持将数据存储到 …

《虚拟化与云计算》读书感(四)数据中心的设计和构造
任何大型系统的设计和构造都是一项复杂的过程,数据中心的的设计和构造也是一项系统的工程,需要人们相互协作来完成总体的设计、建筑和基础设施的构建,以及软硬件的采购和上线。几天我看的书中这一节主要是将如何总体设计和构造以及要做的工作…

C 的大致运行原理。
// 尽量多上干货。我是Xcode 运行环境。 // 这些简单的我就写的 少些 。 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”。 函数有 声明(定义) 和 使用&…
Spring AOP与IOC以及自定义注解
Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version> </dependency> <dependency><groupId>org.spring…
小白也能看懂:一文学会入门推荐算法库 surprise
来源 | 机器学习与推荐系统surprise 支持的每个算法本身思路并不复杂,代码也不晦涩难懂,我们主要的目的是理解它的架构,学习框架各个部分的交互。这篇文章是想从一个整体的视角,以作者最初的思路为主线进行介绍,观察并…

开发人员必备网站
http://www.gotapi.com/语言:英语简介:HTML,CSS,XPATH,XSL,JAVASCRIPT等API的查询网站。http://www.w3schools.com/语言:英语简介:W3C制定的标准诸如XML,HTML,XSL等等的在线学习教程。http://www.xml.org.cn/语言:中文…

iOS实现依赖注入
依赖注入(Dependency Injection)这个词,源于java,但在Cocoa框架中也是十分常见的。举例来说:UIView的初始化方法initWithFrame - (id)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER; 这里的frame传入值,就是所谓的依赖(…

shell语法以及监控进程不存在重启
转码 # dos2unix ./test.sh 权限 # chmod ax ./test.sh语法变量var"111"echo $varecho ${var}运算no14;no25;let resultno1no2echo $result;自增自减少let no let no--[]和let类似result$[ no1 no2 ]result$[ $no1 5 ]也可以使用(()),但使用(())时&…
当莎士比亚遇见Google Flax:教你用字符级语言模型和归递神经网络写“莎士比亚”式句子...
作者 | Fabian Deuser译者 | 天道酬勤 责编 | Carol 出品 | AI科技大本营(ID:rgznai100)有些人生来伟大,有些人成就伟大,而另一些人则拥有伟大。—— 威廉莎士比亚《第十二夜》在几个月前,谷歌的研究人员介绍了机器学习…

netbackup错误之can not connect on socket(25)
rhel5.5上安装netbackup 7.0,这个版本只能安装在64位系统上。安装完netbackup 7.0后,发现登录界面一直报java认证失败,查看了下日志文件,报如下内容: 查了下系统设置,发现/etc/hosts文件里的主机名对应的IP…