免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3471 | 回复: 10
打印 上一主题 下一主题

[进程管理] 进程描述符 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-29 13:31 |只看该作者 |倒序浏览
内核对进程进行管理的时是通过进程描述符来进行管理的,但是我对他的描述感觉很疑惑,它说的是:每个任务的thread_info结果在它的内核桟的尾端分配。但是我想问的是内核对所有进程进行统一的管理,进程队列应该在内核里面的,但是它这样描述让我觉得每个进程地址空间中会拥有自己的内核桟。内核到底是怎么管理进程的呢?内核桟是不是在内核里面呢?
我的理解是 请各位大神解释一下。

QQ图片20131229132940.jpg (18.57 KB, 下载次数: 61)

QQ图片20131229132940.jpg

论坛徽章:
0
2 [报告]
发表于 2013-12-29 16:42 |只看该作者
补充,中间过程(task)我已经省略了,就是大概描绘了一下。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2013-12-30 09:07 |只看该作者
qq471876425 发表于 2013-12-29 13:31
内核对进程进行管理的时是通过进程描述符来进行管理的,但是我对他的描述感觉很疑惑,它说的是:每个任务的 ...

是的,每个进程都有自己的内核栈,在上下文切换的时候进行切换。

论坛徽章:
0
4 [报告]
发表于 2013-12-30 21:16 |只看该作者
进程的每个内核桟是在自己的空间内还是在内核空间内呢?每个进程的内核桟是用链表链接在一起的么?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2013-12-31 08:59 |只看该作者
qq471876425 发表于 2013-12-30 21:16
进程的每个内核桟是在自己的空间内还是在内核空间内呢?每个进程的内核桟是用链表链接在一起的么?

进程的内核栈都是属于进程自身的,栈顶指针(和其他硬件上下文)都保存在task_struct->thread结构中,未见有相关的链表链接。
当进程上下文切换的时候(__switch_to),会进行内核栈和其他硬件上下文切换,即保存老的上下文到prev_p->thread中,再将新的上下文(next_p->thread)load进来。

论坛徽章:
0
6 [报告]
发表于 2014-01-02 12:52 |只看该作者
用户进程内核栈所在的空间范围应该是在内核地址空间,即0xC0000000 以上的空间,不可能在用户空间。
想到的原因有:
(1)如果在用户地址空间,用户的Code就可能修改内核栈的内容,这是不应该的。
(2)如果在用户地址空间,内核Code访问内核栈,就是在访问用户空间,一般也是不允许的。

论坛徽章:
1
白羊座
日期:2014-01-05 12:42:56
7 [报告]
发表于 2014-01-05 10:57 |只看该作者
把程序转换成进程并加以分析和管理

论坛徽章:
0
8 [报告]
发表于 2014-01-10 22:51 |只看该作者
humjb_1983 发表于 2013-12-31 08:59
进程的内核栈都是属于进程自身的,栈顶指针(和其他硬件上下文)都保存在task_struct->thread结构中,未见有 ...


那进程本身有权利进行上下文切换的权限么?上下文切换肯定是有内核参与的,内核桟空间没有谁来管理么?我在看书的时候,里面就是说,进程的桟空间是自己管理自己的,我表示很疑惑。不知道是怎样进行管理的。希望给我解答疑惑。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
9 [报告]
发表于 2014-01-13 09:38 |只看该作者
qq471876425 发表于 2014-01-10 22:51
那进程本身有权利进行上下文切换的权限么?上下文切换肯定是有内核参与的,内核桟空间没有谁来管理么? ...

上下文切换发生在很多情况下,比如系统调用、中断、调度等,当然可以有进程自身主动发起。
内核栈跟thread_info结构放在一起,
union thread_union {
        struct thread_info thread_info;
        unsigned long stack[THREAD_SIZE/sizeof(long)];
};
在进程创建时,会调用alloc_thread_info分配内核栈空间,默认情况下THREAD_ORDER=1,即直接分配2页,也就是8k,这8k空间即用于内核栈和thread_info。所以,内核栈空间实际就是一段8k的普通内存,与其他内存无异,所以,无需特别的管理,由伙伴系统和进程地址空间相关机制管理即可。
#define alloc_thread_info(tsk) \
        ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER))

论坛徽章:
0
10 [报告]
发表于 2014-01-16 01:22 |只看该作者
楼上说的很对。但lz可能不明白的地方是一个进程的执行流有两部分,一部分在用户空间,一部分在内核空间。用户空间是用户栈,内核空间就是内核栈。用户空间的执行流就是应用程序代码,内核空间的执行流是内核本身。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP