Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3351915
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类: C/C++

2011-12-22 15:40:06

1.为什么计算机操作系统要引进进程
       在操作系统中引入进程的目的是为了使多个程序并发执行 ,以改善资源利用率及提高系统吞吐量。

2.进程的概念
       进程是程序的一次执行,进程是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位)
       进程又称任务,是一个动态的使用系统资源、处于活动状态的应用程序。

3.进程由什么组成
       进程由进程控制块(PCB),数据,程序3部分组成。其中PCB是进程的灵魂。
       进程控制块PCB中包含了进程的所有信息,主要包括进程PID、进程所占有的内存区域、文件描述符和进程环境等信息。

4.进程的状态
       进程的三种最基本的状态是:运行态(running),等待态(readying), 阻塞态(block)
       #define TASK_RUNNING 0 //运行状态
       #define TASK_INTERRUPTIBLE 1 //等待状态(可被中断)
       #define TASK_UNINTERRUPTIBLE 2  //等待状态(不可被中断)
       #define TASK_STOPPED 4  //停止状态
       #define TASK_ZOMBIE 8  //睡眠状态
       #define TASK_DEAD 16  //僵死状态

5.进程和程序的区别
       进程是动态的,程序是静态的。
       进程时运行中的程序,程序是一些保存在硬盘上的可执行的代码。

6.进程的优缺点
优点
       使多个程序并发执行
缺点
       程序并发执行时付出了巨大的时空开销,每个进程在进行切换时身上带了过多的“累赘”导致系统效率降低。
      于是人们为了解决这个缺点想到让进程在并行时不拥有资源---从而引入了线程的概念:即线程本身不拥有资源或者是很少的资源,进程只是拥有资源的基本单位,线程是调度的基本单位

       引入线程减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性。

7.进程的表示
       在 Linux 内核内,进程是由相当大的一个称为 task_struct 的结构表示的。此结构包含所有表示此进程所必需的数据,此外,还包含了大量的其他数据用来统计(accounting)和维护与其他进程的关系(父和子)。对 task_struct 的完整介绍超出了本文的范围,以下代码给出了 task_struct 的一小部分。这些代码包含了本文所要探索的这些特定元素。task_struct 位于 ./linux/include/linux/sched.h。

task_struct 的一小部分
  1. struct task_struct {
  2.     volatile long state;
  3.     void *stack;
  4.     unsigned int flags;

  5.     int prio, static_prio;

  6.     struct list_head tasks;

  7.     struct mm_struct *mm, *active_mm;

  8.     pid_t pid;
  9.     pid_t tgid;

  10.     struct task_struct *real_parent;

  11.     char comm[TASK_COMM_LEN];

  12.     struct thread_struct thread;

  13.     struct files_struct *files;
  14.     ...
  15. };
详见《Linux2.25进程结构task_struct

8.进程分配
       Linux 内所有进程的分配有两种方式。第一种方式是通过一个哈希表,由 PID 值进行哈希计算得到;第二种方式是通过双链循环表。循环表非常适合于对任务列表进行迭代。由于列表是循环的,没有头或尾;但是由于 init_task 总是存在,所以可以将其用作继续向前迭代的一个锚点。让我们来看一个遍历当前任务集的例子。
       任务列表无法从用户空间访问,解决方法详见《文献3》。

9.程序转化为进程
通常需要经过以下步骤:
       内核将程序读入内存,为程序分配内存空间
       内核为该进程分配进程标识符(PID)和其他资源
       内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行。程序转化为进程后就可以 被操作系统的调度程序执行了。

10.进程的内存映像
       进程的内存映像是指内核在内存中如何存放可执行程序文件 。在将程序转化为进程的过程中,操作系统将可执行程序由硬盘复制到内存中。
linux下程序映像的一般布局如下:(从低地址到高地址)
       1>代码段:代码段是只读的,可被多个进程共享。
       2>数据段: 存储已被初始化的变量,包括全局变量和已被初始化的静态变量。
       3>未初始化数据段:存储未被初始化的静态变量,它也被称为bss段
       4>堆:用于存放程序运行中动态分配的变量
       5>栈:用户函数调用,保存函数的返回地址,函数的参数,函数内部定义的局部变量。


参考文献
1.Linux进程学习总结.
2.linux获取进程信息函数.http://blog.csdn.net/jpcfei/article/details/6288467
3.Linux 进程管理剖析.http://www.ibm.com/developerworks/cn/linux/l-linux-process-management/
阅读(1303) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~