浅谈linux下的进程,线程的概念与使用

进程

进程的概念

对于进程的的一个直观的理解可以是:占用内存空间的正在运行着的程序
 比如,你下载游戏安装到硬盘里没有玩 那是程序.开始玩了以后,游戏加载到主内存开始运行就可以称为进程,以上是直观理解,
进程的准确定义是:进程是具有一定独立功能的程序关于某个数据集合的一次运行活动,它是系统资源分配、调度的独立单位。
以上把握三个点:(1)独立功能的程序 (2)关于某个数据集合(3)系统资源分配调度单位
程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
比如你写了一个游戏程序,还没运行时这些代码就是(1)独立功能的程序,
 运行了以后可能在运行的时候回加载一些资源文件比如地图资源,音乐资源等等,这些可以理解为(2)关于某个数据集合
进程在运行的时候必须要接受"上级"--操作系统内核的指挥,操作系统得给它分配一些列资源,cpu资源,内存资源等等
  这就是(3)资源分配调度的基本单位
进程的这三个要点就分别对应了进程组成的三个部分:程序段,数据段,进程控制块(PCB)

进程的组成

先从最重要的进程控制块PCB(Program Control Blocks)开始讲起

进程控制块PCB

在 Linux 中,PCB 是一个名为 task_struct 的结构体,称为任务结构体。

任务结构体的主要内容
任务结构体 task_struct 的大小约 1000B。它定义在源代码的 include/linux/sched.h 下。
下面把它的成员的功能和作用归纳为 9 个方面予以说明:
1)进程的状态和标志 state 和 flags。
2)进程的标识。表示进程标识的成员项:pid,uid,gid 等。PID为值大于二的整数 1要分配给操作系统的首个进程
3)进程的族亲关系,p_opptr、p_pptr、p_cptr、p_vsptr、p_osptr
4)进程间的链接信息。Next_task、prev_task、next_run、prev_run。
5)进程的调度信息。Counter、priority、rt_priotity、policy。
6)进程的时间信息。表示系统中各种时间成员项:start_time、utime、stime、cutime、cstime、timeout。
表示定时器的成员项:it_real_value、it_real_incr、it_virt_value、it_virt_ incr、it_prof_value、it_prof_ incr、
real_timer。
7)进程的虚拟信息。Mm、ldt、saved_kernel_stack、kernel_stack_page。
8)进程的文件信息 Fs、file。
9)与进程通信有关的信息:singnal、blocked、sig、exit_signal、semundo、semsleeping。

任务结构体的管理
1) task[]数组
为了管理系统中所有进程,系统在内核空间设置了一个指针数组 task[],该数组的每一个元素指向一
个任务结构体,所以 task 数组又称 task 向量。如下图 4.1 所示。
30Task 数组的大小决定了系统中容纳进程最大数量。在 linux 内核源代码 kernel/sched.c 中 task 数组的定
义如下:
Struct task_struct *task[NR_TASKS]={&init_task};
可以看到:
 task[]数组是一个指向 task_struct 结构的指针数组。
 其中符号常量 NR_TASKS 决定了数组的大小,在/include/linux/task.h 中,它的默认值被定义512:
#define NR_TASKS 512
 task[]数组的第一个指针指向一个名字为 init_task 结构体,它是系统初始化进程 init 任务结构体。




2)nr_tasks
为了记录系统中实际存在的进程数,系统定义了一个全局变量 nr_tasks,其值随系统中存在的进程数目而变化。在 kernel/fork.c 中,它的定义及初始化如下:
Int nr_tasks =1;



3)双向循环链表
Linux 中把所有进程的任务结构相互连成一个双向循环链表,
其首结点就是 init 的任务结构体 init_task。
这个双向链表是通过任务结构体中的两个成员项指针相互链接而成:
Struct task_struct *next_task;/*指向后一个任务结构体的指针*/
Struct task_struct *prev_task;/*指向前一个任务结构体的指针*/
宏定义:
SET_LINKS:插入一个任务结构体
REMOVE_LINKS:删除一个任务结构体
For_each_task:遍历所有任务结构体

程序段

linux中程序段也叫正文段
正文段:存放进程要执行的指令代码。Linux 中正文段具有只读属性。 

 

数据段

进程运行过程中处理数据的集合,
它们是进程直接进行操作的所有数据,
包括进程运行处理的数据段和进程使用的堆栈。

 

 


进程的状态转换

linux进程转换可以用一幅图去表示

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值