摘要:intro 作为一个分布式虚拟化系统,网络在k8s中有重要意义。不同node上pod如何基于网络进行通讯是一个需要解决的基本/重要问题。在k8s的Networking and Network Policy中提到了常用的网络策略。其中的列表显然是按照字典序(而不是使用频率)排列,其中提到了比较常用的f
阅读全文
摘要:一、C库对于fs值的分配 glibc-2.11\nptl\sysdeps\x86_64\tls.h线程创建时的逻辑,可以看到是执行的ARCH_SET_FS接口设置的/* Code to initially initialize the thread pointer. This might need
阅读全文
摘要:一、为什么遇到这个问题 大致来说,可能是对于日志模块,我们可能需要将用户提供字符串进行格式化之后打印。但是这个用户提供的字符串本身可能千奇百怪,如果其中包含了一些特殊的格式化符号,如果不加特殊处理,则可能会导致一些意外的问题。如果只是"%s"其实还好说,这个如果访问地址非法则直接当场吐核。更坑的是如
阅读全文
摘要:一、主要的问题 这里主要讨论的是C++中全局/静态局部对象析构函数的执行时机问题。我们知道:全局变量的初始化时在main函数执行之前完成,静态局部变量的初始化是在首次执行到所在函数时执行。但是这些对象的析构函数在什么时候执行,它们在多线程中的表象又是如何?下面首先看下例子:tsecer@harry:
阅读全文
摘要:一、协程基础 按照执行单位从大到小的粒度区分,最早的执行单位就是进程(或者linux内核中所说的task)、之后为了资源共享,又有了线程的概念。线程在内核中成为基础的执行单位。线程这个概念对内核来说也是可见的,也就是说内核为了支持线程和进程的机制做过相关的处理,但是在linux下,这个处理的大部分工
阅读全文
摘要:一、多线程与析构函数这个是在C++编码中可能存在的一个问题,假设说一个线程执行了局部变量的构造函数之后,没有退出局部对象作用域之前,它主动退出线程(pthread_exit)或者被动退出线程(pthread_kill ed),那么这个局部变量的析构函数是否会执行?这个问题对于通常的程序来说影响并不大
阅读全文
摘要:一、动态链接工具ldd和ldconfig是动态链接的两个重要辅助工具,所谓“辅助”,是相对于真正的主角动态链接器ld.so,说它是工具,是只它相对于配置文件/etc/ld.so.conf文件。ldd不直接参与链接过程,它依赖于ld.so,但是ld.so不依赖于这个工具,事实上,ldd只是一个脚本,它
阅读全文
摘要:一、动态搜索与静态搜索这里的动态搜索是指通过dlopen+dlsym来搜索动态库符号的过程,而静态搜索则是指程序在运行的过程中的惰性链接实现。这里其实又是一个比较边界的问题,但是也是可能存在的,另外这些问题可以促使感兴趣的同学看一下真正的实现代码。问题是这样的:假设说一个静态链接的文件通过dlope
阅读全文
摘要:一、so文件的加载地址so文件一般在程序刚启动的时候由动态连接器映射入可执行程序的地址空间,也可以通过dl库中的dlopen来映射入可执行程序的地址空间中,它的底层实现都是通过mmap来实现,这个没有什么好说的。通常来说,我们自己使用的so文件是很少主动确定so文件加载入内存的地址,所以so文件运行
阅读全文
摘要:一、so文件和exe文件这两种文件其实具有很多相似自出,或者说so文件是介于obj文件和exe文件的一种中间过渡形式,它虽然不能直接运行(但是经过特殊编写的so文件内核是支持加载运行的,例如ld.so),但是具有了自己的一些更为高级的内容,例如一些初始化节,got表等内容,虽然孱弱,但是它具有了更加
阅读全文
摘要:一、动态链接在Linux(unix族谱)下,共享目标文件称为so文件,它和windows下的DLL机制对应,该功能在节省物理内存使用量上有重要意义,但是更重要的它还是一种扩展框架,也就是很多所谓的“插件”的实现基础。从它的出现频率上来看,它和Linux下的多线程具有同等重要的地位,甚至更高。因为很多
阅读全文
摘要:一、goto情节goto或许相当于白垩纪时期的恐龙,曾经横行于整个地球,但是它的命运和和恐龙一样,最后逐渐绝迹。Dijstra老师第一个对goto拍案而起,痛陈该指令的危害,正如我们现在看有些代码的感受:写代码的人爽了,维护的人哭了。曾经抓住BASIC语言的尾巴,见到过早期的BASIC语言写的程序,
阅读全文
摘要:一、uclibc中posix thread实现在早期Linux内核对象线程支持不是那么贴心的时候,用户态的posix线程实现也很蹩脚,通俗的说,就是上梁不正下梁歪。对于Unix下重要的posix线程库,libc的实现是通过所谓的LinuxThread模型来实现的,这个是试图在内核不支持线程的基础上模
阅读全文
摘要:一、glibc中powerpc的backtrace实现这个函数是C库提供的堆栈回溯功能,实现原理也不复杂,就是从堆栈中寻找函数返回地址,只是powerpc里使用了内联汇编。int__backtrace (void **array, int size){ struct layout *current;
阅读全文
摘要:一、杀死线程这个名字并不像中文"杀死"对应的那样暴力,而是使用了一个相对比较糖衣炮弹的名字,pthread_cancel。事实上,这个中文对应的pthread_kill有另外专门的作用,就是向指定特殊线程发送信号。这里比较感兴趣的是pthread_cancel是如何实现的,它发送的信号是什么信号,为
阅读全文
摘要:一、问题有时候,一个用户态的监控任务可能要定期的获得系统的某个状态,例如CPU利用率,进程切换次数、甚至maps的布局等信息,这些信息一般都是通过内核的proc文件系统来获得。由于是周期性的获得这些信息,为了避免临时抱佛脚,可以在模块初始化的时候打开这个文件,然后下次就不同通过open系统调用,进而
阅读全文