进程与线程

简介: 进程与线程

进程与线程

进程的引入

  • 为什么引入进程?
  • 为了描述多道程序的并发执行,引入了进程的概念,通过进程管理多道程序之间的关系,可以解决对处理机的调度分配以及回收等问题。
  • 单道程序的顺序执行:
  • 程序可以理解为一个时间上按严格次序先后操作的序列。
  • 程序的顺序执行的特征
  • 顺序性:程序的执行严格规定的顺序执行
  • 封闭性:程序在封闭的环境下运行,程序在执行时独占系统资源
  • 可再现性:程序在执行时,只要初始条件一样,则结果必然一样
  • 程序并发执行的特征
  • 间断性(参考第一章多道程序的微观串行性)
  • 失去封闭性
  • 失去可再现性
  • 程序并发执行的条件
  • R(P1) ∩ W(P2) U R(P2) ∩ W(P1) U W(P1) ∩ W(P2)={};
  • 对于同一未加保护的数据执行读写、写读、写写操作违反Bernstein条件(程序并发执行的条件)
  • 进程的概念
  • 一个进程就是正在执行的程序。进程可以定义为并发执行的程序在一个数据集合上的执行过程
  • 进程是一个可以拥有资源的独立单位。
  • 进程是一个可以独立调度和分派的基本单位。
  • 进程跟程序的关系
  • 进程
  • 动态性、并发性、暂时性。
  • 结构特征:由程序、数据、PCB 组成。
  • 程序
  • 静态性、 顺序性、永久性。
  • 进程与程序密切相关。一个程序可以包含很多个进程。

进程的状态及组成

  • 进程的三种基本状态
  • 运行状态(进程占据CPU)
  • 就绪状态(进程已经获得除CPU的所有必要资源)
  • 阻塞状态(当进程由于等待某个I/O或同步事件暂停运行)
  • 进程三种基本状态的转换

graph LR

A[就绪]-->|程序调度|B[运行]

B-->|I/O资源被占用......|C[阻塞]

B-->|时间片用完|A

C-->|阻塞的原因被解除|A

  • 进程的创建以及退出状态
  • 创建状态:被创建的进程进入就绪队列
  • 退出状态:当进程完成了预期任务或者异常终止,进程转化为退出态
  • 进程五种状态的转换

graph LR

A[就绪]-->|程序调度|B[运行]

B-->|I/O资源被占用......|C[阻塞]

B-->|时间片用完|A

C-->|阻塞的原因被解除|A

D[创建状态]-->|接纳|A

B-->|完成预期任务......|E[退出状态]

  • 进程的挂起状态
  • 内外存对换紧张
  • 程序调试需要
  • 实时系统的负载需要

graph LR

A[就绪]-->|程序调度|B[运行]

B-->|I/O资源被占用......|C[阻塞]

B-->|时间片用完|A

C-->|阻塞的原因被解除|A

D[创建状态]-->|接纳|A

B-->|完成预期任务......|E[退出状态]

B-->|抢占式系统可能发生|F[就绪挂起]

C-->G[阻塞挂起]

A-->|挂起|F

F-->|激活|A

G-->|激活|C

G-->|I/O事件完成|F

  • 进程控制块(PCB)
  • 进程映像:需要一个数据结构来描述进程本身的特性、进程的状态、进程的调度信息、对资源的占有。
  • 进程映像由PCB、数据、程序、栈组成。
  • 作用:使一个在多道程序的环境下不能独立运行的程序成为一个独立运行的基本单位。系统总是通过访问PCB来感知进程的存在。
  • PCB中的内容
  • 进程描述信息
  • 进程名、进程标识符、用户名
  • 进程控制和资源占用信息
  • 程序入口地址、程序外存地址、进程同步以及通信机制、资源占用信息、链接指针
  • 进程调度信息
  • 进程状态、进程优先级、运行统计信息、进程阻塞原因
  • 处理机状态信息
  • 通用寄存器、指令计数器、程序状态字、栈指针
  • PCB的组织
  • 把许多具有相同状态的PCB链接在一起

进程控制

  • 核心态以及用户态:为了防止操作系统及其关键数据结构被用户无意或者有意篡改。将处理机的执行状态分为核心态以及用户态
  • 内核:与硬件紧密相关,且这部分程序必须常驻内存以提高操作系统的运行效率,这部分程序通常称作内核
  • 原语:许多指令构成的,完成一定功能的过程,由原子操作完成
  • 进程家族树:父进程撤销,则其下面所有进程全部撤销
  • 进程的创建以及撤销
  • 进程创建:应用请求、提供服务......
  • 创建原语:
  • 申请空白PCB
  • 初始化进程信息
  • 为进程分配资源
  • 将新进程插入就绪队列
  • 进程的撤销:
  • 撤销原语:
  • 查找需要撤销进程的PCB
  • 若进程处于运行则终止,并重新调度程序运行
  • 若进程有子孙,则终止所有子孙进程
  • 归还资源
  • 从所在的队列移除
  • 进程的阻塞以及唤醒
  • 阻塞原语:
  • 停止执行的进程
  • 将进程插入阻塞队列
  • 重新调度
  • 唤醒原语:
  • 将进程解下阻塞队列
  • 把进程插入就绪队列
  • 改变进程的PCB的状态
  • 进程的挂起与激活:
  • 挂起原语:
  • 检测被挂起进程的状态
  • 若进程处于就绪态,则变为就绪挂起状态
  • 若进程处于阻塞状态,则变为阻塞挂起状态
  • 若进程正在运行,则将进程转为就绪挂起态
  • 激活原语:
  • 检查被激活进程的状态
  • 若进程处于就绪挂起,则变为就绪态
  • 若进程处于阻塞态,则变为阻塞态
  • 若系统采用的是抢占式进程调度
  • 线程
  • 线程:比进程更小、能独立运行的基本单位
  • 多线程的优点:响应度高、资源共享、经济
  • 线程是进程的一个实体,是被独立调度和分派的单位
  • 线程又称轻型进程(LWP)

