关于“进程上下文”的理解 不知道对不对

yujixi123 2011-08-21 02:50:45
Linux, 进程上下文, kernel
鄙人初探linux kernel,在阅读LKD时,对进程上下文这个概念不是十分明白:

我认为一个进程的上下文分三种情况:

1)只位于user space,如:

#include <string>
int main()
{
return 0;
}

没有调用任何system call,不会进入kernel space,因此只会运行于user space,所以这个应用程序对应的进程的进程上下文就不妨理解为整个user space。

2)只位于kernel space,如操作系统本身就是运行于kernel的,所以向进程调度进程的进程上下文就不妨理解为整个kernel space。

3)横跨user space和kernel space,如:

int main()
{
fork();
...
}

调用了system call fork,会从user space进入kernel space,因此这个应用程序对应的进程的进程上下文就理解为整个内存空间。

不知道这样理解对不对。 谢谢指点。
...全文
204 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvyinghong 2011-08-25
  • 打赏
  • 举报
回复
不知道那个鸟人翻译想出了这么一个拗口的名字,害死不少人。

直接翻译成 “进程的执行环境”多好啊
Gary__Cheng 2011-08-25
  • 打赏
  • 举报
回复
这个号码,是个小号,现在求分,
Gary__Cheng 2011-08-25
  • 打赏
  • 举报
回复
你好是,不给我分,

对得起的打这么多字??????????????????
Gary__Cheng 2011-08-25
  • 打赏
  • 举报
回复
进程上下文,单核CPU下,把进程当做任务理解,
一个进程运行时(进程A吧),cpu是她独享的,Cpu的外围资源也是她独享的(某些中断触发除外),在该进程的代码执行中,CPU的通用寄存器、特殊功能寄存器...这些东西,里面的存放的就是该进程的相关信息,当前执行地址、cpu模式(状态)、计算中间结果....

当该进程A的时间片用完时,或者更高优先级的进程就绪时(进程B吧),那就要进行调度,进行进程切换了,

进程A 就要暂停下来,为了保证,再次运行进程A时,可以从暂停位置,继续无缝运行,就要保存进程A的
当前运行环境了,有关系的东西,有些保存在进程控制块(就是一个结构体,描述进程相关信息,堆栈指针,进程代码指针,什么的),还有就是cpu当前用到的所有寄存器了,把这些东西保存好,这些保存在进程A的堆栈里面,然后至关重要的就是记录下进程A的堆栈指针位置,回复运行进程A 时,要从进程A堆栈里面回复保存的东西的

好了,进程A停下了,运行进程B,至于怎么标识进程A停下,怎么找到进程B,去运行,这个过程,就是n多链表,还有进程挂起等待表,

为运行进程B,准备,首先找个进程的进程控制块,进而找到进程B的堆栈指针,从进程B的堆栈里面回复进程B停下之前保存的东西,要是进程B,是新来的,那就不用这么麻烦,直接初始化进程B的进程控制块、堆栈....然后,执行进程B的代码

进程B的时间片用完了,假如下一个要运行的是进程A,那就把进程A挂起时保存的东西恢复,就行,

还有个需要注意下,cpu是几级流程水线的,PC怎么计算,当前执行的指令的地址,和流水线的开始,地址相差多少,流水线越长,这时,清洗流水线就越深,加深流水线便于提高cpu主频,但是,遇到判断跳转指令、进程切换时,流水线清洗,是没办法的

你说的“进程上下文”,就是进程A,挂起时保存的东西 + 进程A运行时,恢复的东西







cqbamboo 2011-08-22
  • 打赏
  • 举报
回复
我也对进程上下文和中断上下文迷惑中,学习
zhang19871112 2011-08-22
  • 打赏
  • 举报
回复
x86体系结构下,会保存在tss里
[Quote=引用 3 楼 yujixi123 的回复:]

谢谢你的解答 不过有一个疑问:
"如果没有处理完就需要切换,那他的上下文被保存" 请问那些信息,如当前寄存器的值等,保存在哪里?内核栈? 谢谢
引用 2 楼 yiyaaixuexi 的回复:
上下文就是cpu在执行时的一系列状态,比如current,进程结构体,需要的内存页等等。每个进程都以一分独立的的。
当A进程被执行时cpu根据他的上下文进行处理,如果没有处理完就需要切换,那他的……
[/Quote]
念茜 2011-08-22
  • 打赏
  • 举报
回复
进程空间对内核来说只是一些内存的集合,这些信息都在内存中原地不动,当cpu运行A进程时,ip指针在属于A的那片空间活动,当需要切换到B是,cpu只需把ip跳向B的那片空间,这样就实现了切换。当cpu切会A进程时,一切就和走的时候一样。当然内存会有换入换出,这些信息会存到cache或者硬盘,但是内容不变
yujixi123 2011-08-21
  • 打赏
  • 举报
回复
谢谢你的解答 不过有一个疑问:
"如果没有处理完就需要切换,那他的上下文被保存" 请问那些信息,如当前寄存器的值等,保存在哪里?内核栈? 谢谢
[Quote=引用 2 楼 yiyaaixuexi 的回复:]
上下文就是cpu在执行时的一系列状态,比如current,进程结构体,需要的内存页等等。每个进程都以一分独立的的。
当A进程被执行时cpu根据他的上下文进行处理,如果没有处理完就需要切换,那他的上下文被保存,cpu转而去执行B进程的上下文。
先抛开写时拷贝不论,fork后进程A的整个上下文会被复制一份,A和A+两个进程独立,上下文也独立,cpu此时就可以在两个进程间切换,调度执行了。这是我的理……
[/Quote]
念茜 2011-08-21
  • 打赏
  • 举报
回复
上下文就是cpu在执行时的一系列状态,比如current,进程结构体,需要的内存页等等。每个进程都以一分独立的的。
当A进程被执行时cpu根据他的上下文进行处理,如果没有处理完就需要切换,那他的上下文被保存,cpu转而去执行B进程的上下文。
先抛开写时拷贝不论,fork后进程A的整个上下文会被复制一份,A和A+两个进程独立,上下文也独立,cpu此时就可以在两个进程间切换,调度执行了。这是我的理解
羽飞 2011-08-21
  • 打赏
  • 举报
回复
第一个应该不会吧,楼主那个main是你程序的入口函数,但是程序并不是从main开始的,肯定会被系统调用,有一个kenel到User的转换,就是程序退出时也要调用内核函数,内核对你的进程信息进行处理
第二个我不知道对不对,感觉也是这样的
第三个一样同感

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