Linux进程描述

来源:互联网 发布:加内特2004季后赛数据 编辑:程序博客网 时间:2024/05/29 04:04

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

进程控制块

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是tack_struct.结构体。下面我们将全面了解一下其中都有那些信息。

在Linux中,这个结构叫做task_struct.

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

标识符描述本进程的唯一标识符,来区别其他进程。

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

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

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

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

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

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

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

保存进程的数据结构叫做task_struct,并且在include/linux/sched.h里找到它。所有运行在系统里的进程都以task_struct链表的形式在内核里。

进程的信息可以通过/proc文件夹查看。要获取PID为400的进程信息,你需要查看/proc/400这个文件夹。大多数进程信息同样可以使用top和ps这些用户级工具来获取。

进程标识符

进程id(pid)

父进程iD(ppid)

进程位置:

1.进程内存映像

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

(1)内核将进程读入内存,为内存分配内存空间;

(2)内核为该进程保存PID及相关的状态信息,把进程放到运行队列中等待执行。程序转化为进程后就可被操作系统得到调度程序执行了

进程的内存映像是指内核在内存中如何存放可执行程序文件。再将程序转化为进程的过程中,操作系统可将执行程序从硬盘复制到内存中,其布局如下:

C地址空间测试代码:

  #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;
     }
运行结果如下:

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

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

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

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

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

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

0 0
原创粉丝点击