进程描述符

进程描述



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

进程控制块

每个进程在内核中都有一个进程控制块(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;
}

时间: 2024-12-11 16:49:17

进程描述符的相关文章

进程与进程描述符(task_struct)

一. 进程 进程(Process) 计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. --------------------------------------------------------------- 释义:一段程序的执行过程 特征:动态.独立.异步.并发 结构特征

进程管理—进程描述符(task_struct)

http://blog.csdn.net/qq_26768741/article/details/54348586 当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息. 内核当中使用进程描述符task_struct. 这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理. 接下来我们

进程描述符task_struct

1.进程状态 [cpp] view plain copy volatile long state; int exit_state; state成员的可能取值如下: [cpp] view plain copy #define TASK_RUNNING        0 #define TASK_INTERRUPTIBLE  1 #define TASK_UNINTERRUPTIBLE    2 #define __TASK_STOPPED      4 #define __TASK_TRACED 

Linux 进程描述符 task struct

大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进程描述符,具体是task_struct结构体存储相关的信息,在linux/sched.h文件里定义,那么我们先看看linux内核3.0版本的task_struct结构体的定义吧(删除了不必要的字段,只保留了重要的字段).同时欢迎大家转载和交流. struct task_struct {       //这个是进程的运行时状态,-1代表不可运行,0代表可运行,>0代表已停止.  volatile longstate;  

外部碎片、进程描述符、内部碎片

外部碎片: 是由于用户进程向内存频繁申请和释放内存空间所产出的空闲内存容量.伙伴算法解决的就是这个问题,解决的方法其实就是有伙伴算法的算法设计方法来决定,比如伙伴算法中的合并和切割方式,不够则申请大的空间,但会先切割后再分配出去,剩余的有可能因伙伴关系合并,并成更大的空闲空间,这是一种解决碎片的方式,另一种方式是释放时,也会因为释放后的空闲空间有可能形成伙伴而继续合并,这样就将零零碎碎的空闲空间内存慢慢合并成大的空闲空间,事外部碎片尽量减少. 进程描述符: 即task_struct进程结构体,每

进程—进程描述符展开

进程-从进程描述符展开(一) 进程内核栈结构:union task_union 在../include/linux/sched.h中定义了如下一个联合结构用来创建内核栈空间. //../include/linux/sched.h union task_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }: 线程描述符:struct thread_info 每一个进程都有一个

Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_struct结构体,可以说她是linux内核源码中最复杂的一个结构体了,成员之多,占用内存之大. 进程状态 /* * Task state bitmask. NOTE! These bits are also * encoded in fs/proc/array.c: get_task_state().

Linux报错-bash: fork: retry: Resource temporarily unavailable和进程描述符之间的关系

在公司服务器上切换用户,出现 "-bash: fork: retry: Resource temporarily unavailable"这样的报错,查询得知是普通用户能够使用的进程数太少和文件描述符太小导致的,每一个文件描述符会和一个文件对应,但是很多文件描述符也会和一个文件对应.相同的文件可以被不同的进程打开,也可以被同一个进程打开多次.我们可以从系统层面和进程层面来查看相应的文件描述符. 一,系统层面的文件描述符 涉及到系统层面的,基本上都是通过修改内核参数来实现的,修改系统中的

进程—内存描述符(mm_struct)

http://blog.csdn.net/qq_26768741/article/details/54375524 前言 上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员包含了很多与进程相关的信息,今天我们来看一下其中一个被叫做内存描述符的结构体--mm_struct,抽象的来描述linux下进程的地址空间的所有的信息. 1.概述 一个进程的虚拟地址空间主要由两个数据结来描述.一个是最高层次的:mm_struct,一个是较高层次的:vm_area_structs.最