2.1.2操作系统(进程通信 线程的概念和特点 多线程模型)

简介: 进程通信什么是进程通信?1.共享存储2.管道通信3.消息传递4.客户机--服务器系统线程的概念和特点 什么是线程,为什么要引入线程?线程的特性和优点引入线程机制后,有什么变化?线程的实现方式多线程模型线程的实现方式用户级线程(User-Level Thread, ULT)内核级线程(Kernel-Level Thread, KLT, 又称“内核支持的线程”)多线程模型一对一模型多对一模型多对多模型

进程通信


什么是进程通信?


顾名思义,进程通信就是指进程之间的信息交换。


进程是分配系统资源的单位(包括内存地址空间),因此 各进程 拥有的 内存地址空间相互独立 。



为了保证安全, 一个进程不能直接访问另一个进程的地址空间 。 但是进程之间的信息交换又是必须实现的。 为了保证进程间的安全通信,操作系统提供了一些方法。


1.共享存储


两个进程对共享空间的 访问 必须是 互斥 的(互斥访问通过操作系统提供的工具实现)。操作系统只负责提供共享空间和同步互斥工具(如P 、 V 操作)


基于数据结构 的共享:比如共享空间里只能放 一个长度为10 的数组。这种共享方式速度慢、 限制多,是一种 低级通信 方式


基于存储区 的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种 高级通信 方式


2.管道通信


1. 管道只能采用 半双工通信 ,某一时间段内只能实现单向的传输。如果要实现 双向同时通信 ,则 需要设置两个管道 。


2. 各进程要 互斥 地访问管道。


3. 数据以字符流的形式写入管道,当 管道写满 时, 写进程 的 write() 系统调用将被 阻塞 ,等待读进程将数据取走。当读进程将数据全部取走后, 管道变空 ,此时 读进程 的 read() 系统调用将被 阻塞 。


4. 如果 没写满,就不允许读。 如果 没读空,就不允许写。


5. 数据一旦被读出,就从管道中被抛弃,这就意味着 读进程最多只能有一个 ,否则可能会有读错数据的情况


3.消息传递


进程间的数据交换以 格式化的消息 ( Message )为单位。进程通过操作系统提供的“发送消息 / 接收


消息”两个 原语 进行数据交换。


4.客户机--服务器系统


(了解即可)


客户机/服务器系统 Client/server system 简称C/S系统。是一类按新的应用模式运行的分布式计算机系统。现在的LAN,Internet提供的多种服务都是这种模式


线程的概念和特点



什么是线程,为什么要引入线程?






线程的特性和优点




进程间并发,开销很大  线程间并发,开销更小     引入线程机制后,并发带来的系统开销降低,系统并发性提升


注意:从属于不同进程的线程间切换,也会导致进程的切换!开销也大!




从属同一进程的各个线程共享进程拥有的资源。 进程间通信必须请求操作系统服务(CPU 要切换到核心态),开销大同进程下的线程间通信,无需操作系统干预,开销更小


注意:从属于不同进程的线程间通信,也必须请求操作系统服务!


引入线程前, 进程 既是 资源分配 的基本单位,也是 调度 的基本单位。


引入线程后, 进程是资源分配的基本单位,线程是调度的基本单位。


线程也有运行态、就绪态、阻塞态


在 多 CPU 环境下,各个线程也可以分派到不同的CPU 上 并行 地执行。


引入线程后,进程是资源分配的基本单位。而 线程几乎不拥有资源 ,只拥有极少量的资源(线程控制块TCB 、寄存器信息、堆栈等)


引入线程机制后,有什么变化?


类比:


切换进程运行环境:有一个不认识的人要用桌子,你需要你的书收走,他把自己的书放到桌上


同一进程内的线程切换 = 你的舍友要用这张书桌,可以不把桌子上的书收走

线程的实现方式多线程模型


线程的实现方式


用户级线程(User-Level Thread, ULT)


历史背景:早期的操作系统(如:早期Unix)只支持进程, 不支持线程。当时的“线程”是由线程库实现的



