毕达哥拉斯质bai数是指可以表示为 4n + 1 形式的质数,若直角三角形的三边均为整数,斜边为质数,其斜边的边长即为毕达哥拉斯质数.
前几个毕达哥拉斯质数为
5,13,17,29,37,41,53,61,73,89,97,101,109,113,… (OEIS中的数列A002144).
费马平方和定理陈述,毕达哥拉斯质数可以表示为二个平方数的和,其他质数除了2以外(2=1^2+1^2)都不能表示为二个平方数的和.毕达哥拉斯质数及2会在高斯整数的范数中出现,其他的质数不会是高斯整数的范数.
毕达哥拉斯质数可以表示为一个奇数的平方数与一个偶数的平方数的和:
毕达哥拉斯质数是可以表示为a^2+4b^2形式的质数.
依照二次互反律陈述,若p及q为奇质数,其中至少有一个为毕达哥拉斯质数,则 p是模q的二次剩余的充份必要条件是q是模p的二次剩余 .相反的,若p及q都不是毕达哥拉斯质数,则p是模q的二次剩余的充份必要条件是q不是模p的二次剩余.−1是是模p的二次剩余的充份必要条件是p是毕达哥拉斯质数(或2).
在p为毕达哥拉斯质数的域Z/p中,多项式x^2 = -1有二个解.
作者: liyunde
大素数密码
1 | 2 | |
2 | 7 | |
3 | 227 | |
4 | 632483 | 可以用快速筛法 |
5 | 11619640863583 | 使用欧拉函数,确定大概范围 二分法查找指定范围内的个数 当范围内个数只有一个时,这个就是目标素数 |
素数部分定理
1.素数本身只能被自身整除。也就是质数的约数只有两个,即1和本身。
2.所有大于3的素数,都可以用6n-5 和6n-1表达,或6n+1和6n+5来表示。
3.若”k”不是”6xy+x-y”的方程解,也就是”k≠6xy+x-y”,那么”6k-1″一定是个素数。 4.若”k”不是”6xy+-(x+y)”的方程解,也就是”k≠6xy+-(x+y)”,那么”6k+1″一定是个素数。
5.由3.和4.假设,素数集合是由两条元素不重复的独立集合。
6.质数的个数公式π(n)是不减函数。且素数的分布个数接近于x/ln (x),这是素数定理。
7.素数本身是不可能有传统意义上的通项公式。
8.任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,当代入1时候这种分解是无限的,去掉1时分解则是唯一的。
9.质数的个数是无限的。
10.所有大于10的质数中,个位数只有1,3,7,9。
11.若n为正整数,在n^2到(n+1)^2之间至少有一个质数。
12.若n为大于或等于2的正整数,在n到n!之间至少有一个质数
13.若质数p为不超过n(n≥4)的最大质数,则p>n/2。
14.两个连续素数最大间隔可以任意大。
15.任意大于5的奇数都可以表示为三个素数之和。
加密中数论基础知识,RSA加密算法及证明
记法
设n为正整数,a和b为整数,若a和b被n除后所得余数相同,
称a和b模n同余,记为a≡b(mod n);或 a≡b(% n)
此式被称为同余式。
或表达为:a % n =b % n 或 a mod n =b mod n;
若n能整除a则同余式表示为a ≡ 0(mod n)。
欧拉函数
对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(N)。即欧拉函数。
欧拉定理:
若N>2; a与N互质,则a^(φ(N)) ≡ 1 (mod N )
欧拉函数的性质:
(1) p^k型欧拉函数:
若N是质数p(即N=p), φ(N)= φ(p)=p-p^(k-1)=p-1。
若N是质数p的k次幂(即N=p^k),φ(N)=p^k-p^(k-1)=(p-1)p^(k-1)。
(2) mn型欧拉函数
若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3) 特殊性质:
若n为奇数时,φ(2n)=φ(n)。
费马小定理:
设任意整数a和素数p互素 ,则 a^p-1 ≡ 1(mod p)
运算规则
模运算与基本四则运算有些相似,但是除法例外。其规则如下:
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
(a^b) % p = ( (a % p)^b ) % p (4)
结合率:
((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
交换率:
(a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
分配率:
((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9)
重要定理
若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(10)
若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(11)
若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),
(a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (12)
若a≡b (% p),则对于任意的c,都有ac≡ bc (%p); (13)
RSA中重要的推论
m 和 n 是互质的正整数,则:
(a^m) %n = ((a%n)^m) %n
推论证明
a^m % n
=a*a ^(m-1) %n
=(a%n) *(a ^(m-1) %n ) % n //后续不断展开,一直至a ^0,即共有m项
=((a%n)^m) %n
推论中举例:
比如:2^3 mod 5
= (2 mod 5)^ 3 mod5
= 8 mod5
= 3
还有:3^3 mod 2
= (3 mod 2) ^3 mod 2
=1^3 mod 2
=1
加密思路:加密本质上是对加密内容的字节数组进行加密。不是对字符的本身进行加密。这样,整数对整数就可以进行相关的变换,即加密了。
比如:"I love Rust,Julia & Python, they are so cool! "的字节数组为:
[73, 32, 108, 111, 118, 101, 32, 82, 117, 115, 116,
44, 74, 117, 108, 105, 97, 32, 38, 32, 80, 121, 116,
104, 111, 110, 44, 32, 116, 104, 101, 121, 32,
97, 114, 101, 32, 115, 111, 32, 99, 111, 111, 108, 33, 32]
RSA加密算法为:
(1) 取两个大素数p,q (保密);
(2) 计算 n=p*q (公开), φ(n)=(p-1)*(q-1) (保密);
(3) 随机选取整数e,满足 gcd(e, φ(n))=1 (e与φ(n)互素)(公开);
(4) 计算 d 满足 d*e≡1 (mod φ(n)) (保密); (d为e的逆元,可通过扩展的欧几里得算法进行求解)
(5) {e,n}为公钥,{d,n}为私钥,也可以用{e,d}表示密钥对
(6) m为加密内容(如73),此时c为加密后的密文;
加密时 c = m^e mod n
解密时 m = c^d mod n
(7) m为签名内容,
签名时c = m^d mod n ;
解密时 m = m^e mod n
为什么RSA算法能保证其安全性?
要破解m =>
必须知道 d或e =>
必须知道 φ(n) =>
必须知道 p及q; =>
必须能破解 n=p*q =>
大质数因式分解的难度 => 公认
RSA证明
主要要证明m是否c^d mod n。由c = m^e mod n 。设M =m^e
证式
= c^d mod n
= (m^e mod n )^d mod n
= (M mod n) ^d mod n
= M^d mod n //见上面的推论
= m^(d*e )mod n ;
因为 d*e≡1 (mod φ(n))
得到:d*e =k *φ(n) +1 ; k是正整数。
上面证式还有,
= m^(k *φ(n) +1 ) mod n
= m^(k *φ(n))*m mod n //
= (m^(k *φ(n))mod n ) *(m mod n) mod n // 乘法
= 1 * m mod n // 由欧拉定理
= m
证毕。
所以解密的公式是对的。
埃拉托斯特尼筛法
求解第N个素数,求第 10,0000、100,0000、1000,0000 … 个素数(要求精确解)。
埃拉托斯特尼筛法(Sieve of Eratosthenes),这是一种非常古老但是非常有效的求解𝑝𝑛pn的方法,其原理非常简单:从2开始,将每个素数的各个倍数都标记成合数。其原理如下图所示:
龟虽寿
作者:曹操
神龟虽寿,犹有竟时;
腾蛇乘雾,终为土灰。
老骥伏枥,志在千里;
烈士暮年,壮心不已。
盈缩之期,不但在天;
养怡之福,可得永年。
幸甚至哉,歌以咏志。
程序编码就是对数学逻辑的具体实现
为什么你的代码一坨坨?其实来自你有那么多为什么你要这样写代码!
为什么你的代码那么多for循环?因为没有合理的数据结构和算法逻辑。
为什么你的代码那么多ifelse?因为缺少设计模式对业务场景的运用。
为什么你的程序应用复杂对接困难?因为没有良好的系统架构拆分和规划。
为什么你的程序逻辑开发交付慢返工多?因为不具备某些业务场景的开发经验。
为什么你的程序展现都是看上去不说人话?因为没有产品思维都是程序员逻辑的体现。
最终,所有的这些不合理交织在一起,就是你能看到的一坨坨的代码!所以,要想把代码写好、写美,写到自己愿意反复欣赏,那么基本需要你有一定的:基础能力(数据结构、算法逻辑、设计模式)、应用能力(系统架构、开发经验)、拓展能力(产品思维),这三方面综合起来才能更好的开发程序。
数据结构:数组、链表、红黑树 算法逻辑:哈希、扰动函数、负载因子、拉链寻址、
其实我们所开发的业务程序,哪怕是CRUD也都是对数学逻辑的具体实现过程。只不过简单的业务有简单的数学逻辑、复杂的业务有复杂的数学逻辑。数学逻辑是对数据结构的使用,(例如:把大象装进冰箱分几步)合理的数据的结构有利于数据逻辑的实现和复杂程度。
在我们常用的API中,HashMap 就是一个非常好的例子,既有非常好的数据结构的使用,也有强大的数学逻辑的实现。为此也让 HashMap 成为开发过程中非常常用的API,当然也成为面试过程中最常问的技术点。
完善的产品设计需要有对付杠精的思维
如:树上10只鸟开一枪还剩下几只,你会想到什么
- 开枪人有没有幻觉?
- 枪是真的吗?
- 手抢是无声的吗?
- 枪声大吗?
- 这个城市打鸟犯不犯法?
- 确定那只鸟被打死了?
- 树上的鸟有没有聋子?
- 有没有被关在笼子里或者绑在树上的鸟?
- 旁边还有其他树吗?
- 鸟是不是真的?
- 有残疾或者飞不动的鸟吗?
- 打鸟的人眼睛花没花?
- 保证是10只吗?
- 有没有那种不怕死的鸟?
- 会不会一枪打死两只或者更多?
- 所有的鸟都可以自由活动飞离树以外吗?
- 打死以后挂在树上还是掉下来了?
今天,我们共同祭奠同胞!
今天,南京大屠杀死难者国家公祭日
10:00,
南京全城正鸣笛致哀!
昭昭前事,惕惕后人!
岁末寒冬,祭奠同胞!
中国青年报·中国青年网 记者 李超/摄
我们以国之名悼念逝者
不为延续仇恨,只为警醒:吾辈自强!
1937年12月13日,侵华日军在南京城开始了
40多天惨绝人寰的大屠杀,30万同胞惨遭杀戮。
南京大屠杀真实影像(来源:央视新闻)
在那场持续6周的人间浩劫里,每隔12秒就有一人遇难。
劫后余生的幸存者留下了,难以抚平的伤痛和苦难记忆。
今年,又有4位南京大屠杀幸存者与世长辞。
截至目前,登记在册的在世幸存者仅剩73位。
△2020南京大屠杀幸存者百人群像实录(黑白照为已故幸存者)
“昭昭前事,惕惕后人。”
83年后,人们生活在和平年代,这段中华民族的屈辱历史,
我们却不敢忘、不能忘。
铭记,不仅牢记和平来之不易,还需汲取落后挨打的教训;
纪念,不为激起仇恨,只为立下誓言:吾辈当自强。
爱人,你就会被人爱。
Love and you will be loved。
爱人,你就会被人爱。
为什么看上去弱弱的女人总是比女强人受男人欢迎?
为什么很多男人劈腿后,最终会选择那个看上去更弱的女人?
原因只有1个——富兰克林效应。
感情幸福美满,只是因为懂得这一点
什么是富兰克林效应
1736年的某一天,富兰克林在宾夕法尼亚的议院发表演讲。另一位议员完全反对他的观点,于是也发表了一篇演讲,十分激烈地批评了富兰克林。
这让富兰克林有点措手不及,但是又想争取这位议员的同意。
怎么办呢?他无意中打听到这位议员的家里正好有一套非常稀有的图书。于是他十分恭敬地写了一封信,厚着脸皮向这个议员借书。
没想到这个议员竟然同意了,一个星期后富兰克林还书时郑重地表达了谢意。几天后当他们再次在议会厅见面时,富兰克林是这样描写的:
“他竟然主动跟我打招呼(以前从来没有过),后来我们谈话,他还表示,任何时候都愿意为我效劳。”
从此他们两人化敌为友,终生保持着友谊。所以后世的心理学家们得出一个结论:让别人喜欢你的最好方法不是去帮助他们,而是让他们来帮助你。
这就是著名的“富兰克林效应”的由来。
富兰克林效应对于爱情的影响
法国作家埃克苏佩里的《小王子》是一本有趣的寓言短篇小说,里面最让人印象深刻的是小王子与玫瑰的爱情故事。
故事中的小王子在一个小小的星球上生活。有一天,星球上忽然绽放了一朵娇艳的玫瑰花。
小王子从来见过这么美丽的花,于是他每天细心地呵护,精心地照料。
他当时觉得这是宇宙里唯一的一朵玫瑰,比所有的花都美。
后来,他来到地球,发现仅仅一个花园里就有5000朵几乎完全一样的玫瑰花。
那一刻他终于知道,他所拥有的只不过是一朵普通的花。这个发现,使小王子非常伤心。
尽管如此,他心里还是放不下自己的那一朵玫瑰。
直到有一天,一只小狐狸跟他说:”正因为你为你的玫瑰花费了时间和心血,才使你的玫瑰变得美丽。”
小王子终于恍然大悟:
一朵玫瑰花(一个女孩),重要吗?不重要。天底下有千千万万的玫瑰。可一旦你为这朵玫瑰花花费了时间,它就变得重要了,成了你的千千万万分之一,成了你的唯一。在你看来,它跟其他的玫瑰花,是截然不同的。这就是重要。或者说,这就是爱。爱,就是花费了时间。
金正昆的礼仪经典语录
礼仪是一门学问,更是一门交往的艺术。 礼仪就是形式美与内容美的统一。 痛苦来自于比较。
不要去过度追求完美,因为痛苦来自于欲望得不到满足。
聪明人不在非原则问题上否定别人。
你要做多大的事,你就要承受多大的压力。
人生最大的智慧在于理智的放弃。 世界不会因你而改变;心态决定一切。 有什么样的心态就会有什么样的人际关系,有什么样的心态就会有什么样生命的质量。 好心办坏事是常事,关心过度是一种伤害。
人说话的数量往往与社会地位成反比。 一个人腰带上挂东西的数量往往与社会地位成反比。 一个人的社会地位和他掌握的信息成正比。 文明的程度和守时成正比,和灌酒成反比。 在公共场合讲话的音量与个人修养成反比。 一个人的成功与他容忍别人的胸怀成正比。 游戏规则是由强者所制定的。
成功的交往要以对方为中心,交际高手是为别人创造表现的机会。
人的尊严是不容挑战的。
礼者敬人也,礼者养也。
有容乃大,宽容造就和谐。
真正的团结,离不开人们的宽容。
敌人往往是我们自已寻找和制造出来的。
让大家都喜欢你,往往是不可能的,但我们要争取更多的人喜欢我们。 人生在世,但求无愧我心。 有道德才高尚,有教养才文明,讲礼仪才能跟别人有效的沟通。 教养体现于细节,细节展示素质,细节决定成败。 不要拿别人折磨自己,更不要拿自己去折磨别人。 如果不是原则问题,不要随便对人家说yes or no。 礼仪即做人之道,学礼仪可以内强素质、外塑形象。 男人看表,女人看包;女人看头,男人看腰。 学会欣赏别人,身边的人都会成为天使,生活就会变得无比可爱;如果挑剔别人,身边的人就都成了恶魔,成为你的一个个对手。 善待别人就是善待自己。 昨天已经过去不必烦,明天没有到来烦不着,今天正在度过不能烦。 尊重别人就是尊重别人的选择。 让菜不夹菜,祝酒不劝酒。
怨天尤人的人是事业的失败者,发展自己才是硬道理。 在国际社会,吃东西发出声音是猪的基本特征。
君子和而不同,小人同而不和。——《论语》 金钱的价值在于有效的消费。
催化剂评价装置-沃德一站式服务,解决后顾之忧!
有钱不如心宽。 揭我死穴的肯定是我的朋友。 这个世界离开谁都在转,而且是匀速地转。 要善于示弱。智者示弱,愚者逞强。 有权力才有权利,有实力才有势力。 提出问题很容易,解决问题很难。 十里不同风,百里不同俗,千里不同情。 富兰克林法则:当你和别人接触时,畅所欲言永远有限制条件。 “Say no”是伤害人际关系的捷径。 勇敢地赞美别人,善于发现对方的优点并肯定。 真正善于沟通的人不拿自己的标准要求别人。 做人的最高境界——让别人接受你! 表扬的最高境界是在他希望表扬的人面前表扬他。 聊天的最高境界是对方感兴趣,或者擅长的话题。夸人的最高境界是对事不对人。
交往有三条规则:交往要注重结果,交往以对方为中心,为别人创造表现机会。 人际关系的成功=15%专业技术+85%为人处世。 学会换位思考,要善于聆听。智者善听,愚着善说。 智慧的人会把嘴放在心里,愚蠢的人会把心放在嘴上。
尊重上级是一种天职,尊重同事是一种本分,尊重下级是一种美德,尊重客户是一种常识,尊重对手是一种风度,尊重所有人是一种教养。
有良好道德的人不会诋毁自己的职业。 你要和别人合作,你就要学会适应别人。 生命是宝贵的,活着是幸福的,工作是美丽的。 人生有很多忧虑是自己妄想的。 快乐是送给自己最宝贵的礼物。
尊重女性就是尊重人类的母亲。 世界不会因为我而改变,世界上最能做好的事就是改变自我。 在公司,领导永远是正确的;在家里,老婆永远是正确的。 善待别人是一种教养,了解别人是一种智慧。
男人就是女人的钱包,不花白不花。 什么是爱情?爱情就是,有一个你爱的人,有一个爱你的人,这两个人应该是同一个人。 女人要为男人创造“表现”的机会。
立场决定观点,选择决定命运。 知识和技能可以让你谋生,与人合作、沟通的能力才能使你可持续发展 让老婆高兴是男人的职业道德。
表扬适合在公共场合进行;关于批评,则适合单独进行
江湖飘门律
什么是江湖飘门律?说起来很复杂,不是三言两语能讲清楚的。是旧时代走江湖的飘门卖艺人所遵循的一条行为准则,它与官方法律不一样,事实上是超出正常法度之外的一条容忍底线。
俗话说强龙不压地头蛇,走江湖的卖艺人就算有一身功夫,也不会轻易去惹麻烦。走江湖流浪各地。对地方上的各种帮会势力,遇上了通常都要拜码头,否则在人家的地盘上不好做生意。如果受了什么欺压。一般都会选择回避或忍让,尽量不起冲突。
就算有一身好功夫,假如真起了正面冲突,生意做不成不说,在不明底细的地方对付不明底细的势力,说不定会有无穷无尽的后患。但这种回避与忍让并不是没有底线的。在什么情况下江湖飘门中人一定会动手呢?
面对欺压做出退让的选择无非是两种情况,一是你低头对方也知道收手,二是即使你低头对方也不会手软。在第二种情况下不论你怎么回避,对方都不会放过你,如果不是对手的话,那就赶紧逃走吧。如果有那个能耐,或者就算不是对手也实在躲不掉,那就出手!
这就是江湖飘门律。
至于出手的后果如何,已经没法过多的考虑了,毕竟刀已经架在眼前。而六扇门的人还没有追到身边。
熵增
物理定义:熵增过程是一个自发的由有序向无序发展的过程(Bortz, 1986; Roth, 1993)。 热力学定义:熵增加,系统的总能量不变,但其中可用部分减少。
统计学定义:熵衡量系统的无序性。熵越高的系统就越难精确描述其微观状态。
早在1943年,在爱尔兰都柏林三一学院的多次演讲中,薛定谔就指出了熵增过程也必然体现在生命体系之中,其于1944年出版的著作《生命是什么》 中更是将其列为其基本观点,即“生命是非平衡系统并以负熵为生。”
人体是一个巨大的化学反应库,生命的代谢过程建立在生物化学反应的基础上。从某种角度来讲,生命的意义就在于具有抵抗自身熵增的能力,即具有熵减的能力。在人体的生命化学活动中,自发和非自发过程同时存在,相互依存,因为熵增的必然性,生命体不断地由有序走回无序,最终不可逆地走向老化死亡。
熵的定义
熵,热力学中表征物质状态的参量之一,用符号S表示,其物理意义是体系混乱程度的度量。
(1)经典热力学
1865年,克劳休斯将发现的新的状态函数命名为熵,用增量定义为 ,式中T为物质的热力学温度;dQ为熵增过程中加入物质的热量。若过程是不可逆的,则 ,下标“ir”是英文单词“irreversible‘’的缩写,表示加热过程所引起的变化过程是不可逆的。
合并以上两式可得 ,此式叫做克劳休斯不等式,是热力学中第二定律最普遍的表达式。
(2)统计热力学
熵的大小与体系的微观状态Ω有关,即S=klnΩ,其中k为玻尔兹曼常量,k=1.3807×10-23J·K-1。体系微观状态Ω是大量质点的体系经统计规律而得到的热力学概率,因此熵有统计意义,对只有几个、几十或几百分子的体系就无所谓熵。
熵的性质
(1)状态函数熵S是状态函数,具有加和(容量)性质(即对于系统M可分为M1与M2,则有SM=SM1+SM2),是广度量非守恒量,因为其定义式中的热量与物质的量成正比,但确定的状态有确定量。其变化量ΔS只决定于体系的始终态而与过程可逆与否无关。由于体系熵的变化值等于可逆过程热温商δQ/T之和,所以只能通过可逆过程求的体系的熵变。孤立体系的可逆变化或绝热可逆变化过程ΔS=0。
(2)宏观量熵是宏观量,是构成体系的大量微观离子集体表现出来的性质。它包括分子的平动、振动、转动、电子运动及核自旋运动所贡献的熵,谈论个别微观粒子的熵无意义。
(3)绝对值熵的绝对值不能由热力学第二定律确定。可根据量热数据由第三定律确定熵的绝对值,叫规定熵或量热法。还可由分子的微观结构数据用统计热力学的方法计算出熵的绝对值,叫统计熵或光谱熵。
真正的高手,都有对抗“熵增”的底层思维
原文:https://bbs.pinggu.org/thread-7046070-1-1.html
在1998年亚马逊致股东信里,贝佐斯说:“我们要反抗熵(We want to fight entropy)。”
管理学大师彼得·德鲁克说:“管理要做的只有一件事情,就是如何对抗熵增。在这个过程中,企业的生命力才会增加,而不是默默走向死亡。”
物理学家薛定谔说:“自然万物都趋向从有序到无序,即熵值增加。而生命需要通过不断抵消其生活中产生的正熵,使自己维持在一个稳定而低的熵水平上。生命以负熵为生。”
这么多人都在谈论熵,说要反抗熵,然而到底什么是熵?
什么是熵?
熵,是来自于物理学热力学第二定律的一个词。
当一个非活系统被独立出来,或是将它置于一个均匀环境里,所有运动就会由于周围各种摩擦力的作用很快停顿下来;电势或化学势的差别会逐渐消失;形成化合物倾向的物质也是如此;由于热传导的作用,温度也逐渐变得均匀。由此,整个系统最终慢慢退化成了毫无生气、死气沉沉的一团物质。
于是,就达到了被物理学家们成为的“最大熵”,这是一种持久不变的状态,在其中再也不会出现可以观察到的任何事件,它已经归于死寂。
熵代表了一个系统的混乱程度,或者说是无序程度 – 系统越无序,熵值就越大;系统越有序,熵值就越小。
所以,负熵代表着系统的活力,负熵越高就意味着系统越有序,这也是为什么薛定谔会说“生命以负熵为生”。
比如:在每周刚刚开始的时候,我们都会把房间收拾得窗明几净,可是一到周末,我们就会发现房间乱成一团。这个过程就是熵增的过程。
再比如:生命有机体在不断进行的吃、喝、呼吸以及(植物的)同化,也就是新陈代谢,正是一个对抗熵增的过程。
不要小看这个听起来非常朴素的熵定律,它在自然界中无处不在,是最基本也最重要的一个法则,化学家阿特金斯曾将它列为“推动宇宙的四大定律”之一。
它是物理学家心目中无比坚定的一个信仰,连引力公式都可以改写,但熵增定律却从未被违反。张首晟教授认为,人类的知识再往前推进,牛顿力学可能不对,量子力学可能不对,相对论可能也不对,但信息熵的公式却是永恒的。
如果将它推论至整个宇宙的发展中,我们就会发现:如果我们存在的这个宇宙之外什么都没有,也就是如果没人向这个宇宙输入能量的话,宇宙的最终结局就是走向彻底的无序,也就是死亡。
如果将它推论到企业管理中,我们就会发现:管理要做的只有一件事情,就是如何对抗熵增。如果没能有效对抗熵增,企业就会在默然中走向死亡。
如果将它推论到人生之中,我们就会发现:如果不去对抗熵增,我们的生命力就会在封闭系统内或平衡状态中逐渐变得毫无生气、死气沉沉。
那时,即使生命尚未终结,生命力也已戛然而止,也就印证了那句著名的话“很多人20岁时就已死去,到80岁才埋”。
然而,我们又该如何对抗熵增呢
对抗熵增的 人生底层逻辑
想要对抗熵增,就要引入一个非常重要的理论- 耗散结构。
“耗散结构”是由一位名叫普利高津的科学家提出的,他也因为这个理论而获得了1977年的诺贝尔化学奖。
什么是“耗散结构”?
耗散结构是一个远离平衡态的非线性的开放系统(不管是物理的、化学的、生物的乃至社会的、经济的系统),通过不断地与外界交换物质和能量,在系统内部某个参量的变化达到一定的阈值时,通过涨落,系统可能发生突变即非平衡相变,由原来的混沌无序状态转变为一种在时间上、空间上或功能上的有序状态。
耗散结构有两个最为重要的特性,一是开放性;二是非平衡。当一个系统具备了“耗散结构”后,它就能够有效对抗熵增。
那么,我们该如何依据这样两个特点将自己打造成一个可以对抗熵增的“耗散结构”呢?1
开放性
一个孤立系统的熵一定会随时间增大,当熵达到极大值时,系统就会达到最无序的平衡态,所以孤立系统绝不会出现耗散结构。
因此,耗散结构一定产生于开放系统,它必须存在着由环境流向系统的负熵流,而且能够抵消系统自身的熵增,只有这样才能使系统的熵减小,有序度增加。
维基百科与网络版的大英百科全书,都很专业,而维基百科却不需要有一群专家进行搜集编撰,它是一个开放系统,每个人都能为它贡献内容。也正因为此,它甚至拥有比网络版大英百科全书更高的传播度。
那么,我们该如何让自己成为一个开放系统呢?
1)用“成长型思维”替代“固定型思维”
很多人一直保持着这样一种观念,即我们天生有一些特定的固定不变的能力与品质,就像“我不善于运动”、“我没有学数学的天分”等,因此无法改变。
但真是这样吗?
实际上,人的智力、创造力、运动才能与其他品质,都是可以锻造的,是可以通过时间和努力去改变的。
2006年,斯坦福大学的行为心理学教授卡罗尔·德韦克出版了一本名为《思维模式:新成功心理学》的书。在这本书中,德韦克总结了自己30多年的研究成果,提出了两种思维理论:固定型思维和成长型思维。
固定型思维说的是,相信我们出生时带有固定量的才智与能力。采取固定型思维的人倾向于回避调整与失败,从而剥夺了自己过上富于体验与学习的生活。
而成长型思维则是一种以智力可塑为核心信念的系统的思维模式。它相信通过练习、坚持和努力,人类具有学习与成长的无限潜力。
拥有成长型思维的人能够沉着应对挑战,他们不怕犯错或难堪,而是专注于成长的过程。他们对于失败不害怕,因为他们知道从失败和错误中学习,它们终将变为成功。
正如科研大数据所告诉我们的:如果一个孩子拥有成长型思维,这项优势就可能消除最富有家庭与最贫穷家庭间的差距,因为成长型思维的孩子会越来越优秀。
从这个图表中,我们还能看到一点,也许是我们平时常常忽略的,那就是二者在对待其他人的成功这点上还有不同:成长型思维的人会将别人的成功当做自己的灵感,而固定型思维的人则会将别人的成功当做是对于自己的威胁,于是就会引发巨大的不安全感以及脆弱感。而这样一种不安全感和脆弱感,常常会让他选择堵住耳朵,闭上眼睛,于是也就切断了自我成长的渠道与途径,让整个情况变得更糟。
2)用“流量思维”代替“存量思维”
躺在书桌上的一堆油画颜料,不会自动变成一幅美妙的油画。一定是因为有了某种外界能量交换,比如,你拿起了画笔,打开了颜料,开始画画,颜料才能变成油画。
这是什么意思?
意思是说,只有在与外界交换能量之后,一个人才有可能发生翻天覆地的变化。这样的人就是有着“流量”思维的人,相反则是“存量思维”。
什么是“存量”思维者的典型行为?
相比在学习上给自己做出投资,他更愿意把钱存起来,让它产生利息;相比换个更适合更有前途的岗位或行业,他更愿意继续做现在这个安稳舒适的工作;相比将自己看到的好文章、好书推荐出去,他更愿意悄悄的收藏起来;相比与那些优秀者深入交流,他更愿意不让别人知道自己的想法。
可惜,如此一来,熵增就会加剧,危机就会潜伏。按照“熵增定律”,熵是繁荣有序的反面。然而,从表面来看,繁荣有序却是熵的隐性状态。
因此,当我们看到繁荣有序的表象时,以为熵并不存在,但实际恰恰相反,熵正在暗中窥伺。它不是不存在了,它只是隐形了。
1975年,24岁年轻的柯达工程师史蒂夫·萨松发明了世界上第一台数码相机,当他把这项惊人的成果呈现给公司高层的时候,傲慢的管理层对这个只能拍100·100像素的奇怪机器嗤之以鼻—“没有人愿意在电视上看他们的照片”,彼时的柯达在胶片时代笑傲群雄。
30十多年后,当柯达在2012申请破产保护的时候,当年的决策者们不会想到,敲响他们丧钟的正是他们自己公司发明并雪藏起来的数码相机。
历史总是惊人的相似,同样的事情还发生在了摩托罗拉和诺基亚的身上。死守“存量”,蔑视“流量”,终会带来“当下很好、未来很糟“的必然结果,而这个结果往往不是一般人能够承受的,就像清政府当年的”闭关锁国“政策一样。
2012年的时候,任正非有个非常重要的讲话,叫做《华为的2012》。
听起来他好像是在唱衰华,其实不然,他只是比较清醒地意识到华为作为一个企业,和所有其他企业一样,始终有一个巨大的威胁存在着,它就是熵。所以,任正非认为只要华为存在一天,都必须得对抗熵增。
他对华为也是这样做的:在华为的研发上做出巨额投入,比如华为2017年在研发上的投入超过900亿元的情况,研发投入占收入的近16%,这个研发的投入强度,可能比阿里和腾讯的研发投入总和都要大,更是超过了苹果。过去10年累计投入研发2400亿人民币,华为也已连续多年都是全球专利申请第一名。
从1997年开始,华为就开始持续引进来自外部的管理经验,包括IBM、埃森哲、波士顿咨询等。他们陆续给华为提供了多方面的变革,使华为在管理创新、组织机构创新、流程变革方面不断进步,奠定了华为成为一家全球化公司的根基。
这些,都是在用“流量思维”代替“存量思维”,作为一家国内知名公司,即使不做巨额科研投资,也可以既有“存量”为荣;然而,华为却并不这么想,它看到的是“流量”,是开放系统所需要的能量交换。
3)用“终身学习”代替“临时学习“,用”终身探索“代替”不再探索“
有人,每天都在学习,不论是多还是少。有人,偶尔学习一次,看一本书要用七八个月。
前者,我称之为“终身学习者”,后者,我称之为“临时学习者”。学习对于前者如同呼吸一般,对于后者则如同救急的膏药,只在受到刺激或工作需要之时,才会想起。
对于“终身学习者”而言,他通过每天学习,将自己打造成了一个开放的系统,并且能够产生复利效应。
对于“临时学习者”而言,他是封闭的体系,无力对抗熵增,也无法产生复利效应。短期内自然看不出来,但是长期来看,二者却有天壤之别。
很多人,在成年之后就不再探索了,他们停止了对于这个世界,以及对于自我的探索,他们只想走在那条早已明确的路上,按部就班的生活。但却不知,根据熵增定律,熵的阴影早已紧随其中,“中年危机”的到来也不过只是时间问题。
而那些”终身探索者“呢?
他们则很不同,他们对于这个世界、对自我、对他人,都始终有着浓烈的好奇之心,他们想要探索那些不懂的东西,想要解开那些难解的奥秘;不论是从一场电影、一次旅行、一本杂志,还是一次对话,他们都能从中探索到新鲜的信息、知识或智慧。他们就像是一些敞着口的容器,在贪婪的吸取着来自于外部世界的一切。
所以,如果想将自己打造成“开放系统”,就需要做到至少三件事:
- 第一,用“成长型思维”代替“固定型思维”。
- 第二,用“流量思维”代替“存量思维”。
- 第三,用“终身学习”代替“临时学习”,用“终身探索”代替“不再探索”。
2
远离平衡态
远离平衡态是“耗散结构”的第二个特点。
平衡态是指在没有外界影响条件下,热力学系统的各部分宏观性质在长时间里不发生变化的状态。
“耗散结构”的提出者普利高津认为,非平衡是有序之源。
那我们该怎样才能远离平衡态呢?
1)从“舒适区”走进“学习区”,甚至“恐慌区”
“舒适区”是美国人NoelTichy提出的理论,图里的3个区可以表示为你想学习事物的等级:
最里面一圈是“舒适区”,它代表的是对你来说没有学习难度的知识或者习以为常的事务,自己可以处于非常舒适的心理状态。
中间一圈是“学习区”,它代表的是那些对你来说有一定挑战,因而感到不适,但是不至于太难受的工作、学习、思考。
而最外一圈则是“恐慌区”,它代表的是超出你能力范围太多的事务或知识,心理感觉会严重不适,可能导致崩溃以致放弃学习。
在舒适区里,你能得心应手,因为每天都是处在熟悉的环境之中,做着自己在行的的事,和熟悉的人交际,甚至你就是这个领域的专家,对这个区域中的人和事感到非常舒适。
这就是暂时的“平衡态”,因为你无需过多努力就能使所有事物都达到一个相对平衡、比较舒适的状态。
然而,不要忘了,平衡态正是熵最大的时候。
这时,你学到的东西很少,进步缓慢,缺乏挑战和流动。这是一个看似平稳安逸,但却危机重重的状态,也就是“假性繁华”。
如果想要对抗人生熵增,按照耗散结构,你就须得远离平衡态,也就是离开那个让你感到非常舒适的区域,主动走向“学习区”,甚至是“恐慌区”。
亚马逊CEO贝佐斯就是这样做的,他将亚马逊的自营电商业务扩展到AWS云服务、FBA物流体系。而且,亚马逊在做自营电商的时候,还大胆引入了第三方卖家,让他们都在亚马逊上开店,跟自己的自营店竞争。亚马逊以网上卖书起家,但贝佐斯依然不甘心,开发出kindle阅读器用电子书打败自己的纸质书。
如果亚马逊只是停留在自己看似非常强大的自营电商业务里,在一段时间内,它当然能够获得不错的利润,达到一种稳固的平衡态。
但是,随着时间的推进,企业一定会越来越缺乏活力,缺乏创新,最终走向死亡。
正是因为贝佐斯非常清楚“熵”对于一个企业的严重危害,所以他在努力将亚马逊每一次好不容易建立好的平衡感推倒,不断把钱、把资源投入到新的领域;在企业内部创造各种形式的竞争。
也正因为此,亚马逊创造了重量级的明星业务,贝佐斯也成为了全球首富,这就是远离平衡态的巨大力量。
2)颠覆式成长
个人成长遵循的是S型曲线,在刚开始的时候,会有非常漫长的平坦状态,而后则会如火箭般骤然升空,并最终在高位保持平稳。
但这还不是颠覆式成长。
颠覆式成长不仅是一次S型曲线的飞越,它是很多次的飞越,它要求我们在完成一次S型曲线的增长后,再进入到第二条S型曲线,重新来过,不断颠覆自我。
2007年,IPOD占苹果公司收入的50%以上,iTune占74%的市场份额。按理说这正是一个产品如日中天之时,正常人的思路肯定是要继续做这个产品,用它好好赚钱。可乔布斯倒好,他要亲手颠覆掉这个已经大获成功的产品。
于是,他又做了iPhone,到2012年的时候,iPhone已经占到了苹果收入的58%,利润占到了70%。这就是乔布斯的“颠覆式成长”,他用自己做的iPhone颠覆掉了自己做的IPOD。他用一条新的S型曲线,颠覆掉了好不容易攀爬上去的S型曲线。
想要远离平衡态也是如此,需要一次又一次的走在漫长的平路上,然后跃上巅峰,在好不容易跃上巅峰之后,又要开始第二条S型曲线,就这样,不断进行自我颠覆。
而这种自我颠覆之所以很难,是因为当我们一旦到达S型曲线的上方平台,惰性就会产生。这时,是某阶段职业生涯的巅峰期,是某阶段自我发展的巅峰期,是一个看起来非常不错的状态。然而,如果一旦在这个平衡态停滞,你便不再获得成长与进步,最终的结局就是熵增加剧。
于我而言,在工作后至少做过几次非常大的颠覆式成长。
从销售部到市场部,后又从市场部到销售部;从以前在职场工作,到现在的自主工作,每一次都是颠覆式的成长。
在每一次颠覆式成长的过程中,从来都不是一帆风顺的,每次都会遇到很多的困难和阻碍,以及随之而来的孤独感与恐惧感,但得到的收获却是非常巨大的,我的人生也随之得到了极大的拓展。
那么,现在就来总结一下,两个远离平衡态的方法:
- 第一,离开舒适区,走进学习区,甚至是恐慌区。
- 第二,颠覆式成长。
这就是物理学中的熵增定律带给我们的人生底层逻辑 – 终其一生,我们都要对抗熵增,不然我们的生命力就会在默然中走向消亡。
而对抗熵增的方法就是:将自己打造成一个兼具“成长型思维”、“流量思维”、“终身学习、终身探索”、远离舒适区、能够持续颠覆式成长的耗散结构。
人类的界门纲目科属种
人类的分类:
域:真核域 Eukarya
界:动物du界zhi Animalia
门:脊索动物门 Chordata
亚门:脊椎动物亚门 Vertebrata
纲:dao哺乳纲 Mammalia
亚纲:真兽亚纲 Eutheria
目:灵长目 Primates
科:人科 Hominidae
属:人属 Homo
种:智人种(Homo sapiens sapiens)
另外,黄、黑、白种人都是同一个种,但是要细分的话还可以分出区别来,但这种区别就不是生物学上得了,所以不进行讨论(按照那种详细的分类法分的话,人种并不只有黑白黄三种,还有更多,貌似是5种,但另两种非常稀少)。
至于没有与人类同一个属但不同种的生物,可以说,以前是有的,包括:
◆卢多尔夫人(Homo rudolfensis),◆能人(Homo habilis),◆(Homo antecessor),◆直立人(Homo erectus),◆Homo ergaster(巨人、东非直立人、匠人等多种翻译),◆海德堡人(Homo heidelbergensis),◆尼安德特人(Homo neanderthalensis),◆克罗马侬人(Homo sapiens),◆弗洛里斯人(Homo floresiensis)和◆爪哇人(Homo erectus)。
但是这些都已经灭绝了,所以现在只有1种,就是智人。
另外“克罗马侬人和尼安德特人的后代存在于我们现代人之中(比如诺曼第人)”的疑问,目前学术界确实存在着一些类似的观点,认为他们应该已经通过通婚等方式和智人融合了,而不是像传统观点认为的那样单纯的被智人所取代。但是无论是传统观点还是新近的观点,两者都没有找到足够的考古学或者古生物学证据来支持自己的观点。
汉明距离
汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如: 1011101 与 1001001 之间的汉明距离是 2。 2143896 与 2233796 之间的汉明距离是 3。 “toned” 与 “roses” 之间的汉明距离是 3。
汉明重量是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。
对于固定的长度 n,汉明距离是该长度字符向量空间上的度量,很显然它满足非负、唯一及对称性,并且可以很容易地通过完全归纳法证明它满足三角不等式。 如果把a和b两个单词看作是向量空间中的元素,则它们之间的汉明距离等于它们汉明重量的差a-b。如果是二进制字符串a和b,汉明距离等于它们汉明重量的和a+b或者a和b汉明重量的异或a XOR b。汉明距离也等于一个n维的超立方体上两个顶点间的曼哈顿距离,n指的是单词的长度。 给予两个任何的字码,10001001和10110001,即可决定有多少个相对位是不一样的。在此例中,有三个位不同。要决定有多少个位不同,只需将exclusive OR运算加诸于两个字码就可以,并在结果中计算有多个为1的位。
曼哈顿距离
欧氏距离是人们在解析几何里最常用的一种计算方法,但是计算起来比较复杂,要平方,加和,再开方,而人们在空间几何中度量距离很多场合其实是可以做一些简化的。曼哈顿距离就是由 19 世纪著名的德国犹太人数学家赫尔曼·闵可夫斯基发明的(图 1)。
赫尔曼·闵可夫斯基
赫尔曼·闵可夫斯基在少年时期就在数学方面表现出极高的天分,他是后来四维时空理论的创立者,也曾经是著名物理学家爱因斯坦的老师。
曼哈顿距离也叫出租车距离,用来标明两个点在标准坐标系上的绝对轴距总和。
欧氏距离里的距离计算:
曼哈顿距离中的距离计算:
曼哈顿距离中的距离计算公式比欧氏距离的计算公式看起来简洁很多,只需要把两个点坐标的 x 坐标相减取绝对值,y 坐标相减取绝对值,再加和。
从公式定义上看,曼哈顿距离一定是一个非负数,距离最小的情况就是两个点重合,距离为 0,这一点和欧氏距离一样。曼哈顿距离和欧氏距离的意义相近,也是为了描述两个点之间的距离,不同的是曼哈顿距离只需要做加减法,这使得计算机在大量的计算过程中代价更低,而且会消除在开平方过程中取近似值而带来的误差。不仅如此,曼哈顿距离在人脱离计算机做计算的时候也会很方便。
Java Synchronized 关键字
Synchronized是基于monitor实现的,Synchronized经过编译后,会在同步块前后分别形成monitorenter和monitorexit两个字节码指令,在执行monitorenter指令时,首先要尝试获取对象锁,如果对象没有别锁定,或者当前已经拥有这个对象锁,把锁的计数器加1,相应的在执行monitorexit指令时,会将计数器减1,当计数器为0时,锁就被释放了。
如果获取锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
synchronized底层语义原理
Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现, 无论是显式同步(有明确的 monitorenter 和 monitorexit 指令,即同步代码块)还是隐式同步都是如此。在 Java 语言中,同步用的最多的地方可能是被 synchronized 修饰的同步方法。
同步方法 并不是由 monitorenter 和 monitorexit 指令来实现同步的,而是由方法调用指令读取运行时常量池中方法的 ACC_SYNCHRONIZED 标志来隐式实现的,关于这点,稍后详细分析。
下面先来了解一个概念Java对象头,这对深入理解synchronized实现原理非常关键。
synchronized特点:可重入锁/排他锁/属于jvm,由jvm实现
可重入锁实现可重入性原理或机制是:
每一个锁关联一个线程持有者和计数器,当计数器为 0 时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;
当某一线程请求成功后,JVM会记下锁的持有线程,并且将计数器置为 1;此时其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;当线程退出同步代码块时,计数器会递减,如果计数器为 0,则释放该锁。
synchronized保证可见性
JMM关于synchronized的两条规定:
1)线程解锁前,必须把共享变量的最新值刷新到主内存中
2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值
锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级。
在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。
实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。
填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐,这点了解即可。
Java头对象,它实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的,jvm中采用2个字来存储对象头(如果对象是数组则会分配3个字,多出来的1个字记录的是数组长度),其主要结构是由Mark Word 和 Class Metadata Address 组成
轻量级锁和偏向锁是Java 6 对 synchronized 锁进行优化后新增加的,重量级锁也就是通常说synchronized的对象锁,锁标识位为10,其中指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。
每个对象都存在着一个 monitor 与之关联,对象与其 monitor 之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个 monitor 被某个线程持有后,它便处于锁定状态。
在Java虚拟机(HotSpot)中,monitor是由ObjectMonitor实现的,其主要数据结构如下(位于HotSpot虚拟机源码ObjectMonitor.hpp文件,C++实现的)
ObjectMonitor() {
_header = NULL;
_count = 0; //记录个数
_waiters = 0,
_recursions = 0;
_object = NULL;
_owner = NULL;
_WaitSet = NULL; //处于wait状态的线程,会被加入到_WaitSet
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ;
FreeNext = NULL ;
_EntryList = NULL ; //处于等待锁block状态的线程,会被加入到该列表
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}
ObjectMonitor中有两个队列,_WaitSet 和 _EntryList,用来保存ObjectWaiter对象列表( 每个等待锁的线程都会被封装成ObjectWaiter对象),_owner指向持有ObjectMonitor对象的线程,当多个线程同时访问一段同步代码时。
首先会进入 _EntryList 集合,当线程获取到对象的monitor后进入_Owner区域并把monitor中的owner变量设置为当前线程同时monitor中的计数器count加1,若线程调用 wait() 方法,将释放当前持有的monitor,owner变量恢复为null,count自减1,同时该线程进入 WaitSet集合中等待被唤醒。
若当前线程执行完毕也将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)。
monitor对象存在于每个Java对象的对象头中(存储的指针的指向),synchronized锁便是通过这种方式获取锁的,也是为什么Java中任意对象可以作为锁的原因,同时也是notify/notifyAll/wait等方法存在于顶级对象Object中的原因
Makefile基本结构
基本格式
target ... : prerequisites ... command ... ...
这是一个文件的依赖关系,也就是说,target 这一个或多个的目标文件依赖于 prerequisites 中的文件,其生成规则定义在 command 中。值得注意的是,在 Makefile 中的命令,必须要以[Tab]键开始。
变量定义与预定义变量
对于在Makefile中重复出现的文件,可以将其自定义成我们所命名的变量。在Makefile中变量一般都是字符串,有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
在Makefile中有许多变量预先就定义好了,可供我们直接调用。常用的预定义变量:
$* 不包含扩展名的目标文件名称。
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$< 第一个依赖文件的名称。
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
$@ 目标的完整名称。
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$% 如果目标是归档成员,则该变量表示目标的归档成员名称。
使用通配符
在Makefile的编写中我们也可以用到我们平时使用到的通配符。如:星号代表任意个任意字符,*.o代表文件夹中所有.o文件。
显示规则与注释
make 会把其要执行的命令行在命令执行前输出到屏幕上。当我们用“@”字符在命令行前,那么,这个命令将不被 make 显示出来。
如果 make 执行时,带入 make 参数“-n”或“–just-print”,那么其只是显示命令,但不会执行命令,这个功能可以用来调试我们的Makefile,观察我们编写的Makefile的执行顺序。而 make 参数“-s”或“–slient”则是全面禁止命令的显示。
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,类似于C/C++中的“//”一样。
隐晦规则
在我们使用 Makefile 时,有一些我们会经常使用,而且使用频率非常高的东西,make其实是预先规定好的,其具有自动推导的功能,它可以自动推导文件以及文件依赖关系后面的命令,如.o文件由.c文件编译而来,它们之间的依赖关系是预先就设定好的,于是我们就没必要去在每一个.o文件后都写上类似的命令
Makefile可以嵌套执行,在大型的工程项目中,我们将不同的模块放在不同的文件夹,然后为每个文件夹编写相应的Makefile,有利于我们Makefile的维护。
网络硬件卸载
OpenStack的Pike版本中引入了对switchdev的支持,实现了Open vSwitch硬件卸载offloading功能。本文简介一下网络硬件卸载。
网络Offload:
说起网络offload,主要是指将原本在内核网络协议栈中进行的IP分片、TCP分段、重组、checksum校验等操作,转移到网卡硬件中进行,CPU的发包路径更短,消耗更低,提高处理性能。
一开始这些offload功能都是在网卡上针对特定功能设计一个专门的电路并且带有很小的缓存,去做专门的事情。后来直接在网卡上部署一个可编程的通用的小型CPU,一般称为网络协处理器。就是现在的智能网卡。智能网卡的协处理器可以先对该数据包进行一些预处理,根据处理结果考虑是不是要把数据包发送给主机CPU,智能网卡中的offload功能一般是使用eBPF编程来实现的。
交换offload:
Linux 4.0引入了一个switchdev框架,它代表一类拥有“交换”能力芯片的多网口设备的抽象。其中每一个网口就是一个port,在switchdev框架中被注册成一个net_device。
switchdev起源于Open vSwitch项目,由Jiři Pirko在2014年9月首次提出。在2015年2月的Netdev 0.1会议上,网络开发人员决定扩展并采用switchdev作为硬件交换机芯片的通用解决方案。switchdev驱动模型出现之前,Linux需要交换机厂商的专门工具套件操作交换机,而在switchdev驱动模型之后,通用接口被实现,交换机正式纳入Linux网络设备体系,Linux可以用标准接口实现交换机的控制面和管理面。
架构:
在switchdev驱动框架下,硬件交换机设备上的每个物理端口都在内核中注册为一个net_device,就像对现有的网络接口卡(nic)所做的那样。可以使用现有的工具(如桥接、ip和iproute2)将端口绑定或桥接、隧道化或划分vlan。switchdev驱动程序的优点是这样的交换结构可以被卸载到交换机硬件上。因此,驱动程序将转发数据库(FDB)中的每个条目镜像到硬件,并监视其更改情况。
内核中switch架构图如下:
最初,switchdev支持的唯一设备是QEMU的“rocker”软件交换机。后来Mellanox和Broadcom等公司均提供了支持switchdev的交换机器。
OpenStack Pike版本中引入了对switchdev的支持,实现了Open vSwitch硬件卸载offloading功能。
OpenStack官方文档关于网络offload部分描述:
Supported Ethernet controllers:
The following manufacturers are known to work:
Mellanox ConnectX-4 NIC (VLAN Offload)
Mellanox ConnectX-4 Lx/ConnectX-5 NICs (VLAN/VXLAN Offload)
Prerequisites:
Linux Kernel >= 4.13
Open vSwitch >= 2.8
iproute >= 4.12
Mellanox NIC