码迷,mamicode.com
首页 > 系统相关 > 详细

进程描述符

时间:2016-07-20 23:13:58      阅读:697      评论:0      收藏:0      [点我收藏+]

标签:task_struct

进程描述


广义上讲,所有进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。


进程控制块

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。

task_struct结构体

task_struct是Linux内核下的一种数据结构,它会被装载到RAM里并且包含着进程的信息,每个进程把它的信息放在task_struct结构体里task_struct包含了这些内容:

标示符:描述本进程的唯一标示符

状态:任务状态,退出代码,退出信息等。

优先级:相对于其他进程的优先级

程序计数器:程序中被执行的下一条指令的地址。

内存地址:包括程序代码和进程相关的数据的指针,还有和其他进程共享内存块的指针

上下文数据:进程执行时处理的寄存器中的数据

I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表

记账信息:包括处理器时间总和,使用时钟数总和、时间限制、记账信号等。

保存进程信息的数据结构叫做task_struct,所有运行在系统里的进程都以task_struct链表的形式存在内核中进程的信息可通过/proc系统文件夹查看,要获取PID为400的进程信息,需要查看/proc/400这个文件夹。大多数进程同样可以使用top和ps这些用户级工具获取。

进程标示符


进程id(PID)

父进程id(PPID)

进程位置

  1. 进程内存映像

Linux下C程序生成主要由4个步骤组成:预编译、编译、汇编、链接。编译器gcc经过预编译、编译、汇编3个步骤将源程序文件转换成目标文件。如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。当程序执行时,操作系统将可执行程序复制到内存中。程序转为进程通常需要以下几个步骤:

*内核将程序读入内存,为程序分配内存空间;

*内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行。程序转化为进程后就可被操作系统的调度程序执行了。
进程的内存映像是指内核在内存中如何存放可执行程序文件。在将程序转化为进程的过程中,操作系统将可执行程序从硬盘复制到内存中。布局如下:

技术分享

2.进程映像位置依赖于使用的内存管理

3.可执行程序与进程内存映像的不同之处在于:

a.可执行程序位于磁盘中而内存映像位于内存

b.可支持行程序没有堆栈,因为程序程序被加载到内存中才会分配堆栈。

c.可执行程序虽然也有未初始化数据段但它并并不存储于硬盘中的可执行文件中。

d.可执行程序是静态的,不变的,而内在映像随着程序的执行是静态变化的,比如数据段随着程序执行要存储的变量值,栈在函数调用时也是在不断变化的。

#include <stdio.h>
#include <stdlib.h>
int g_val = 100;
void test()
{
int a = 10;
int b = 10;
printf("test stack1 address : 0x%x\n", &a);
printf("test stack2 address : 0x%x\n", &b);
}
void (*fp)();
int main()
{
int a = 10;
int *heap = malloc(sizeof(int));
fp = test;
printf("code address : 0x%x\n", fp);
printf("data address : 0x%x\n", &g_val);
printf("heap address : 0x%x\n", heap);
printf("main stack0 address : 0x%x\n", &a);
fp();
return 0;
}

技术分享


进程描述符

标签:task_struct

原文地址:http://10798301.blog.51cto.com/10788301/1828176

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!