从代码的角度看,线程其实就是一段代码逻辑。 上述三段代码逻辑上可以看作三个“线程”。 while 循环就是一个最弱智的“线程库”,线程库完成了对线程的管理工作(如调度)。


很多编程语言提供了强大的线程库,可以实现线程的创建、销毁、调度等功能。


1. 线程的管理工作由谁来完成?


用户级线程由应用程序通过线程库实现,

所有的 线程管理工作 都由 应用程序负责 (包

括线程切换)


2. 线程切换是否需要CPU变态?


用户级线程中, 线程切换 可以在 用户态 下

即可完成,无需操作系统干预。


3. 操作系统是否能意识到用户级线程的存在?


在用户看来,是有多个线程。但是在操作

系统内核看来,并意识不到线程的存在。


“ 用户级线程 ”就是“ 从用户视角看能看到

的线程 ”


4. 这种线程的实现方式有什么优点和缺点?


优缺点


优点:用户级线程的切换在用户空间即可完

成,不需要切换到核心态,线程管理的系统

开销小,效率高


缺点:当一个用户级线程被阻塞后,整个进

程都会被阻塞, 并发度不高 。多个线程不可

在多核处理机上并行运行。


内核级线程(Kernel-Level Thread, KLT, 又称“内核支持的线程”)



大多数现代操作系统都实现了内核级线程,如Windows、 Linux


1. 线程的管理工作由谁来完成?

 内核级线程的管理工作 由 操作系统内核 完

成。


2. 线程切换是否需要CPU变态?

线程调度、切换等工作都由内核负责,因

此 内核级线程的切换 必然需要在 核心态 下才

能完成。


3. 操作系统是否能意识到内核级线程的存在?

操作系统会为每个内核级线程建立相应的

TCB ( Thread Control Block ,线程控制块),

通过 TCB 对线程进行管理。 “内核级线程” 就

是 “从操作系统内核视角看能看到的线程”


4. 这种线程的实现方式有什么优点和缺点?


优缺点


优点:当一个线程被阻塞后,别的线程还可

以继续执行,并发能力强。多线程可在多核

处理机上并行执行。


缺点:一个用户进程会占用多个内核级线程,

线程切换由操作系统内核完成,需要切换到

核心态,因此线程管理的成本高,开销大。

多线程模型


一对一模型


一对一 模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。


优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。


缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。



多对一模型


多对一 模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。


优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高


缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行


重点重点重点:


操作系统只“看得见”内核级线程,因此只有 内核级线程才是处理机分配的单位 。


多对多模型


多对多 模型: n 用户及线程映射到 m 个内核级线程( n >= m )。每个用户进程对应 m 个内核级线程。


克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。


可以这么理解:


用户级线程是“代码逻辑”的载体


内核级线程是“运行机会”的载体


内核级线程才是处理机分配的单位 。 例如:多核CPU环境下,上图左边这个进程最多能被分配两个核。


一段“代码逻辑”只有获得了“运行机会”才能被CPU执行


内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中


正在运行的代码逻辑都阻塞时,这个进程才会阻塞


相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
7月前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
481 2
|
12月前
|
安全 Java 调度
Netty源码—3.Reactor线程模型二
本文主要介绍了NioEventLoop的执行总体框架、Reactor线程执行一次事件轮询、Reactor线程处理产生IO事件的Channel、Reactor线程处理任务队列之添加任务、Reactor线程处理任务队列之执行任务、NioEventLoop总结。
|
12月前
|
安全 Java
Netty源码—2.Reactor线程模型一
本文主要介绍了关于NioEventLoop的问题整理、理解Reactor线程模型主要分三部分、NioEventLoop的创建和NioEventLoop的启动。
|
缓存 NoSQL 中间件
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
345 6
|
编解码 自然语言处理 JavaScript
智谱发布GLM-OS概念及Agent产品,CogAgent-9B模型开源助力GUI交互场景
11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
1118 8
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
738 0
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
208 2
|
9月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
1352 0
Vanilla OS:下一代安全 Linux 发行版

推荐镜像

更多