Linux进程基础

进程

进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。

课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。

进程的三种状态

1.等状态:等待某个事件的完成。
2.就绪态:等待系统分配处理器以便运行。
3.运行态:占有处理器正在运行。
!三种状态的转化

描述进程PCB

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,

课本上称之为PCB( process control block),Lnux操作系统下的PCB是: task struct

task_struct-PCB的一种

在Lnux中描述进程的结构体叫做 task struct.Task_struct是 Linux内核的一种数据结构,它会被装载到RAM内存)里并且包含着进程的信息

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在linux-2.6.38.8/include/linux/sched.h文件中。

task struct内容分类

task_struct结构:

  • 标示符:描述本进程的唯一标示符,用来区别其他进程
  • 状态:任务状态,退出代码,退出信号等
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针,上下文数据:进程执行时处理器的寄存器中的数据休学例子,要加图CPU,寄存器]
  • I/O状态信息:包括显示的O请求分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
  • 其他信息

组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以 task struct链表的形式存在内核里

查看进程
进程的信息可以通过/proc系统文件夹查看

1.进程状态,将记录进程在等待,运行或死锁。

volatile long state;  
int exit_state;

state成员的可能取值如下:

#define TASK_RUNNING        0  
#define TASK_INTERRUPTIBLE  1  
#define TASK_UNINTERRUPTIBLE    2  
#define __TASK_STOPPED      4  
#define __TASK_TRACED       8  
/* in tsk->exit_state */  
#define EXIT_ZOMBIE     16  
#define EXIT_DEAD       32  
/* in tsk->state again */  
#define TASK_DEAD       64  
#define TASK_WAKEKILL       128  
#define TASK_WAKING     256  

系统中的每个进程都必然处于以上所列进程状态中的一种。

TASK_RUNNING表示进程要么正在执行,要么正要准备执行。
TASK_INTERRUPTIBLE表示进程被阻塞(睡眠),直到某个条件变为真。条件一旦达成,进程的状态就被设置为TASK_RUNNING。
TASK_UNINTERRUPTIBLE的意义与TASK_INTERRUPTIBLE类似,除不能通过接受一个信号来唤醒以外。
__TASK_STOPPED表示进程被停止执行。
__TASK_TRACED表示进程被debugger等进程监视。
EXIT_ZOMBIE表示进程的执行被终止,但是其父进程还没有使用wait()等系统调用获知它的终止信息。
EXIT_DEAD表示进程的最终状态。
EXIT_ZOMBIE和EXIT_DEAD也可以存放在exit_state成员中。进程状态的切换过程和原因大致如下图

这里写图片描述
- 图片来自《Linux Kernel Development》

2.调度信息,由哪个调度函数调度,怎样调度等。

3.进程的通讯情况

4.因为要插入进程树,必须有联系父子兄弟的指针,当然是task_struct型

5.时间信息,比如计算好执行的时间,以便cpu分配。

6.标号,决定改进进程归属

7.可以读写打开文件的一些信息

8.进程上下文和内核上下文

9.处理器上下文

10.内存信息

因为每一个PCB都是这样的,只有这些结构,才能满足一个进程的所有要求

2、进程标识符(PID)

pid_t pid;  
pid_t tgid; 

在CONFIG_BASE_SMALL配置为0的情况下,PID的取值范围是0到32767,即系统中的进程数最大为32768个。

/* linux-2.6.38.8/include/linux/threads.h */  
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000) 

在Linux系统中,一个线程组中的所有线程使用和该线程组的领头线程(该组中的第一个轻量级进程)相同的PID,并被存放在tgid成员中。只有线程组的领头线程的pid成员才会被设置为与tgid相同的值。注意,getpid()系统调用返回的是当前进程的tgid值而不是pid值。


待续

僵尸进程(Zombies):

(1)僵尸进程是一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。

(2)一个进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait(),则僵尸进程无法回收,等到其父进程退出后该进程将被init收回。

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

  1. 环境变量相关,setenv, export等环境变量相关的函数和命令.

猜你喜欢

转载自blog.csdn.net/ego_bai/article/details/79643447