进程与线程

简介: 进程与线程

进程与线程

进程的引入

  • 为什么引入进程?
  • 为了描述多道程序的并发执行,引入了进程的概念,通过进程管理多道程序之间的关系,可以解决对处理机的调度分配以及回收等问题。
  • 单道程序的顺序执行:
  • 程序可以理解为一个时间上按严格次序先后操作的序列。
  • 程序的顺序执行的特征
  • 顺序性:程序的执行严格规定的顺序执行
  • 封闭性:程序在封闭的环境下运行,程序在执行时独占系统资源
  • 可再现性:程序在执行时,只要初始条件一样,则结果必然一样
  • 程序并发执行的特征
  • 间断性(参考第一章多道程序的微观串行性)
  • 失去封闭性
  • 失去可再现性
  • 程序并发执行的条件
  • 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操作系统使用内核级、用户级线程共同使用。
  • 多线程问题:
  • 线程取消
  • 立即取消:线程不需要时立即取消
  • 延迟取消:被取消的线程不断检查它是否应被终止,以一种有序的方式终结自己。
目录
相关文章
|
12天前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
1月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
38 3
|
1月前
|
安全 数据安全/隐私保护 数据中心
Python并发编程大挑战:线程安全VS进程隔离,你的选择影响深远!
【7月更文挑战第9天】Python并发:线程共享内存,高效但需处理线程安全(GIL限制并发),适合IO密集型;进程独立内存,安全但通信复杂,适合CPU密集型。使用`threading.Lock`保证线程安全,`multiprocessing.Queue`实现进程间通信。选择取决于任务性质和性能需求。
52 1
|
1月前
|
Python
解锁Python并发新世界:线程与进程的并行艺术,让你的应用性能翻倍!
【7月更文挑战第9天】并发编程**是同时执行多个任务的技术,提升程序效率。Python的**threading**模块支持多线程,适合IO密集型任务,但受GIL限制。**multiprocessing**模块允许多进程并行,绕过GIL,适用于CPU密集型任务。例如,计算平方和,多线程版本使用`threading`分割工作并同步结果;多进程版本利用`multiprocessing.Pool`分块计算再合并。正确选择能优化应用性能。
22 1
|
5天前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
20天前
|
消息中间件 程序员 调度
如何区分进程、线程和协程?看这篇就够了!
以下是内容摘要,已简化并保持在240字符以内: 嗨,我是小米!今天聊聊进程、线程和协程: - **进程**:资源分配基本单位,独立且隔离。 - **线程**:进程内执行单元,轻量级且共享资源。 - **协程**:比线程更轻量,适合I/O密集型任务。 每种都有独特特点和适用场景,选择合适可优化性能。希望对你有所帮助!更多内容,请关注我的公众号“软件求生”。
28 1
|
26天前
|
存储 缓存 NoSQL
Redis性能优化问题之优化 Redis fork 耗时严重的问题,如何解决
Redis性能优化问题之优化 Redis fork 耗时严重的问题,如何解决
|
26天前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
28 2
|
1月前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
15天前
|
数据采集 并行计算 程序员
Python中的并发编程:理解多线程与多进程
在Python编程中,理解并发编程是提升程序性能和效率的关键。本文将深入探讨Python中的多线程和多进程编程模型,比较它们的优劣势,并提供实际应用中的最佳实践与案例分析。