Linux下进程理解及task_struct

进程概念:

从用户角度看:进程是程序的一次动态执行过程
从内核角度看:进程是分配cpu,内存等系统资源的基本单位
每个进程都有自己独立的地址空间和运行状态,进程是系统分配资源的最小单位

说到程序,程序是为了完成指定任务的一系列指令集合。

程序:代码+数据
进程:代码+数据+堆栈+PCB

程序和进程有哪些区别呢?

  • 程序是永久的,进程相对短暂
  • 程序是静态的,进程是动态的
  • 程序无PCB,进程存在PCB对进程进行管理
  • 一个程序可对应多个进程,而一个进程只能对应一个程序
PCB(Process Control Block):

进程是程序的一次动态执行过程,需要对进程的现场信息进行维护,就需要相应的数据结构,对应着C语言的结构体,这个结构体就叫做PCB

PCB是操作系统感知进程存在的数据结构,操作系统中维护一个PCB表,用来标识当前系统中有多个进程

Linux下每个进程的PCB是一个名为 task_struct 的结构体

task_struct结构包含下列 信息:
  • 进程标识符:用来描述本进程的唯一标识符,用来与其他进程进行区别
  • 进程状态
  • 进程调度:调度算法利用该信息来决定系统中的哪一个进程需要执行。
  • 进程间通信:Linux系统支持信号,管道,信号量等内部进程通信机制。
  • 地址空间:定义分配给该进程的虚拟空间
  • 进程优先级:相比于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址
  • 内存指针:包括程序代码和程序相关数据的指针,还有和其他进程共享数据块的指针
  • 上下文数据:进程执行时处理器的寄存器中的数据
  • I/O状态信息:I/O请求及分配给进程的I/O设备
  • 文件系统:进程在运行时打开和关闭的文件,其中包括指向每个打开文件的文件描述符的指针。
  • 时间和计时器:记录进程的创建时间和进程运行所占cpu的时间
  • 链接信息:包括指向父进程,兄弟进程和子进程的指针。
  • 处理器信息:进程运行时使用处理器的寄存器和堆栈等资源,进程挂起时,保存这些内容,恢复进程时,将其再装入处理器中。
  • 其他

进程状态(state)

如图:
这里写图片描述
linux下进程主要有这么几种状态:

  1. TASK_RUNNING 运行态 R:该进程在运行或在运行队列中,在运行队列中的进程只要得到cpu即可立即运行,cpu是他们唯一等待的系统资源。
  2. TASK_INTERRUPTIBLE 可中断睡眠S:进程在等待事件完成,可被信号唤醒,若收到信号,就从等待状态进入运行状态,加入运行队列,等待被调度。
  3. TASK_UNINTERRUPTIBLE 不可中断睡眠D:由于硬件环境不能满足而进行等待,如I/O设备,它在任何情况下都不能被打断,只能以特定的方式进行唤醒,如唤醒函数wake_up()函数
  4. TASK_STOPPED 停止状态T:可通过发送SIGSTOP(18)或SIGCONT(19)来控制进程的停止和继续,正在调试的进程就处于该状态。
  5. TASK_ZOMBIE 僵尸态Z:程序已终止,但由于某种原因,父进程还没有执行wait()系统调用,终止的信息还未回收。若系统中存在大量的僵死进程,可能会造成内存泄漏,因此应进行相应处理以释放其占用资源。

进程标识符

操作系统为每个进程分配一个独一无二的编号,这个编号称为进程标识符。用户可使用的进程标识符的范围一般是 2~32768,可通过下面的命令查看自己系统的最大进程数。
这里写图片描述
0号进程是内核进程,用户看不到
1号进程由0号进程产生,它是第一个用户态进程
这两个进程被操作系统占用,用户不可用
通常,操作系统会选择下一个没有被使用的编号作为进程编号。

猜你喜欢

转载自blog.csdn.net/shidantong/article/details/79775432