他们似乎对我做同样的事情.任何人都可以向我解释这个区别吗?
这是一个概念性问题.
根据这篇文章,pthread实际上是使用clone()系统调用实现的.因此,我们可以推断在用户空间中有一个内核线程(或轻量级进程)备份pthread.内核知道pthread并且可以像进程一样安排它.
至于kthread,根据Robert Love的说法,kthreads也是用clone()系统调用创建的:
clone(CLONE_VM| CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)
Run Code Online (Sandbox Code Playgroud)
所以pthread和kthread都使用clone()调用.我的第一个问题是:
为了回答我自己的问题,我继续读到:
内核线程和普通进程之间的显着区别是内核线程没有地址空间(事实上,它们的mm指针是NULL).
这有区别吗?我的意思是,由pthread_create()创建的线程与正常进程共享地址空间.相反,kthread没有自己的地址空间.那是对的吗?
还有什么不同?
我说的是用 C 实现的 LRU 内存页面替换算法,而不是用 Java 或 C++ 实现。
根据操作系统课程笔记:
好的,那么我们如何实际实现 LRU 呢?想法1):用时间戳标记我们接触过的一切。每当我们需要驱逐页面时,我们都会选择最旧的页面(=最近最少使用)。事实证明,这个简单的想法并不那么好。为什么?因为对于每个内存加载,我们都必须读取时钟的内容并执行内存存储!因此很明显,保留时间戳将使计算机速度至少慢一倍。我
内存加载和存储操作应该非常快。真的有必要摆脱这些微小的操作吗?
在内存替换的情况下,从磁盘加载页面的开销应该比内存操作大很多。为什么要真正关心内存存储和加载?
如果注释所说的不正确,那么使用时间戳实现 LRU 的真正问题是什么?
编辑:
当我深入挖掘时,我能想到的原因如下。这些内存存储和加载操作在页面命中时发生。在这种情况下,我们没有从磁盘加载页面,因此比较无效。
由于预计命中率会非常高,因此更新与LRU相关的数据结构应该非常频繁。这就是为什么我们关心更新过程中重复的操作,例如内存加载和存储。
但我仍然无法相信内存加载和存储的开销有多大。周围应该有一些测量值。有人可以指点我吗?谢谢!