linux进程(一)概述和进程描述符

一 进程概述:

(1)进程和线程区别:

*进程是资源分配的基本单位,也是调度运行的基本单位;线程是调度的基本单位。

*进程有独立的虚拟地址空间。父子进程共享文件表,但不共享用户地址空间。

*优点:一个进程崩溃后不会对其他进程产生影响。

*缺点:进程间共享数据变得困难,必须使用显式的IPC机制。

*进程虚拟地址空间包括:代码段、堆栈段(临时数据:如函数参数、返回地址和局部变量)、数据段(包括全局变量)、堆(动态分配的内存)等等。

*线程运行在进程的上下文中,所有运行在一个进程内的线程共享该进程的整个虚拟地址空间:代码、数据、堆、共享库和打开文件。

*每个线程有自己的线程上下文:一个线程ID、栈、栈指针、程序计数器、通用目的的寄存器和条件吗。

*创建、切换和终止开销小:线程的上下文比进程的上下文小很多,所以线程的创建、上下文切换和终止要比进程快很多。

*线程间共享数据容易,因为多个线程共享进程地址空间,但需要同步。


(2)进程和程序区别:

*程序本身不是进程,程序只是被动实体,如存储在磁盘上的一系列指令的文件内容(常被成为可执行文件)。

*进程是活动实体,它有一个程序计数器来表示下一个要执行的命令和相关资源集合。

*当一个可执行文件被装入内存时,一个程序才成为进程。

*虽然多个进程可以与统一程序相关,但是它们被当做两个独立的执行序列,都是独立的进程,虽然文本段相同,但是数据段、堆、堆栈段都不同。


(3)进程组成部分:

*进程控制块:由os创建和管理,包含os需要的所有关于进程的信息,主要包含:进程标识信息、处理器状态信息和进程控制信息。

*程序段:即文本段,是进程的组成部分之一。

*数据段:和程序段相关的数据集。


(4)进程的虚拟地址空间:进程的地址空间被分成为各种内存区或叫做段。


*text:代码段,存放程序的可执行命令。

*data:存放已初始化数据。

*BSS:存放未初始化数据。

*堆:用于扩展进程的线性地址空间。

*栈:包含所有已分配内存的局部变量,用作函数调用。


(5)和进程上下文(context)和上下文切换:

*进程上下文:包括程序计数器、寄存器(状态寄存器等)、用户栈、内核栈和各种内核数据结构。

*上下文切换:保存当前进程上下文,恢复新进程上下文,然后将控制权交给新进程。


(6)内核态和用户态:

*进程在生命周期内,或者执行自己的代码或者执行内核代码。内核代码是在系统调用被执行时、异常发生时或者中断到来时(中断执行程序中)执行的代码。

*进程执行的不是内核代码,则进程正运行在用户态;如果进程执行内核代码,则进程处于内核态。

*处理器通常使用某个控制器中的一个模式位来提供这种功能,该寄存器描述了当前进程享有的特权。当设置了模式位时,进程就运行在内核模式中。

*内核态的进程可以执行指令集中的任何指令,并且访问系统中任何存储器的位置;用户态的进程不允许执行特权指令,比如:停止处理器、改变模式位、或者发起一个IO操作,也不允许用户态进程直接引用地址空间中内核区的代码和数据,用户程序必须通过系统调用接口间接的访问内核代码和数据。


(7)用户栈和内核栈:

*内核在创建进程时,在创建task_struct的同时为进程创建相应堆栈,每个进程会有两个栈,一个用户栈存在于用户空间;一个内核栈存在于内核空间。


二 进程描述符:

(1)综述:

*在内核中,进程描述符是一个名为task_struct的结构体,该结构体定义于/usr/src/linux/include/linux/sched.h中,用于存放进程的属性和信息,与进程相关的所有内核信息都存储在这个结构体中。

*内核采用循环双向链表task_list来存放所有进程描述符,并借助全局变量current来存放当前运行进程的task_struct的引用。

*进程可能由一个或多个线程组成,每个线程都对应于一个task_struct,在一般进程,线程共享相同的内存地址空间。

*task_struct结构定义在include/linux/sched.h中。


(2)进程属性相关字段:

*state:记录进程的状态,可能值为TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE、TASK_ZOMBIE、TASK_STOPPED和TASK_DEAD.

*pid:每个进程都有唯一的进程标识符pid。pid_t类型是short int,pid默认最大值为32768。

*exit_code:进程的退出值。

*exit_signal:进程的终止信号。


(3)与调度相关的字段:


(4)进程间关系的字段:

*real_parent:指向当前进程的父进程的进程描述符。若当前进程的父进程已经消亡,那么它指向init的进程描述符。

*children:当前进程的子进程列表。

*sibling:当前进程的兄弟进程列表。

*group_leader:指向当前进程所在进程组组长进程描述符的指针。


(5)与进程用户相关的字段:


(6)与进程限制相关字段:


(7)与文件系统相关:

*fs:保存一个指向文件系统信息的指针。

*files:保存一个指向进程的文件描述符表的指针。


(8)与进程地址空间相关字段:

*mm:指向与地址空间和内存管理相关的信息。

*active_mm:指向最后访问的地址空间的指针。































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值