Chinaunix首页 | 论坛 | 博客
  • 博客访问: 701755
  • 博文数量: 102
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1748
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-23 15:42
个人简介

寻找严肃、沉默和专注的力量。

文章分类

全部博文(102)

文章存档

2015年(26)

2014年(8)

2013年(68)

分类: LINUX

2013-01-31 14:47:35

Linux进程

  Linux中每个进程由一个task_struct 数据结构来表示,系统task数组包含所有task_struct结构的指针,task数组大小的缺省值一般为512。pstree命令可以观察Linux 系统中运行进程间的关系。

  task_struct数据结构庞大而复杂,其主要功能部分包括:

    State:Running、Waiting、Stopped和Zombie等4个状态

    Scheduling Information:进程调度需要的信息

    Identifiers:进程标志

    还有Inter-Process Communication、Links、Times and TimersFile system、Virtual memory、Processor Specific Context等。

task_struct之文件

  Linux进程希望在进程启动时至少有三个文件描述符被打开,它们是标准输入、标准输出和错误标准输出,一般进程会从父进程中继承它们。这些描叙符用来索引进程的fd数组,所以标准输入,标准输出和标准错误输出分别对应文件描叙符0,1 和2。每次对文件的存取都要通过文件数据结构中的文件操作子程序和VFS inode 一起来完成,由此可以想象管道的实现。

task_struct之虚拟内存

  Linux 使用请求调页技术来把那些进程需要访问的虚拟内存带入物理内存中。核心将进程页表中这些虚拟地址标记成存在但不在内存中的状态,而无需将所有代码和数据直接调入物理内存。当进程试图访问这些代码和数据时,系统硬件将产生页面错误并将控制转移到Linux 核心来处理之。这样对于处理器地址空间中的每个虚拟内存区域,Linux 都必须知道这些虚拟内存从何处而来以及如何将其载入内存以处理页面错误。

  通过使用这个策略,所有的进程虚拟地址可以用相同的方式处理而无需了解底层对于内存管理的区别。如当进程试图访问不存在内存区域时,系统只需要调用页面错误处理过程即可。

  当进程请求分配虚拟内存时, Linux 并不直接分配物理内存。它只是创建一个vm_area_struct 结构来描叙此虚拟内存,此结构被连接到进程的虚拟内存链表中。当进程试图对新分配的虚拟内存进行写操作时,系统将产生页面错误,由Linux核心来处理。

进程创建

  新进程通过克隆老进程或当前进程来创建。系统调用fork 或clone 可以创建新任务,复制发生在核心状态下的核心中。复制完成后,Linux 允许两个进程共享资源而不是复制各自的拷贝。这些资源包括文件、信号处理过程和虚拟内存。进程对共享资源用各自的count 来记数。在两个进程对资源的使用完毕之前,Linux 绝不会释放此资源。

  比如虚拟内存,Linux 使用一种"copy on write"技术:仅当两个进程之一对虚拟内存进行写操作时才拷贝此虚拟内存块。但是不管写与不写,任何虚拟内存都可以在两个进程间共享。只读属性的内存,如可执行代码,总是可以共享的。

执行过程

  Linux 程序通过命令解释器来执行,就是我们常说的shell。除了几个内置命令如cd 和pwd 外,命令都是一个可执行二进制文件。shell 使用上面描叙的fork 机制来复制自身然后用找到的二进制可执行映象的内容来代替其子进程。


阅读(1597) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~