使用 C 尝试内存管理

在之前苦读『垃圾回收的算法与实现』,也想着什么时候能够自己手动实现一把。加上自己对 redis 也还是算熟悉,也是知道他的内存碎片问题的严重性。所以,就想着这两者结合看看能有什么好玩的地方。 首先就是,如何进行内存的管理。众所周知,C 的内存管理通常使用 malloc 和 free 两个操作进行,于是乎,如果我们需要进行申请堆区的内存空间,(以下的讨论通通以堆区申请内存空间为主,栈区分配的内存通通不考虑),往往就会直接的 malloc(sizeof(xx)),然后再在不需要的时候直接调用 free 进行。但是,操作系统在进行内存分配的时候,并不能保证多次 malloc 的物理空间地址连续,加上内存的换页,就会导致性能的低下,操作系统需要不停的进行换页操作。 而且,在 MacOS(10.13.1) 上,malloc 的策略是,如果有可用的连续空间,直接分配,如果... [阅读全文]

Ubuntu 14.04 添加侧边栏启动图标

5月没写博客。于是,水一波吧。。。。这个月本来是在做一个安卓 APP 的开发,等结束了总结下吧。 有朋友遇到个问题,就是 Ubuntu 上下载使用火狐之后,左侧启动栏上的图标很难看。因为系统无法识别这个新启动的应用是属于什么类型的,它的启动图标是什么。 网上有其他的教程,比如这个:Ubuntu为eclipse添加快捷启动。 基本的思路确实是这样,因为 Unity 或者其他的 X-windows 都会基于 /usr/share/applications 中的启动项来进行图标的配置。 不过这样做有个弊端。就是如果将你下载的软件存放在个人目录下。比如 home,而在 applications 里面添加了启动器,那么就会有可能,其他用户无法使用这个 launcher。如果你说你的电脑上就你一个用户。那么,就不是问题。 而且,作为一个会使用和创造工... [阅读全文]

Linux内核模块 --- NetFilter

一方面自己开始写OS,一方面也开始做一些Linux kernel相关的研究,顺便写一下kernel的module,因为看到一篇论文是基于net-filter做一个P2P的流量监测器。 自己也对这个有点兴趣,于是乎就开始准备按图索骥了。 不过自己不做这个P2P测量,而是准备做一个网络监管的小module,一方面是来练手,一方面是熟悉linux kernel module的开发流程。 首先就是设计,因为是基于Net-Filter框架所以main函数一定一个钩子。 目前的一个设计的文件结构是这样: ├── COPYRIGHT ├── Makefile ├── README.md ├── conf │   └── websites.json ├── configure ├── src │   ├── Makefile │&nbs... [阅读全文]

Android上编译Native C代码

首先,我们不得不提到一个我们在Java程序开发中常使用的JNI模式, 这个模式后来也被Google采用,也能在Android下使用了,但是使用NDK的方式, 写出一个共享so库,然后使用Java JNI技术进行调用。这个方法在编写一些根本不需要 界面的程序时,就显得无比的蛋疼。 所以这边我们介绍一个简单的办法,即编写一个native的本地C程序,直接运行在Android Device上面。 其实说道这边,熟悉ARM开发的人已经知道怎么办了。Android基于Linux和ARM,所以在底层, 就是和一块普通的ARM板没有什么区别,Android只是Linux上的一个小程序。 通常的编程步骤来进行,编写源文件,用编译器编译,链接器链接,然后运行。 我们这边有两个方法获得Android上的编译工具撚,一个方法是编译Android R... [阅读全文]

关于SIGPIPE导致的socket服务端程序意外退出的问题

在Linux C网络编程中,会遇到这样的问题。当创建了一个套接字并listen之后,等待客户端发来请求并accept,此时向客户端回传信息(用write或send)会导致服务端程序意外退出。通过监控发现时在执行write或send的时候程序意外退出。 经过研究发现,程序意外退出不是偶然,在每次客户端连接并向客户端返回数据的时候都会退出。原因:建立了socket连接后,如果长时间不用,会被 断开,这时候如果再调用send或write()函数,linux内核会给进程发出SIGPIPE信号,该信号缺省的处理办法是终止进程。 解决方法: #include<signal.h> 在main函数中加入 signal(SIGPIPE,SIG_IGN); 即可解决问题。 [阅读全文]