2019年4月

文件I/O的内核缓冲:缓冲区高速缓存

read()write()系统调用在操作磁盘文件时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区与内核缓冲区高速缓存之间复制数据。
Linux内核对缓冲区高速缓存对大小没有固定上限。内核会分配尽可能多的缓冲区高速缓存页,而仅受限于两个因素:可用的物理内存总量;以及出于其他目的对物理内存的需求。

缓冲区大小对I/O系统调用性能的影响

如果与文件发生大量的数据传输,通过采用大块空间缓冲数据,以及执行更少的系统调用,可以极大地提高I/O性能。


- 阅读剩余部分 -

/proc文件系统

在较老的UNIX实现中,通常并无简单方法来获取(或修改)内核属性。为了提供更为简便的方法来访问内核信息,许多现代UNIX实现提供了一个/proc虚拟文件系统,其包含了各种用于展示内核信息的文件。之所以将其称为虚拟,是因为其包含的文件和子目录并未存储在磁盘上,而是由内核在进程访问此类信息时动态创建而成。

获取与进程有关的信息:/proc/PID

对于系统中每个进程,内核都提供了相应的目录,命名为/proc/PID,其中PID是进程的 ID。在此目录中的各种文件和子目录包含了进程的相关信息。

- 阅读剩余部分 -

因为系统限制和选项会影响应用程序的行为,所以可移植应用程序需要获取限制值,弄清系统对选项对支持情况。C语言标准和SUSv3为此而提供了两种重要途径。

  • 在编译程序时能够获得一些限制和选项
  • 另外一些限制和选项在程序运行时可能会发生变化

系统限制

SUSv3要求,针对其所规范的每个限制,所有实现都必须支持一个最小值。在大多数情况下,会将这些最小值定义为<limits.h>文件中的常量,常量命名形式如_POSIX_XXX_MAX。在特定系统上获取限制,通常可取的方法即使用<limits.h>文件、sysconf()pathconf()

每个限制都有一个名称,与上述最小值的名称相对应,但缺少了_POSIX_前缀。

- 阅读剩余部分 -

实际用户ID和实际组ID

实际用户ID和实际组ID确定了进程所属的用户和组。

  • 登录shell会从/etc/passwd文件中读取相应用户密码记录的第三字段和第四字段,置为其实际用户ID和实际组ID
  • 当创建新进程时,将从其父进程继承这些ID

有效用户ID和有效组ID

在大多数UNIX实现中,当进程尝试执行各种操作时,将结合有效用户ID、有效组ID,连同辅助组ID一起来确定授予进程的权限。
通常,有效用户ID及组ID与其相应的实际ID相等,但有两种方法能够致使二者不同:

  1. 使用后面介绍的修改进程凭证的系统调用
  2. 执行set-user-IDset-group-ID程序

- 阅读剩余部分 -