Task_struct结构体

来源:互联网 发布:java oa系统 源码下载 编辑:程序博客网 时间:2024/06/05 20:06

Linux系统中的每个进程都有一个名为task_struct的数据结构,它相当于“进程控制块(PCB)”。
内核在为每个进程分配Task_struct结构的内存空间时,实际上一次性分配两个连续的 内存页面(共8KB),其底部约1KB空间存放Task_struct结构,上面的7KB空间存放进程系统空间堆栈。
这里写图片描述
Test_struct结构字段介绍:


1、标志符

描述本进程的唯一标示符,用来区别其他进程。

系统中每个进程都有唯一的一个进程标志符(pid)。
进程ID(pid)父进程ID(ppid)。
每个进程还包括:
1)、用户标志符(uid)和用户组标志符(gid)。
2)、有效用户标志符(euid)和有效用户组标志符(egid)。
3)、备份用户标志符(suid)和备份组标志符(sgid)。
4)、文件系统系统用户标志符(fsuid)和文件系统组标志符(fsgid)。


2、进程状态

在Linux中,进程有五种描述状态:
1)、运行状态(TASK_RUNNING)。进程正在运行(即系统的当前运行)或准备运行(即就绪状态)。当前进程由运行指针所指向。
2)、可中断等待状态(TASK_INTERRUPTIBLE)。 此时进程在“浅度睡眠”,等待一个事件的发生或某种系统资源,它能够被信号或中断唤醒。当所等待的资源得到满足时,它也被唤醒。
3)、不可中断等待状态(TASK_UNINTERRUPTIBLE)。此时进程在“深度睡眠”,等待队列中,不能被信号或中断唤醒,只有所等待的资源得到满足时,才能被唤醒。
4)、停止态(TASK_STOPPED)。通常由于接收一个信号,致使进程停止。正在被调试的进程可能处于停止态。
5)、僵死态(TASK_ZOMBIE).由于某些原因,进程被终止了,但该进程的控制结构(Task_struct)仍然保留着。
linux进程状态的变化:
这里写图片描述


3、调度信息

任何要占有CPU,真正处于执行状态,就必须经由进程调度。
操作系统的进程调度机制需要兼顾三种不同类型的进程调度。分别是:交互进程,批处理进程,和实时进程。
进程调度机制主要涉及:
1)、调度方式:Linux内核的调度方式基本采用“抢占式优先级”方式。
核心为系统中每个进程计算出一个优先权,高优先权的进程优先得到运行。核心从进程就绪队列中挑选一个优先级最高的进程,为其分配一个CPU时间片,使其投入运行。
2)调度策略:三种策略SCHED_FIFO、SCHED_RR和SCHED_OTHER
SCHED_FIFO适合于实时进程,时间要求性比较强,每次运行所需的时间比较短。
SCHED_RR适合于每次运行需要较长时间的实时进程。
SCHED_OTHER适合于交互式的分时进程。
3)、调度时机有:
- 当前进程调用系统调用nanosleep()或pause(),使自己进入休眠状态,主动让出一段时间的CPU使用权。
- 进程终止,永久的放弃对CPU的使用。
- 在时钟中断处理程序执行过程中,发现当前进程连续运行时间过长。
- 当唤醒一个睡眠进程时,发现被唤醒的进程比当前进程更有资格运行。
- 一个进程通过执行系统调用来改变调度策略或降低自身优先权(nice)从而引起立即调度。
4)调度算法:进程调度算法比较简单,以便减少频繁调度时的系统开销。Linux执行进程调度时,首先查找所有在就绪队列的进程,从中选出优先级最高且在内存的一个进程。如果队列中有实时进程,那么优先运行。如果需要运行的进程不是当前进程,那么当前进程就被挂起,保存所涉及的一切机器状态。然后选中的恢复运行。


4、内部进程信息

