原帖由 思一克 于 2007-8-14 09:40 发表
TASK切换pgd不就是切换到自己私有的虚拟内存里面有自己的全局变量吗。
全局变量是TASK私有的。
一个PROCESS的各THREAD因为共享才使得各THREAD可见。但是CPU不是在各个THREAD间轮换,而是将每一个THREAD当TASK ...
原帖由 思一克 于 2007-8-14 09:40 发表
TASK切换pgd不就是切换到自己私有的虚拟内存里面有自己的全局变量吗。
全局变量是TASK私有的。
一个PROCESS的各THREAD因为共享才使得各THREAD可见。但是CPU不是在各个THREAD间轮换,而是将每一个THREAD当TASK ...
原帖由 思一克 于 2007-8-14 10:09 发表
LINUX上内河将PROCESS和THREAD几乎一样对待。
THREAD不是在一个进程中自己换来换去。即使象你说的不用,也有从其他TASK切换过来的问题,也要换PGD
原帖由 coldwarm 于 2007-8-14 10:25 发表
倾向于escapedog 的说法,任务切换时保存的应该是描述任务的数据结构,而不是任务本身。对于全局变量,只要进程没有退出,它就应当一直在那儿存在着,当然也有可能通过换页操作换出物理内存,但无论如何它与任务 ...
原帖由 escapedog 于 2007-8-14 10:27 发表
进程目前通常被认为是 resource holder, 而不是切换的基本单位。
原帖由 coldwarm 于 2007-8-14 10:33 发表
我是针对linux来说的,有的书里将进程定义为资源申请的基本单位,线程定义为任务切换的基本单位,但对linux而言,它的线程就是通过task_struct这个进程描述符结构来实现的。
原帖由 coldwarm 于 2007-8-14 10:54 发表
麻烦老大指出来哪里有问题。
kernel/sched.c
1048 /*
1049 * context_switch - switch to the new MM and the new
1050 * thread's register state.
1051 */
1052 static inline
1053 task_t * ...
原帖由 coldwarm 于 2007-8-14 10:54 发表
这段是上下文切换的代码。它保存的只是对任务的当前状态的描述。从操作系统的角度来看,在这个层次上,它所认知的单位仅仅是页面,至于页面上到底存放的是什么,它根本就不知道,那只能由应用程序来解释。
原帖由 escapedog 于 2007-8-14 09:27 发表
我一直以为全局变量是被禁止优化的,可是忽然听到有全局变量参与线程现场切换的说法。迷惑ing......
如果说全局变量是由寄存器指向的,那么如果全局变量的数目超过 CPU 的寄存器数目怎么办呢?
高手能解答 ...
原帖由 flw 于 2007-8-14 09:39 发表
全局变量是在内存中的,
而在段页式管理的 OS 中,
段描述符和页表基地址都是储存在寄存器中的,
任务切换的时候,
寄存器是现场的一部分,
也要切换(事前保护和事后恢复),
因此全局变量自然也是现场的 ...
原帖由 coldwarm 于 2007-8-14 10:33 发表
我是针对linux来说的,有的书里将进程定义为资源申请的基本单位,线程定义为任务切换的基本单位,但对linux而言,它的线程就是通过task_struct这个进程描述符结构来实现的。
进程线程模型对于不同操作系统差别很大。
对于Linux来说,进程和内核线程是一对一,或者说是同一个粒度的,是内核调度的基本单位。用户线程是基于lib库实现的,并不直接接受内核调度。
原帖由 escapedog 于 2007-8-14 09:27 发表
我一直以为全局变量是被禁止优化的,可是忽然听到有全局变量参与线程现场切换的说法。迷惑ing......
如果说全局变量是由寄存器指向的,那么如果全局变量的数目超过 CPU 的寄存器数目怎么办呢?
原帖由 woshiwo 于 2007-8-14 23:43 发表
进程线程模型对于不同操作系统差别很大。
对于Linux来说,进程和内核线程是一对一,或者说是同一个粒度的,是内核调度的基本单位。用户线程是基于lib库实现的,并不直接接受内核调度。
solaris的LWP和用户线程 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |