0%

Git是目前世界上最先进的分布式版本控制系统,本文是对 git 的原理与用法的总结笔记。

阅读全文 »

HTTP 协议的通信只能由客户端发起,这种单向请求的特点对于聊天室等场景并不适用。如果服务器有连续状态变化,客户端要获知就非常麻烦。轮询是常见的方法,但是轮询效率低,非常浪费资源。WebSocket 协议在2008年诞生,2011年成为国际标准,所有浏览器都已经支持。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

阅读全文 »

Base64是一种基于64个可打印字符来表示二进制数据的方法。

当我们用文本编辑器打开jpgpdfexe这些文件格式的时候,会看到一大堆的乱码,这是因为二进制文件包含很多无法显示和打印的字符。所以,如果想要让记事本这样的文本编辑器处理二进制数据,就需要一个从二进制到字符串的转换方法。Base64就是一种最常见的二进制编码方法

阅读全文 »

简述malloc实现原理

malloc可以分别由伙伴系统或基于链表的实现;

  • 它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表;
  • 调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。
  • 调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。
阅读全文 »

__attribute__是在C, C++, Objective-C语言中使用的编译指令,一般以__attribute__(xxx)的形式出现在代码中,方便开发者向编译器表达某种要求,参与控制如Static Analyzer、Name Mangling、Code Generation等过程。

阅读全文 »

我们先来研究 C 语言的调用惯例,使用 GCC1Clang2 编译器将 C 语言编译成汇编代码是分析它调用惯例的最好方法,从汇编语言中可以一窥函数调用的具体过程。

GCC 和 Clang 编译相同 C 语言代码可能会生成不同的汇编指令,不过生成的代码在结构上不会有太大的区别,所以对只想理解调用惯例的人来说没有太多影响。作者在本节中选择使用 GCC 编译器来编译 C 语言:

阅读全文 »

LaTeX是基于TeX的文档排版系统。TeX是当初Knuth教授为了写作TAOCP而开发的个人排版软件,而LaTeX是Lamport博士为了编写自己的书籍而设计的。LaTeX实际上就是用TeX语言编写的一套宏代码,拥有比原来TeX格式(plain TeX)更为规范的命令和一整套预定义的格式,隐藏了不少排版上的细节。

阅读全文 »

GDB(GNU Debugger)是GCC的调试工具。其功能强大,现描述如下:
GDB主要帮忙你完成下面四个方面的功能:

  • 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  • 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
  • 当程序被停住时,可以检查此时你的程序中所发生的事。
  • 动态的改变你程序的执行环境。
阅读全文 »

如今很多系统管理员依然通过组合使用诸如ifconfig、route、arp和netstat等命令行工具(统称为net-tools)来配置网络功能,解决网络故障。net-tools起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2。

作为网络配置工具的一份子,iproute2的出现旨在从功能上取代net-tools。net-tools通过 procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言,iproute2的用户接口比net-tools显得更加直观。比如,各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象。更重要的是,到目前为止,iproute2仍处在持续开发中。

阅读全文 »