Linux-unix系统编程手册笔记(1)

第一部分:第一章到第五章的知识点

1、应用层的进程系统调用只是请求内核去做什么事,而不是通过这个进程去做什么事(新的理解)
2、getpid()总能成功返回进程的 ID, 而_exit()总能终止进程。无需对此类系统调用的返回值进行检查,但是其他的系统调用都必须设定
3、大多数系统调用和库函数都会返回一个状态值,以表明调用成功与否。对这一返回状态进行检查是一条编程铁律。
4、所有执行 I/O 操作的系统调用都以文件描述符,一个非负整数(通常是小整数),来指代打开的文件
5、所有系统调用都是以原子操作方式执行的
6、在多个进程当中打开多个文件描述符指向同一打开文件

1、系统调用 pread()和 pwrite()完成与 read()和 write()相类似的工作,只是前两者会在 offset 参数所指定的位置进行文件 I/O 操作,而非始于文件的当前偏移量处,且它们不会改变文件的当前偏移量,该函数是lseek和read函数的原子操作,可以有效的避免竞争
2、readv()和 writev()系统调用分别实现了分散输入和集中输出的功能,也就是说可以同时对多个缓冲区进行操作,比较方便
3、有些程序需要创建一些临时文件, 仅供其在运行期间使用, 程序终止后即行删除。mkstemp()函数生成一个唯一文件名并打开该文件,返回一个可用于 I/O 调用的文件描述符。使用 unlink 系统调用将其删除

第二部分:内存分配

1、C 语言的 goto 语句存在一个限制,即不能从当前函数跳转到另一函数,setjmp()和 longjmp()就提供了从一个函数跳到另一个函数的功能
2、通常将堆的当前内存边界称为“ program break”
3、brk()和 sbrk()可以改变当前进程堆 program break的位置,当程序试图访问的数据位于初始化或未初始化数据段中当前尚不存在的部分时,就会引发分段内存访问错误segmentation fault
4、free()并不降低 program break 的位置,而是将这块内存填加到空闲内存列表中,供后续的 malloc()函数循环使用,但是,如果在堆顶部使用free释放完整的一组连续内存块,会观察到 program break 从峰值上降下来
5、当进程终止时,其占用的所有内存都会返还给操作系统,所以有些程序为了减少开销可以不调用free
6、malloc 是基于 8 字节或 16 字节边界来分配内存的
7、当 malloc()分配内存块时,会额外分配几个字节来存放记录这块内存大小的整数值。该整数位于内存块的起始处,而实际返回给调用者的内存地址恰好位于这一长度记录字节之后
8、glibc提供了一款工具用于调试malloc内存分配的功能
9、 calloc()会将已分配的内存初始化为 0
10、realloc()函数用来调整(通常是增加)一块内存的大小,而此块内存应是之前由 malloc 包中函数所分配的
11、设计函数 memalign()和 posix_memalign()的目的在于分配内存时,起始地址要与 2 的整数次幂边界对齐,该特征对某些应用非常有用
12、还有在栈上分配内存的alloca(),但是会修改栈顶指针的位置,使用 alloca()来分配内存相对于 malloc()有一定优势。其中之一是,alloca()分配内存的速度要快于 malloc(),因为编译器将 alloca()作为内联代码处理,并通过直接调整堆栈指针来实现。此外, alloca()也不需要维护空闲内存块列表。另一个优点在于,由 alloca()分配的内存随栈帧的移除而自动释放,亦即当调用 alloca 的函数返回之时。之所以如此,是因为函数返回时所执行的代码会重置栈指针寄存器,使其指向前一帧的末尾(即,假设堆栈向下增长,则指向恰好位于当前栈帧起始处之上的地址)。由于在函数的所有返回路径中都无需确保去释放所有的已分配内存,一些函数的编码也变得简单得多。
13、许多现代 UNIX 实现提供了一个/proc 虚拟文件系统。该文件系统驻留于/proc 目录中,包含了各种用于展示内核信息的文件,并且允许进程通过常规文件 I/O 系统调用来方便地读取,有时还可以修改这些信息。之所以将/proc 文件系统称为虚拟,是因为其包含的文件和子目录并未存储于磁盘上,而是由内核在进程访问此类信息时动态创建而成。
14、每个/proc/PID 目录中都存在一个命名为 status 的文件,提供了有关该进程的一系列信息
15、uname()系统调用返回了一系列关于主机系统的标识信息

第三部分:文件IO缓冲

1、无论是让磁盘写 1000 次,每次写入一个字节,还是一次写入 1000 个字节,内核访问磁盘的字节数都是相同的。然而,我们更属意于后者,因为它只需要一次系统调用,而前者则需要调用 1000 次。尽管比磁盘操作要快许多,但系统调用所耗费的时间总量也相当可观,因此,我们的read和write都是对缓冲区进行操作
2、如果与文件发生大量的数据传输,通过采用大块空间缓冲数据,以及执行更少的系统调用,可以极大地提高 I / O 性能
3、

你可能感兴趣的:(linux,unix,服务器)