《Linux System Programming 2e》

cover_lsp

Rovert Love的这本书,以内核开发者的身份,站在系统编程的角度出发,简单扼要地说明了Linux各个主要API的功能和使用场景,非常适合入门者学习,对有经验的开发者也有复习梳理和提高的作用,文笔和风格也都很舒畅,十分值得一读.

这里记录下本人较少接触的一些相对较新或少用的API及其用法,以备查漏补缺和今后不时之需:
另外记录些不熟悉但必要重要的系统相关的概念.
本书使用:Linux kernel (3.9), gcc (4.8), and C library (2.17)

一、IO系统
1. append模式写文件是保证原子的,即使多个thread同时写也不会乱,每次都写到当前最末尾.
2. 以O_DIRECT模式打开文件即是走DirectIO
3. 使用lseek或trunc可以产生文件空洞:文件size变大,但占用空间不变.
4. pread/pwrite:自带seek的原子操作,不改变当前读写位置.
5. swap和page_cache策略调整:/proc/sys/vm/swappiness
6. remap系统调用可用于调整当前映射区的大小,可用于实现realloc.
7. mprotect系统调用用于修改内存区域的权限.
8. msync用于同步内存到其映射的文件中(mmap)
9. madvice引导内核做page预读等相关优化(mmap)
10. posix_fadvise, readahead等类似针对普通IO.
11. 概念:Synchronized, Synchronous, and Asynchronous Operations
UserSpace->Kernel:Synchronous
Kernel->Disk:Synchronized
sync_async
aio异步IO库:linux在底层提供支持,配合sigevent(信号或线程)使用.
12. 应用代码集中IO优化方法:
a) 按路径排序,效果一般
b) 按inode大小排序,效果较好
c) 按物理块号排序,效果最好:ioctl (fd, FIBMAP, &block)
block为文件逻辑块(0开始),返回后为实际物理块号.

二、进程和线程
1. 会话和进程组:
pgrp
会话一般对应一个登录用户,当前持有终端的进程组为foreground group.
2. C库提供有daemon函数.
3. sched_rr_get_interval获取进程当前时间片.
4. 对实时性要求高的进程一般将其内存上锁,防止paging带来的不确定性;有时设置为独占部分cpu.

三、文件系统
1. 文件附加属性:getxattr/setxattr 一般存于inode中
2. 设备结点:如/dev/zero、/dev/urandom等,读写结点是与设备通信标准方式.
使用ioctl来进行参数设置等非数据通信.
3. FS事件监控机制: inotify:inotify_init/inotify_add_watch 配合标准epoll/read/write.

四、内存管理
1. calloc直接分配zero-page,因此比malloc+memset高效.
2. glibc中大于128K的内存直接从mmap分配,其他用堆管理分配.
3. mallopt用于设置各种内存分配器相关行为参数.
4. malloc_trim:立即释放堆顶空闲空间.
5. alloca:栈空间分配,性能最高,优先使用. 函数返回自动释放.
6. VLA:动态数组,栈上分配,出作用域自动释放.
7. 各种内存分配方法:
malloc
8. mlock/mlockall:锁定内存,有权限控制.
9. mincore:查询某页是否在物理内存.
10. 当超过物理内存+swap时会启动OOM(bad!)可用/proc/sys/vm/overcommit_xx 相关参数调节过度使用率.

五、信号
sigaction新信号接口可传递/处理更多信息:
void (*sa_sigaction)(int, siginfo_t *, void *);
int sigqueue (pid_t pid, int signo, const union sigval value);

六、时间管理
1. POSIX_CLOCK,基于各种时间源的管理接口:
CLOCK_REALTIME/CLOCK_MONOTONIC/CLOCK_MONOTONIC_RAW/CLOCK_PROCESS_CPUTIME_ID/CLOCK_THREAD_CPUTIME_ID
clock_gettime/clock_settime/clock_nanosleep
2. 渐进式调整时钟:adjtime/adjtimex,用于NPT进程.
3. nanosleep和usleep以及sleep不同,不使用信号实现,可与定时器同时使用.
4. 定时器:alarm/getitimer/setitimer 使用信号通知.
高级定时器:timer_create/timer_settime/timer_gettime 结合sigevent使用信号或线程通知.

发表评论

电子邮件地址不会被公开。