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负责收尸。
浙公网安备 33010602011771号