一. 内存管理
1.简单的内存分配
使用标准c语言函数库中的malloc调用来分配内存。
void * malloc(size_t size)
返回的是一个void*指针,因此需要通过类型转换。可以保证其返回的内存是地址对齐的,因此可以将其转换成任何类型的指针。
2.分配大量的内存
应用程序所需的内存是由linux内核管理的。刚开始,内核只是通过使用空闲的物理内存来满足应用程序的内存需求,但是当物理内存耗尽时,就开始使用交换空间。交换空间是安装系统时分配的独立的磁盘区域。
内核会在物理内存和交换空间之间移动数据和程序代码。Linux实现了一个按需换页的虚拟内存系统。
3.释放内存
动态使用内存的程序总是通过free调用,把不用的内存释放给malloc内存管理器。
void free (void * memory)
二.文件锁定
1. 创建锁文件
以原子操作的方式创建锁文件。锁文件只是建议锁而不是强制锁。open系统调用并带上0_CREAT和O_EXCL标志。
2.区域锁定
锁文件用来对资源的独占式访问。并不适合于访问大型的共享文件。
int fcntl ( int fildes,int command,...)
command选项:
F_GETLK 获取fileds打开的文件的锁信息,不会尝试去锁定文件。
F_SETLK 尝试对fileds指向的文件的某个区域加锁或解锁。
F_SETLKW 无法获取锁时,这个调用会一直等待到可以为止。
当对文件区域加锁之后,必须使用底层的read和write调用来访问文件中的数据,而不要使用更高级的fread和fwrite调用,因为他们会对读写的数据进行缓存。
有三种类型的锁:文件中的每一个字节任一时刻只能拥有一种类型的锁。
F_FDLCK 共享(读)锁
F_UNLCK 解锁或用来清除锁
F_WRLCK 独占(写)锁
3. 死锁
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。