Linux的进程及进程数据结构
一 linux的进程
在Linux系统中,进程被称为任务。
Linux的进程运行时,处理机提供了两种执行状态:
1.内核态:又称系统态,它具有较高的特权,能执行所有的机器指令,能访问
所有的寄存器和存储区域,能直接控制所有的系统资源。
2.用户态 :它具有较低的特权,只能执行规定的机器指令,只能访问进程的存
储空间。在用户态下进程不能与系统硬件相互作用,不能访问系统资源。
进程运行在特权较低的用户态下时,只能通过系统调用(system call)转换为内核态后,才能访问系统空间。
linux进程的组成
Linux进程由三部分组成:
1.正文段(text):存放程序代码。正文段具有只读的属性。
2.用户数据段(user segment):是进程在运行过程中处理数据的集合,它们是
进程直接进行操作的所有数据(包括全部变量在内),以及进程使用的进程堆栈。
3.系统数据段(system segment):存放着进程的控制信息,即进程控制块。Lin
ux中PCB是名字为task_struct的数据结构。
进程的虚拟地址空间
系统为每个进程分配一个独立的虚拟地址空间。进程的虚拟地址空间被分做两个部分:
1.用户空间。用户进程本身的程序和数据(可执行映象)映射到用户空间中。
2.系统空间。内核被映射到所有进程的系统空间中。它们只允许在具有较高特权的内核态下访问。
linux进程的类型
Linux操作系统包括三种不同类型的进程。
1.交互进程:这种进程经常与用户交互。典型的有shell进程、文本编辑进程及图形应用程序。
2.批处理进程:这种进程不必与用户交互,因此经常在后台运行。典型的有编译程序、数据库搜索引擎及科学计算。
3.守护进程:Linux系统启动时启动的进程,并在后台运行。
二 描述linux进程的数据结构
使用名为task_struct的进程控制块来管理linux的进程。
所有的task_struct的指针都存放在task数组中,task数组又称为task向量
task数组大小限制了系统并发执行的进程总数,而物理内存的大小决定了系统中的最大进程数
task_struct包含的主要信息
1.进程的状态和标志信息
状态信息,即state项
1.Running有运行状态,//可运行状态进程组成队列RUN_QUEUE
2.Waiting
可中断等待状态,//可以被信号中断
不可中断等待状态,//进程不能被信号唤醒
3.Zombie僵死状态,
4.Waiting暂停状态,
5.Swapping交换状态
6.Exclusive独占状态。
值 | 说明 | |
|
0 | |
|
1 | |
|
2 | |
|
4 | |
|
8 | |
|
16 | |
|
32 |
flags项,表示进程的标志
2 进程的调度信息
包含了进程的类别,调度策略,进程的优先级。
policy,priority,rt_priority,counter,nice
policy,表示进程调度策略。可以通过系统调用sys_sched_setscheduler()更改
具体的调度策略如下
priority表示进程的静态优先级
priority的值表示每次进程获取cpu之后,可使用的cpu时间,默认为20,
计数单位为jiffies
rt_priority给出实时进程的优先级
counter:进程的动态优先级,轮转法调度的时候表示进程当前还可以运行多久
开始时counter被赋予priority的值,运行一个时钟-1,当减到0的时候引起调度,重新从
run-queue队列中选取counter最大的就绪进程获得cpu
nice 2.4以上的内核中,priority被nice取代
3 进程的标识信息
pid是进程标识号,ppid是父进程标识号
uid和gid,进程的用户标识号和组标识号
euid和egid,进程的有效用户标识号和有效组标识号
pid一般顺序编号,新创建的pid编号通常是前一个pid+1
pid有上限,超出的话就从0开始
32位pid最大值32767
linux通过pidhash表查找对应的task结构,快速通过进程pid找到task_struct结构的进程描述符
4 进程的通信信息
5 进程的家族信息
linux还把可运行的进程通过指针*next_run和*pre_run连接形成双向循环队列RUN_QUEUE
6 时间和定时消息
7 文件系统信息
8 存储管理信息
9 CPU现场保留信息
保留进程的上下文信息