Blog

栈溢出实例

栈溢出实例 #

先看一下代码:

#include <stdio.h>
#include <stdlib.h>
#define BUFFER_LEN 24
void bad() {
    printf("Haha, I am hacked.\n");
    exit(1);
}
void copy(char* dst, char* src, int n) {
    int i;
    for (i = 0; i < n; i++) {
        dst[i] = src[i];
    }
}
void test(char* t, int n) {
    char s[16];
    copy(s, t, n);
}
int main() {
    char t[BUFFER_LEN] = {
        'w', 'o', 'l', 'd',
        'a', 'b', 'a', 'b', 'a', 'b',
        'a', 'b', 'a', 'b', 'a', 'b',
    };
    int n = BUFFER_LEN - 8;
    int i = 0;
    for (; i < 8; i++) {
        t[n+i] = (char)((((long)(&bad)) >> (i*8)) & 0xff);
    }
    test(t, BUFFER_LEN);
    printf("hello\n");
}

你可以用 gcc 编译器来编译上面这个程序:

...

StackOverflow的原理

Content #

栈空间耗尽,会出现 StackOverflow。这里的原理是,操作系统会在栈空间的尾部设置一个禁止读写的页,一旦栈增长到尾部,操作系统就可以通过中断探知程序在访问栈末端。

Viewpoint #

From #

把无助的状况转变为新的心流活动

Content #

为什么有些人的力量被压力削弱,有些人却变得更坚强?答案很简单,懂得如何把无助的状况转变为新的心流活动,并加以控制的人,会为自己找到乐趣,在考验中锻炼得更坚强。这样的转变可以分三个步骤来讨论:

  1. 不自觉的自我肯定。

罗根曾对受过严格体能折磨的人做过一项研究,这些人包括单独到北极流浪的探险家、集中营的囚犯等,他们共有的心态就是,深信命运掌握在自己手中,我们不妨说他们是自信,但同时他们的自我又似乎并不存在:他们一点儿也不以自我为中心,他们的能量不用于控制环境,而是致力于寻求一种与环境和谐共存的途径。

抱持这种态度的人,不把环境视为敌人,也不坚持自己的目标和企图必须凌驾于一切事物之上。他只觉得自己是周遭的一部分,应当在运作的体系当中尽一己之力。而矛盾的是,承认自己的目标或许是一个更伟大的实体的附庸,为了成功,可以遵守一套并非出于自己选择的游戏规则,往往是强者必备的特征。

  1. 注意力集中于外界。

注意力集中于外界。注意力向内集中时,精神能量都被自我的关注与欲望吸收,很难再去观察周遭环境。懂得如何把压力转换成充满乐趣的挑战的人,很少花时间想到自己,他们不会把所有的能量都用在满足自己的需求上,或为受社会制约的欲望烦恼。相反,他们的注意力随时保持警觉,不断处理来自周遭环境的资讯。注意焦点仍由个人的目标决定,但尤需保持开放,随时注意外界的变化,做出相应的调整,尽管这些变化不见得跟他想要实现的目标直接相关。

  1. 找寻新出路。

应付造成精神熵的状况,有两种基本的方法:一种是把注意力集中在阻挠我们实现目标的障碍上,消除它,并重建意识的和谐,这种方法比较直接;另一种是把注意力集中于整个状况,包括自己在内,探讨有没有其他更合适的目标,寻求不同的解决之道。

Viewpoint #

From #

缓存击穿(HotspotInvalid)

缓存击穿(Hotspot Invalid )指的是什么?一般会发生在什么时候? #

缓存击穿是指,针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增,会影响数据库处理其他请求。

缓存击穿的情况,经常发生在热点数据过期失效时。

Viewpoint #

From #

过期数据删除策略

Question #

Redis 的过期数据删除策略有哪两种?

Answer #

  1. 惰性删除策略。当一个数据的过期时间到了以后,并不会立即删除数据,而是等到再有请求来读写这个数据时,对数据进行检查,如果发现数据已经过期了,再删除这个数据。
  2. 定期删除策略。 Redis 每隔一段时间(默认 100ms),就会随机选出一定数量的数据,检查它们是否过期,并把其中过期的数据删除,这样就可以及时释放一些内存。

Viewpoint #

From #

toc:Kubernetes

Content #

YAML思维导图 YAML(k8s)编写技巧 minikube Kubernetes 的基本架构 CNI,CRI与OCI Kubernetes调用containerd的两种链路 CronJob与Job与Pod之间的嵌套关系 Deployment和Pod的组合关系 TypeMeta的组成 limits与requests的区别 Hairpin Mode Endpoints的含义 污点(taint)和容忍度(toleration) 让pod容忍污点(tolerations)

kubectl #

删除Taint 显示详细执行过程(–v=9)

subs #

sub:Pod(Kubernetes) sub:DaemonSet sub:Service(Kubernetes) sub:ConfigMap sub:PersistentVolume

TypeMeta的组成

TypeMeta 是Kubernetes 对象的最基本定义,它由哪三部分组成? #

TypeMeta 通过GKV(Group,Kind,Version)模型定义了一个对象的类型。

  1. Group

Kubernetes 定义了非常多的对象,如何将这些对象进行归类是一门学问,将对象依据其功能范围归入不同的分组,比如把支撑最基本功能的对象归入core 组,把与应用部署有关的对象归入apps 组,会使这些对象的可维护性和可理解性更高。

  1. Kind

定义一个对象的基本类型,比如Node、Pod、Deployment 等。

  1. Version

社区每个季度会推出一个Kubernetes 版本,随着Kubernetes 版本的演进,对象从创建之初到能够完全生产化就绪的版本是不断变化的。

Viewpoint #

From #

swappiness

Question #

Linux中swappiness(/proc/sys/vm/swappiness)的取值范围在 0 到 100,值为 100、60和0时,系统都会表现出什么样的行为?

  1. 值为 100 的时候系统平等回收匿名内存和 Page Cache 内存;
  2. 一般缺省值为 60,就是优先回收 Page Cache;
  3. swappiness 为 0,不能完全禁止 Swap 分区的使用,在内存紧张的时候,也会使用 Swap 来回收匿名内存。

swappiness 可以决定系统将会有多频繁地使用交换分区。一个较高的值会使得内核更频繁地使用交换分区,而一个较低的取值,则代表着内核会尽量避免使用交换分区。swappiness 的取值范围是 0–100,缺省值 60。

Viewpoint #

From #

刻意练习适用的领域

在什么领域里,刻意练习是最有用的? #

  1. 有严格固定规则的领域,练习的作用最大,没有严格规则的领域,练习的作用非常有限。比如国际象棋的练习时间就能够解释26%的表现,音乐能够有 21%。教育、编程、航空飞行等职业中,只能解释不到10%。
  2. 环境局面越是可控,可预测的,练习的作用越大,局面如果是复杂多变不可预测的,练习的作用就很小。

Viewpoint #

From #