博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux进程学习

Posted on 2010-08-13 20:22  nkzc  阅读(424)  评论(0)    收藏  举报

1.进程和程序的区别

  程序是一组指令的有序集合;
  进程是指在系统中能独立运行并作为资源分配的基本单位,它是由一组指令,数据和堆栈等组成的,是一个能独立运行的活动实体;进程是进程实体的运行过程。
  程序是静态的,进程是动态的,因为程序是一组指令的有序集合而进程是一次运行活动。而且进程在它的生命周期中要经历3种基本状态:等待、就绪、运行,这是程序所没有的。
  程序的存在是永久的,进程的存在是暂时的,进程是一次运行活动,必然有始有终,所以它的存在是暂时的,进程由程序、数据和进程控制块组成,由于进程是程序的执行,所以进程中必然包括程序和数据及记录进程状态信息的进程控制块,一个程序可以对应多个进程,一个进程可以包括多个程序,因为主程序执行过程中可以调用多个其他程序,共同组成“一次运行活动”。

2.进程和线程的区别
  线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
  一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
  系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,除了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
3.进程间状态转化图

4.进程控制块(PCB)的组织方式

进程链表:双向循环链表,每个task _struct中有两个域分别为task struct *prev_task,*next_task;

链表的头和尾都为init_task,它是0号进程的PCB。为了根据pid快速找到对应的PCB,linux采用了一个叫做pid_hashfn的宏来实现散列函数的功能,把pid转换成表的索引。

5.进程调度

调度时机主要有:

1)进程状态转换时,如进程终止、进程睡眠。主要是调用sleep_on(),exit()等函数,这些函数会主动调用调度函数

2)当前进程的时间片用完时。

3)设备驱动程序运行时。(检查need_reshed标志位,如有必要,则调用schedule())

4)从内核态返回到用户态时。(检查need_reshed标志位,如有必要,则调用schedule())

调度的依据:

根据task_struct结构中的4个域加权得到一个值weight(goodness()函数),作为选择进程的唯一依据:counter,prority,policy,rt_policy

6.进程的一生

fork,进程诞生,但此时只是一个老进程的“克隆”->exec,脱胎换骨,离家独立

->自然死亡,即运行到main函数的最后uyige“}",从容的离去;也有可能中途退场,exit或return、

->死亡后会留下一个空壳,wait负责收尸。