0
点赞
收藏
分享

微信扫一扫

一文搞懂 Linux 任务、进程和线程


Linux 任务、进程和线程

多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务。Linux就是一个支持多任务的操作系统,比起单任务系统它的功能增强了许多。多任务操作系统使用某种调度策略支持多个任务并发执行。事实上,处理器(单核)在某一时刻只能执行一个任务。每个任务创建时被分配时间片(ms级),任务执行(占用CPU)时,时间片递减。操作系统会在当前任务的时间片用完时调度执行其他任务。由于任务会频繁地切换执行,因此给用户多个任务同时运行的感觉。

多任务操作系统中通常有三个基本概念:任务、进程和线程。

一、任务

任务是一个逻辑概念,指由一个软件完成的活动,或者是为实现某个目的的一系列操作。通常一个任务是一个程序的一次运行,一个任务包含一个或多个完成独立功能的子任务,这个子任务是进程或线程。任务、进程和线程之间的关系如下图所示

一文搞懂 Linux 任务、进程和线程_linux

二、进程

2.1 进程的基本概念

进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,它是操作系统进行资源分配和调度的基本单元。一次任务的运行可以激活多个进程,这些进程相互合作来完成该任务的一个最终目标。进程具有并发性、动态性、交互性和独立性。

Linux系统中主要包括以下三种类型的进程:

  • 交互式进程:这类进程经常与用户进行交互,需要等待用户的输入
  • 批处理进程:这类进行不必与用户进行交互,通常在后台运行
  • 守护进程:这类进程一直在后台运行,和任何终端都不关联
2.2 进程结构

进程不但包括程序的指令和数据,而且包括程序计数器和处理器的所有寄存器以及存储临时数据的进程堆栈。内核将所有进程存放在双向循环链表(进程链表)中,链表的每一项都是 task_struct,称为进程控制块(PCB)的结构。

task_struct 结构中最为重要的两个域为:state(进程状态)和 pid(进程标识符)

1.进程状态

  • 运行状态(TASK_RUNNING):进程正在运行,或者正在运行队列中等待调度
  • 可中断的阻塞状态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态,正在等待某些事件发生或能够占用某些资源
  • 不可中断的阻塞状态(TASK_UNINTERRUPTIBLE):类似于可中断阻塞状态,只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态
  • 暂停状态(TASK_STOPPED):进程的执行被暂停,当进程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时,就会进入暂停状态
  • 僵死状态(EXIT_ZOMBIE):子进程运行结束,父进程未退出,并且未使用wait函数族来回收子进程的退出状态
  • 消亡状态(EXIT_DEAD):这是最终状态,父进程调用wait函数族回收之后,子进程彻底有系统删除,不可见
    一文搞懂 Linux 任务、进程和线程_linux_02

2.进程标识符

Linux内核通过唯一的进程标识符PID来标识每个进程。PID存放在 task_struct 的 pid 字段中。系统可以创建的进程数目有限制,可以查看 /proc/sys/kernel/pid_max 来确定上限。

2.3 进程的创建、执行和终止
  • 通过fork()函数复制当前进程创建一个子进程
  • 通过exec函数族读取可执行文件并将其载入地址空开始运行
  • 把终止的进程设置为僵死状态,其父进程在某个时间调用wait函数族,回收子进程的退出状态,随后子进程占用的所有资源被释放
2.4 进程的内存结构

Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的地址空间,该地址空间是大小为4GB的线性虚拟空间。该技术不但更安全(用户不能直接访问物理内存),而且用户程序可以使用比实际物理内存更大的地址空间。

4GB的进程地址空间被分为两个部分------用户空间与内核空间。用户地址空间是0 ~ 3GB (0xC0000000),内核地址空间占据 3 ~ 4GB

用户空间包括以下几个功能区域(段 segment)

  • 只读段:具有只读属性,包含程序代码(.init 和 .text)和只读数据(.rodata)
  • 数据段:存放的是全局变量和静态变量。其中初始化数据段(.data)存放显示初始化的全局变量和静态变量;未初始化数据段(.bss)存放未进行显示初始化的全局变量和静态变量
  • 栈:由系统自动分配释放,存放函数的参数值、局部变量的值、返回地址等
  • 堆:存放动态分配的数据,一般由程序员动态分配和释放,若程序员不释放,程序结束时可能由操作系统回收
  • 共享库的内存映射区:Linux动态链接器和其他共享库代码的映射区域

三、线程

进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自已的数据段、代码段和堆栈段,这就造成了进程在进行切换时操作系统的开销比较大。为了提高效率,操作系统又引入了另一个概念------线程,也称为轻量级进程。

一个进程可以拥有多个线程,其中每个线程共享该进程所拥有的资源,由于线程共享了进程的资源和地址空间,因此任何线程对系统资源的操作都会给其他线程带来影响。



举报

相关推荐

0 条评论