在不同的地方可以看到时下指责是一个完全名不副实的“粘滞位”,因为它的功能现在是影响上的目录,并作为一个写权限受限删除标志。
回答者在AskUbuntu回答中写道:“通常在目录上使用粘性”。我观察到,实际上现代系统实际上在实践中似乎从未将其应用于文件,但是很久以前,通常的情况是将其应用于(可执行程序映像)文件而不是目录。(当谈到现代文件使用的稀缺性时,还有一个相关的问题是在当前文件系统中是否没有使用粘性位。)
这提示了问题:
注意过去时。这不是粘性位如何工作?现在。那是它过去的工作方式。
在不同的地方可以看到时下指责是一个完全名不副实的“粘滞位”,因为它的功能现在是影响上的目录,并作为一个写权限受限删除标志。
回答者在AskUbuntu回答中写道:“通常在目录上使用粘性”。我观察到,实际上现代系统实际上在实践中似乎从未将其应用于文件,但是很久以前,通常的情况是将其应用于(可执行程序映像)文件而不是目录。(当谈到现代文件使用的稀缺性时,还有一个相关的问题是在当前文件系统中是否没有使用粘性位。)
这提示了问题:
注意过去时。这不是粘性位如何工作?现在。那是它过去的工作方式。
Answers:
不,粘性位不像set-UID或set-GID标志。它不会影响处理凭据的任何更改。
粘性位是使程序文本为“粘性”。最初,这不是误称。
从本质上讲,无需太过深入地研究可执行文件格式(可以并且有很多书籍)的细节:为了运行程序而直接加载到内存中的程序映像文件的一部分包括机器代码,常量,启动(非零初始化)变量的值,以及零初始化和未初始化变量的(一种形式或另一种形式)空格。
这些被分组为称为“部分”的集合,并且具有常规名称。机器代码和(有时)常量形成通常称为程序映像的“文本”部分的内容。同样,非零初始化变量是“数据”部分。零初始化和未初始化的变量是“ bss”(其名称本身具有完整的民俗历史)。
当进程中已加载程序可执行图像文件时,将从图像文件的内容中初始化各个部分(文本,数据和bss)。
“文本”部分的特殊之处在于,几乎始终不写入机器代码(和常量)。它有可能在已将可执行映像文件加载到其中的所有执行进程的虚拟内存映像之间共享。可以共享程序文本的确切方案超出了此答案的范围,涉及诸如加载程序固定等幂性和地址空间布局标识之类的事情。人们也可以并且已经撰写了有关该主题的书籍。☺
共享文本是内核采用的一种优化。它消除了单个运行程序映像的每个实例都具有自己的单独内存映像的需要,从而消耗了宝贵的物理内存以及完全相同的机器代码(和常量)的多个副本。
但是,比共享文本还可以做得更好。显然,如果始终有至少一个进程在使用特定的共享文本程序映像运行,则当程序的新实例运行时,内核可以将新进程的虚拟内存空间简单地附加到现有的共享文本段上。在中型系统上几乎总是有一个实例(例如)/bin/login
或/bin/sh
运行在某个地方,因此,登录程序或默认外壳程序的新实例可以简单地附加到内核已经加载到内存中的文本段的加载副本中。
粘滞文本将这种想法扩展到当前没有进程在运行的图像程序。如果一个可执行映像文件被标记为粘性文本,则内核在使用该文件的最后一个过程退出后会保留其文本段。希望该程序的另一个实例能够尽快执行,并且可以将其附加到该段中。
在早期的Unices中,如果没有附加任何进程,则将已加载的粘性文本段替换为交换存储。(后来的Unices停止使用swap进行交换。)您可能还通过名称save text听说过这一点。
当然,必须在程序映像上设置粘性文本位。可以从中受益的程序取决于机器的一般用途。当前未连接的文本段占用了内核资源,这意味着在任何系统中可以有多少个段都有实际的限制。因此,通常这是一项需要超级用户特权的操作。
粘滞文本操作的基础是一整套假设,但事实已不复存在。从交换存储读取预制段不一定比从实际可执行映像文件进行简单需求分页快。对于随机(而非顺序)读取模式,文件系统格式变得更好。需求分页的出现本身就改变了事情,诸如统一缓存,共享库搜索中的差异导致的非幂等外部修正以及地址空间布局随机化等事情也发生了变化。
可执行程序映像的粘性文本位的日子早已一去不复返了。例如,在1980年代中期,4.3BSD的作者认为用于可执行程序图像的显式粘性文本标记标志已过时。
TSR
在DOS时代曾经知道的-“终止并保持居住”。但是,这通常是用于设备驱动程序之类的,以后运行的其他进程需要调用这些驱动程序,并且当世界转向多线程/多进程OS时可能已过时。
bss
?
CODE
段(以及OS / 2只读DATA
段)通常在所有正在运行的程序之间共享。没有真正的“粘性”,部分原因是32位OS / 2版本2.x和386增强模式用按需分页的虚拟内存代替了段交换,就像Unix世界早在几年前一样,在两个领域都影响了“粘性”。分割粘性的需求大致相同。