TheRiver | blog

You have reached the world's edge, none but devils play past here

0%

操作系统-进程线程-原理

参考

陈向群操作系统

关于进程和线程

线程的3种实现方式–内核级线程, 用户级线程和混合型线程


多道处理程序

20200301_多道程序设计.jpg

进程

定义:

进程是正在执行的(并发和并行)可执行程序的实例,进程和线程都可以称为任务

特征

  • 程序的一次执行过程
  • 是正在运行程序的抽象
  • 系统资源以进程为单位分配,如内存、文件、……
  • 每个具有独立的地址空间

进程的意义:

多道程序允许多个程序同时进入内存并运行,每个程序在运行过程中的实例都可以称为进程,进程既包括了程序文件中的信息,还包括堆栈信息,进程表等维持程序运行,切换所需的信息

进程和程序的区别:

  • 进程更能准确刻画并发,而程序不能(一个程序运行2次,就是2个进程)
  • 程序是静态的,进程是动态的
  • 进程有生命周期的,有诞生有消亡,是短暂的;而程序是相对长久的
  • 一个程序可对应多个进程
  • 进程具有创建其他进程的功能

进程的运行状态:

20200301_进程状态转换.jpg

进程的其他状态:

1 创建(new)

已完成创建一进程所必要的工作 – PID、PCB
但尚未同意执行该进程– 因为资源有限

2 终止(terminated)

终止执行后,进程进入该状态
可完成一些数据统计工作
资源回收

3 挂起(suspend)

用于调节负载
进程不占用内存空间,其进程映像交换到磁盘上

20200301_linux状态示意图.jpg

进程队列:

20200301_5状态进程队列模型.jpg

  • 操作系统为每一类进程建立一个或多个队列
  • 队列元素为PCB
  • 伴随进程状态的改变,其PCB从一个队列进入另一个队列
  • 多个等待队列等待的事件不同
  • 就绪队列也可以多个
  • 单CPU情况下,运行队列中只有一个进程

进程创建:

在Unix种只有一个系统调用可以创建新进程(fork),exec族函数是在原有的进程结构种重新加载程序,pid不变

进程的分类:

  • 系统进程

  • 用户进程

  • 前台进程

  • 后台进程

  • cpu密集型进程

  • I/O密集型进程

进程地址空间:

20200301_进程地址空间.jpg

进程上下文切换:

将CPU硬件状态从一个进程换到另一个进程的过程称为上下文切换

进程运行时,其硬件状态保存在CPU上的寄存器(程序计数器、程序状态寄存器、栈指针、通用寄存器、其他控制寄存器的值)

进程不运行时,这些寄存器的值保存在进程控制块PCB中;当操作系统要运行一个新的进程时,将PCB中的相关值送到对应的寄存器中


线程

引入线程的原因:

  • 应用的需要
  • 开销的考虑
  • 性能的考虑

20200301_多线程的意义.jpg

如果一个程序想要同时处理多个事情,这些事情又彼此联系,采用进程的话系统开销,资源分配都很大,且进程间交换数据比较麻烦,采用更小颗粒度的控制流显然比较好


线程和进程的不同

20200301_线程的基本概念.jpg

线程享有进程的资源,但是可以独立运行的cpu最小调度单位

每个过程都提供执行程序所需的资源。进程具有虚拟地址空间,可执行代码,系统对象的打开句柄,安全上下文,唯一的进程标识符,环境变量,优先级类别,最小和最大工作集大小以及至少一个执行线程。每个进程都从单个线程(通常称为主线程)开始,但是可以从其任何线程中创建其他线程。

一个线程是可以调度执行过程中的实体。进程的所有线程共享其虚拟地址空间和系统资源。另外,每个线程维护异常处理程序,调度优先级,线程本地存储,唯一的线程标识符以及系统将用于保存线程上下文直到被调度的一组结构。的线程上下文包括线程的一组的机器寄存器,内核栈,线程环境块,并在该线程的进程的地址空间中的用户栈。线程也可以具有自己的安全上下文,可用于模拟客户端。

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

用户级线程:

由应用程序所支持的线程实现, 内核意识不到用户级线程的实现

  • 在用户空间建立线程库:提供一组管理线程的过程
  • 运行时系统:完成线程的管理工作(操作、线程表)
  • 内核管理的还是进程,不知道线程的存在
  • 线程切换不需要内核态特权
  • 例子:UNIX

图片来源: https://blog.csdn.net/gatieme/article/details/51892437

20200301_用户级线程.jpeg


内核级线程:

内核级线程又称为内核支持的线程

  • 内核管理所有线程管理,并向应用程序提供API接口
  • 内核维护进程和线程的上下文
  • 线程的切换需要内核支持
  • 以线程为基础进行调度
  • 例子:Windows

图片来源: https://blog.csdn.net/gatieme/article/details/51892437

20200301_内核级线程.jpeg


混合式线程:

两者结合方法

  • 线程创建在用户空间完成
  • 线程调度等在核心态完成
  • 多个用户级线程多路复用多个内核级线程

图片来源: https://blog.csdn.net/gatieme/article/details/51892437

20200301组合式线程.jpeg


用户级/内核级线程对比

20200301_用户内核线程对比.jpg

可再入程序(可重入):

可被多个进程同时调用的程序,具有下列性质:

它是纯代码的,即在执行过程中自身不改变;调用它的进程应该提供数据区

并发和并行:

并发是指两个或多个任务可以在重叠的时间段内启动,运行和完成。但每个时刻只有一个任务在执行。例如,单核计算机上的多任务处理。

并行是指任务实际上在同一时间(例如,在多核处理器上)运行。

其他:

线程表和进程表是一样的task_struct

linux不支持内核级线程,线程只是进程的子集,主要区别就是是否有自己的独立的虚拟地址空间

ending

tumblr_ppam2aBE4u1sfie3io1_1280.jpg

----------- ending -----------