Linux系统支持信号、管道、信号量等内部进程通信机制。
1)、信号机制是在软件层次上对中断机制的一种模拟。系统预先规定若干不同类型的信号,各表示发生了不同的事件,每个信号对应一个编号。进程遇到相应的事件或出现特定的要求(进程终止或出现某些错误——非法指令,地址越界等),就把一个信号写到相应进程Task_struct结构。接收信号的进程在运行中检测自身是否收到了信号,如过已收到,则转去执行预先规定好的信号处理程序。处理后,返回原先正在执行的进程。
信号实现进程间通信的过程:
这里写图片描述
进程接到信号后,在一定时机做相应处理:
- 忽略信号
- 阻塞信号
- 由进程处理该信号
- 由系统默认处理
2)、管道文件
管道是Linux中最常用的IPC机制。一个管道就是链接两个进程的一个打开文件。
管道文件不属于用户直接命名的普通文件,它是利用系统调用的pipe()创建的、在同族进程间进行大量的信息传送的打开文件。
每个管道只有一个内存页面作缓冲区,按环缓冲方式使用。就是每读或写到页面的末端,就又回到开头。
由于管道缓冲区只限于一个页面,因此,当写进程有大量数据要写时,每写满一个页面,就要睡眠等待,等读进程从管道中读走一些数据而腾出空间时,读进程唤醒写进程,写进程就继续写入数据。对读进程,缓冲区有数据就读出,没有数据就睡眠,等待写进程向缓冲区中写数据;当写进程写入数据后,就唤醒正在等待的读进程。
3)System V IPC机制三种进程间的通信:
(1)、消息通信:一个进程可以通过系统调用建立一个消息队列,然后任何进程都可以通过系统调用向这个队列发送消息或从队列中接收消息,实现进程间信息传递。
(2)、共享内存:一个进程可以通过系统调用设立一片共享内存,然后其他进程就可以通过系统调用将该内存区映射到自己的用户地址空间。
(3)、信号量:信号量机制可以实现进程间的同步,保证若干进程对共享的临界资源的互斥。(信号量是系统内的数据结构,它的值代表着可以使用的资源的数量,可以被一个或多个进程进行检测和设置)


5、链接信息

在Linux系统中,每个进程都与其他进程存在联系。除初始化进程(init)外,每个进程都有父进程。该链接信息包括指向父进程,兄弟进程和子进程的指针。
利用fork()建立新的进程,以父进程为模板,大部分和父进程相同。
父子进程对于代码是共享的,对于数据是一人一份的。
父子进程之间的区别:
1. fork的返回值
2. 进程ID不同
3. 具有不同的父进程ID
4.子进程的tms_utime、tms_stime、tms_cutime及tms_ustime均被设置为0
5. 父进程设置的文件锁不会被子进程继承
6. ⼦子进程的未处理闹钟被清除
7.子进程的未处理信号集被设置为空集 fork


6、时间和计时器

内核要记录进程的创建时间和进程运行时间所占的CPU时间。Linux系统支持进程的时间间隔计时器。
一个进程从创建到终止叫做该进程的生存期。进程在其生存期内使用CPU的时间,内核都要进行记录,以便进行统计、计费等有关操作。进程耗费CPU的时间由两部分组成:一是在用户模式(或称为用户态)下耗费的时间、一是在系统模式(或称为系统态)下耗费的时间。每个时钟滴答,也就是每个时钟中断,内核都要更新当前进程耗费CPU的时间信息。


7、文件系统

进程在运行时可以打开和关闭文件。Task_struct结构中包括指向每个打开文件的文件描述符的指针,并且包括两个指向VFS(虚拟文件系统)索引节点的指针。第一个索引节点是进程的根目录,第二个节点是当前的工作目录。两个VFS索引节点都有一个计数字段,用于记录访问该节点的进程数。
在文件系统中,每个VFS索引节点唯一描述一个文件或目录,同时该节点也是向更低层的文件系统提供的统一的接口。


8、虚拟内存

大多数进程都使用虚拟内存空间。Linux系统必须了解如何将虚拟内存映射到系统的物理内存。
每个内存都有一个地址空间,是个虚拟地址。
从虚拟内存到到物理内存是通过页表的映射。如:
这里写图片描述
这样可以有效的保护物理地址。


9、处理器信息

每个进程运行时都要使用处理器的寄存器及堆栈等资源。当一个进程挂起时,所有有关处理器的内容都要保存到进程的Task_struct数据结构中。当进程恢复时,所有保存的内容再装入处理器中。

1 0
原创粉丝点击