首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

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,在一般进程,线程共享相同的内存地址空间。
(3)进程属性相关字段:
*state:记录进程的状态,可能值为TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE、TASK_ZOMBIE、TASK_STOPPED和TASK_DEAD.
*pid:每个进程都有唯一的进程标识符pid。pid_t类型是short int,pid默认最大值为32768。
继承事业,薪火相传
返回列表