zoukankan      html  css  js  c++  java
  • 进程与线程

    为什么要引入进程和线程的问题呢?

    综述

    一项新概念的引入一般都是为了更好的描述或构建一个新的体系。进程与线程也不外乎如此。
    进程是在多道程序系统中引入,但直到目前为止,进程的定义也未能完全统一。而线程则出现的较晚,但却是弥补了进程的一些缺陷,所以线程又名轻进程。

    进程

    关于进程这一概念的解释有很多种,但这些解释都具有同一个特性——强调程序的执行,即进程所具有的一种动态特性,这是进程与程序间本质上的差异。

    进程与程序的区别:

    1. 程序是静态的,进程是动态的。
    2. 程序可通过存储介质长期保存,进程具有生命周期
    3. 程序和进程是一对多的关系,而进程和程序确只能是一对一

    关于进程,我们做出如下讨论。

    进程的类型

    1. 系统进程:也称守护进程,一个系统进程所完成的任务是相对独立和具体的,其优先级高于用户进程。
    2. 用户进程:在操作系统之上运行的所有应用程序都称为用户进程。

    无论是系统进程还是用户进程,都具有:
    并发性,动态性,独立性,交互性,异步性,结构性等几大特性。

    注意:进程是调度的基本单位

    进程的状态

    基本状态有三种:

    1. 运行态(Run):进程占有处理器资源,正在运行。
    2. 就绪态(Ready):进程等待处理器资源,已具备运行条件。
    3. 等待态(Wait):不具备运行条件。

    进程状态转换:
    运行->就绪:剥夺进程所占有的处理器资源(也可能是进程正常执行结束)。
    运行->等待:等待某事件的发生。
    就绪->运行:分配进程处理器资源。
    就绪->等待:不存在。
    等待->就绪:进程所等待的事件以发生,当前正在等待处理器资源。
    等待->运行:不存在。

    NOTE:
    非抢占式调度,不存在运行->就绪的状态转换。
    处理器调度算法对于进程的状态转换具有直接的影响,如上所述即为一种情况。

    进程的组成

    进程控制块(PCB)

    进程控制块是标志进程存在的数据结构(对用户透明),在其中包含系统对进程管理所需要的全部信息。

    PCB中所包含的信息数量与系统规模,功能成正相关关系。

    建立进程->建立PCB
    撤销PCB->撤销进程

    程序

    1. 代码:不采用绝对地址,采用相对地址。
    2. 数据:一般包含静态变量,动态堆(保存动态变量)以及动态栈。

    进程的管理

    进程队列

    1. 就绪队列:根据调度算法确定,一般来说,整个系统就只有一个。
    2. 等待队列:与事件个数对等,即每个等待事件有一个等待队列。
    3. 运行队列:与处理器个数有关,每个CPU有一个。

    创建与撤销

    1. 创建:
      • 建立一个进程控制块
      • 初始化该进程控制块
      • 为该进程分配存储空间
      • 加载所要执行的程序
      • 将进程控制块送入就绪队列

    由父进程创建的子进程是其全盘复制,即子进程除了进程号与父进程不一致外,其他均相同。

    1. 撤销:
      • 撤销进程的内存分配
      • 撤销进程控制块
      • 通知父进程

    进程的撤销的原因可以是正常执行结束,也可以是进程执行是发生错误而结束。

    进程间关系

    逻辑关系:

    1. 相关进程: 具有逻辑联系
    2. 无关进程:无任何逻辑联系

    相互作用:

    1. 直接相互作用: 不需要第三方而发生相互作用

    只能发生在相关进程之间。

    1. 间接相互作用: 需要第三方才能发生作用

    线程

    线程与进程相类似,所以又成线程为轻进程,但线程是进程内的一个相对独立的执行流,即一个线程包含多个线程。

    进程内的多个线程执行同一程序中相同或不同代码段,共享数据区和堆。
    进程是资源的分配单位,线程是CPU的调度单位。

    线程的结构

    线程控制块(TCB)

    TCB中内容较少,因为大多数内容是记录在进程中。
    线程的实现方式决定TCB的归属。

    TCB归属:操作系统空间,用户进程空间。

    线程实现

    1. 核心级别线程(KLT)

      • 并发行好
      • 真正并行
      • 系统开销大
      • 进程状态不具有实际意义
    2. 用户级别线程(ULT)

      • 灵活
      • 实现效率高
      • 不能实现并行
    3. 混合线程

    引入多线程

    当一个应用中进程间的功能有所重叠(如具有相同的代码和数据),此时如果采用多进程的方式,那么对于系统来说,系统开销是非常巨大的。
    所以多线程的引入成为了必需:

    1. 同一进程的多个线程间可共享内存,合作完成某项功能。
    2. 同一进程的多个线程间切换速度快。
    3. 提高处理器与设备之间的并行性。
    4. 多处理器环境下,多线程可并行执行(不同进程)。

    只有当同一进程中的多个线程具有相同代码和数据,或者这些线程之间是合作(执行代码不同部分)的,或者是同构(执行相同代码)。才可以采用多线程处理模式。

    小结

    程序是进程的组成部分,进程是为了执行对应的程序而存在的,如此可知没有程序,进程也失去了讨论的意义。
    而没了进程,线程也就不复存在了。

    本文首发于个人博客,欢迎来撩啊^-^。
  • 相关阅读:
    mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式
    异步httpclient(httpasyncclient)的使用与总结
    spring中Constructor、@Autowired、@PostConstruct的顺序
    面试再问值传递与引用传递,把这篇文章砸给他!
    java float double bigdecimal
    XSD详解一
    Springboot中使用Xstream进行XML与Bean 相互转换
    lombok标签之@Data @AllArgsConstructor @@NoArgsConstructor -如何去除get,set方法。@Data注解和如何使用,lombok
    Spring标签之Bean @Scope
    spring 注解 之 AOP基于@Aspect的AOP配置
  • 原文地址:https://www.cnblogs.com/keepsmart/p/11368485.html
Copyright © 2011-2022 走看看