为了提高进程的并发度,同时减少系统的开销。操作系统学者把进程的两个基本属性分开。

既进程作为独立分配资源的单位,不在作为调度以及分派的基本单位

  • 线程的组成
  • TCB(线程控制块)
  • 线程标识符
  • 描述处理机状态信息的一组寄存器
  • 栈指针(用户栈/核心栈)
  • 私有存储区
  • 线程的状态
  • 参考进程
  • 线程的控制
  • 线程创建
  • 线程的撤销
  • 线程的等待
  • 线程让权(自愿放弃CPU)
  • 单线程进程模型
  • PCB、用户地址空间、用户栈、内核栈
  • 多线程进程模型
  • PCB
  • 用户地址空间
  • 多个(TCB、用户栈、内核栈)
  • 引入线程的必要性
  • 创建一个线程比进程所需的时间少
  • 撤销一个线程比撤销进程花费的时间少
  • 线程之间的切换比进程之间切换花费的时间少
  • 线程提高了不同执行程序之间的通信效率
  • 线程的实现
  • 用户线程(由应用程序完成,不依赖内核)
  • 内核级线程(依赖内核)
  • 用户级线程的优点
  • 线程切换状态不需要系统状态的转换
  • 每个进程可以使用专门的调度算法来调度线程
  • 用户级线程可以在任何操作系统运行而不需要操作系统支持
  • 内核级线程的优点
  • 在多处理机的环境中,可以把一个进程的多个线程分配到多个CPU上。
  • 如果进程中某个线程被阻塞,内核可以调度一个进程的另一个线程
  • 内核级线程本身可以被设置成为多线程
  • 组合方法
  • solaris操作系统使用内核级、用户级线程共同使用。
  • 多线程问题:
  • 线程取消
  • 立即取消:线程不需要时立即取消
  • 延迟取消:被取消的线程不断检查它是否应被终止,以一种有序的方式终结自己。
目录
相关文章
|
20天前
|
UED 开发者 Python
探索操作系统的心脏:理解进程与线程
【8月更文挑战第31天】在数字世界的海洋中,操作系统犹如一艘巨轮,其稳定航行依赖于精密的进程与线程机制。本文将揭开这一机制的神秘面纱,通过深入浅出的语言和直观的代码示例,引领读者从理论到实践,体验进程与线程的魅力。我们将从基础概念出发,逐步深入到它们之间的联系与区别,最后探讨如何在编程实践中高效运用这些知识。无论你是初学者还是有经验的开发者,这篇文章都将为你的技术之旅增添新的航标。
|
26天前
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
33 1
|
5天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
24天前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
29天前
|
存储 Java 编译器
进程和线程
进程和线程
103 25
|
13天前
|
存储 Java 数据处理
进程中的线程调度
进程是应用程序运行的基本单位,包括主线程、用户线程和守护线程。计算机由存储器和处理器协同操作,操作系统设计为分时和分任务模式。在个人PC普及后,基于用户的时间片异步任务操作系统确保了更好的体验和性能。线程作为进程的调度单元,通过覆写`Thread`类的`run`方法来处理任务数据,并由系统调度框架统一管理。微服务架构进一步将应用分解为多个子服务,在不同节点上执行,提高数据处理效率与容错性,特别是在大规模数据存储和处理中表现显著。例如,利用微服务框架可以优化算法,加速业务逻辑处理,并在不同区块间分配海量数据存储任务。
|
22天前
|
调度
深入理解操作系统:进程与线程的管理
【8月更文挑战第29天】在数字世界的每一次点击和滑动背后,都隐藏着操作系统的精妙运作。本文将带你探索操作系统的核心概念之一——进程与线程的管理。我们将从基础定义出发,逐步深入到它们在内存中的表示、状态变迁以及它们之间错综复杂的关系。通过简洁明了的语言和直观的比喻,即便是没有计算机背景的读者也能轻松理解这一主题。准备好了吗?让我们一起揭开操作系统神秘的面纱,探索那些看似晦涩却无比精彩的知识吧!
|
23天前
|
调度 Python
深入理解操作系统:进程与线程的奥秘
【8月更文挑战第27天】本文将带你走进操作系统的核心,探索进程和线程这两个基本概念。我们将从它们的定义开始,逐步深入到它们之间的联系和区别,以及在操作系统中的作用。通过本文,你将了解到进程和线程不仅仅是编程中的两个术语,它们是操作系统管理资源、实现并发和并行的关键。最后,我们还将通过一个代码示例,展示如何在Python中创建和管理线程。
|
23天前
|
算法 调度 开发者
深入理解操作系统:进程与线程管理
【8月更文挑战第28天】在数字世界的心脏跳动着的是操作系统,它是计算机硬件与软件之间的桥梁。本文将带你探索操作系统的核心概念——进程与线程,揭示它们如何协同工作以支持多任务处理和并发执行。通过实际代码示例,我们将深入了解这些抽象概念是如何在真实系统中实现的。无论你是编程新手还是资深开发者,这篇文章都将为你提供新的视角,让你对操作系统有更深刻的认识。
|
27天前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?

相关实验场景

更多