操作系统:为什么有的进程都阻塞了还可以进行I/O操作?

同步I/O、异步I/O、阻塞I/0、非阻塞I/O、五种I/O模型、高性能网络模型 面试最常问问题之二:五种I/O模型及区别 ​ 阅读详情

在操作系统中,一个进程被阻塞并不意味着它完全停止了所有活动。实际上,进程的阻塞是一种状态,它表示进程在等待某个事件(如I/O操作完成、获取资源等)的发生。在等待这些事件发生的过程中,进程不会占用CPU时间,因此系统可以调度其他进程运行。以下是为什么一个进程被阻塞了还可以进行I/O操作的几个原因:

1. 异步I/O操作:在现代操作系统中,I/O操作通常是异步进行的(即并发执行)。这意味着进程发起I/O请求后,不需要等待I/O操作完成就可以继续执行其他任务。I/O操作由专门的I/O系统(如磁盘驱动、网络接口卡等)来处理,而进程则可以继续执行或被阻塞等待I/O操作的结果。

2. 中断和DMA:在I/O操作期间,硬件设备可以通过中断通知CPU操作已完成,或者使用直接内存访问(DMA)将数据直接传输到内存中,而不需要CPU的直接参与。这样,即使进程被阻塞,I/O操作也可以在后台独立进行。

因此,即使一个进程被阻塞,它发起的I/O操作仍然可以在硬件和操作系统的支持下继续进行,而进程本身则在等待I/O操作的完成。这种设计使得操作系统能够有效地管理资源,提高系统的整体性能。

同时,我们需要的是,在设备分配的安全性考虑中,安全分配就是当一个进程获得了I/O设备,便进入阻塞状态,同时该进程的所以资源不保持(即释放掉),这样就破坏了死锁必要条件中的"请求和保持资源"条件,但是不安全状态的分配方式中,即使该进程阻塞了好像也不释放资源(因为书上的原话是<因为它可能具备"请求和保持条件">,具体情况要依cpu处理死锁的情况而定).因此可能会发生死锁.

但是至于一个进程阻塞后到底释放不释放资源,可以看下面的:

不是所有的进程在阻塞时都不保持资源。进程在阻塞时是否保持资源取决于操作系统的具体实现和资源分配策略。以下是几种不同的情况:

1. **资源分配策略**:
   - **安全分配方式**:在这种策略下,进程在阻塞时通常不会保持资源,以避免死锁和提高资源利用率。
   - **非安全分配方式**:在某些情况下,进程在阻塞时可能会保持资源,尤其是在它们需要这些资源来完成后续操作时。

2. **资源类型**:
   - **可抢占资源**:对于可抢占的资源(如某些类型的内存分配),进程在阻塞时可能会被强制释放资源。
   - **不可抢占资源**:对于不可抢占的资源(如文件描述符或设备锁),进程在阻塞时可能会保持这些资源,直到它们完成操作。

3. **进程状态**:
   - **阻塞状态**:在某些阻塞状态下,进程确实不会保持资源,因为它们正在等待某个事件(如I/O操作)。
   - **挂起状态**:在挂起(Suspend)状态下,进程可能会保持资源,因为它们被暂停执行,而不是等待某个事件。

4. **I/O操作**:
   - 对于I/O操作,进程可能会在发起I/O请求后进入阻塞状态,但在等待I/O完成时,它们通常不会保持CPU资源,但可能会保持I/O设备资源。

5. **操作系统设计**:
   - 某些操作系统可能允许进程在阻塞时保持资源,以便在资源竞争激烈的环境中保持进程的执行效率。

6. **进程需求**:
   - 根据进程的具体需求,操作系统可能会允许进程在阻塞时保持某些资源,以减少资源争用和上下文切换的开销。

因此,是否保持资源取决于多种因素,包括操作系统的设计、资源的类型、进程的状态以及具体的应用场景。在实际的系统设计中,操作系统会根据这些因素来决定如何在进程阻塞时管理资源。
 

I/O操作——同步与异步,阻塞与非阻塞 一、什么是I/O? I/O是Input/Output(输入/输出),可分为I/O设备和I/O接口两个部分。 二、什么是I/O操作? 在Linux中,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,一切都是文件,一切都是流。在信息交换的过程中,我们对这些流进行数据的收发操作,简称为I/O操作(input and output),简言之就是磁盘读... 阅读详情

相关推荐

理解Linux五种I/O模型、同步I/O与异步I/O、阻塞与非阻塞

五种IO模型 、五种I/O模型的比较 、同步I/O与异步I/O

ZY-JIMMY 3264

脱机输入/输出就是允许CPU和IO设备并行

脱机输入/输出(I/O)就是允许CPU和I/O设备并行工作的一种方式。在传统的联机I/O方式中,CPU需要直接控制I/O设备的操作,这会导致CPU在等待I/O操作完成时被占用,无法执行其他任务。在脱机I/O方式中,I/O设备的操作由专门的控制器或外围机来管理,而不需要CPU的实时干预。这样,CPU可以在I/O设备进行操作的同时,继续执行其他程序或任务,实现了CPU和I/O设备的并行工作。这种脱机I/O方式在早期的计算机系统中被广泛采用,尤其是在需要处理大量I/O操作的场景中。

yuanwu932730169的博客 1516

某教育平台线上用户流失分析

本项目基于某教育平台的用户登录信息、用户个人信息以及用户课程学习记录三信息表,挖掘了平台流量以及用户流失等信息。使用python对数据进行预处理,使用tableau进行数据可视化分析。该教育平台正值窗口期,平台流量没有良好的留存水平,但有良好的发展趋势,需要深入分析用户留存率低,做好招新促活营销。该教育平台的基本盘在广东、湖北、河南、贵州等省份,线上教育的潜在用户可能更多分布在线下教育资源不充足、受疫情影响更为严重的地区。

fhy12的博客 1299

操作系统基础:了解进程、线程、协程,理解I/O模型(阻塞/非阻塞,同步/异步)。

你能明白为什么Nginx能轻松处理数万并发连接(I/O多路复用),而传统的Apache prefork模型(多进程,一连接一进程)在高并发下会很吃力。这是解决“当程序需要等待外部数据(如数据库查询、API调用、读取文件)时,CPU应该做什么”的问题。这是非阻塞I/O的高效实践方案,是Nginx、Redis、Swoole等高性能服务器的基石。掌握这些操作系统基础知识,你就不再是一个仅仅“写业务逻辑”的码农,而是一个能够。这是一个从“重”到“轻”,从“底层”到“上层”的演进过程。这正是你技术高度的体现。

长风破浪会有时的博客 1389

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

H3C模拟器HCL防火墙路由模式主备配置实验

摘要:本文详细介绍了网络拓扑规划与设备配置方案。运营商仅提供一个接口地址,通过虚IP技术实现双防火墙高可用部署:主备防火墙分别配置10.20.10.1/29和10.20.10.2/29作为实际上联地址,共享10.10.10.2/24虚IP;下联配置172.168.10.0/24网段,核心交换机配置VLAN接口及192.168.10.1、192.168.20.1两个下联接口。文章包含运营商路由器、防火墙(HA配置、VVRP设置)和核心交换机的具体命令行配置步骤,并强调需进行主备切换验证。整个方案实现了单运营商

LQ的博客 1121

Linux I/O模式

一、概念说明 1. 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核

ttdss12345678的博客 292

AJ-Report开源数据大屏存在远程命令执行漏洞

该平台可以通过post方式在validationRules参数对应值中进行命令执行,可以获得服务器权限,登陆管理后台接管大屏。如果被攻击者利用,危害后果十分严重。

swordheart的博客 387

linux64编程模型,对比五种I/O模型

一、关于 I/O模型的引出我们都知道,为了操作系统安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。如下图所示:整个请求过程为:用户进程发起请求,内核接受到请求后,从I/O设备中获取数据复制到内核buffer中,再将内核buffer中的数据复制用户进程的地址空间,该用户进程获取到数据后再响应客户端。在整个请...

weixin_28952633的博客 313

STM32水质检测小船设计

近年来水资源的监测与保护越来越受到政府部门的重视,抓好源头问题才能做好环境治理,因此建立完善的水环境监测系统是很有必要的。针对当前水环境参数监测中存在的各种问题,例如水质信息采集范围固定、灵活部署监测能力差、信息采集不够智能化、人机交互能力不足等,这些问题导致水环境监测设备不够灵活。 针对上述问题,本文设计了一款基于STM32的水环境监测小船,提出了一种灵活、智能的监测水环境信息的方式。本文将船体作为传感器和控制板的载体,具有可移动性,有利于灵活广泛的采集水环境信息。 本设计选用STM32F103C8T

m0_74026776的博客 1368

【C语言笔记初级篇】第一章:C语言快速入门及注意事项

(1)第一个C语言程序 A:利用vs2010写C语言程序 1:按以下步骤新建工程 2:添加源文件,“.c”文件 B:第一个C语言代码 1:以下是基本的C语言程序 2:由于没有设置连接器,所以打印结果没有显示,按照如下步骤链接控制台 (2)数据类型 A:基本数据类型及占用字节 B:一些概念的梳理 概念一:关于计算机的单位 位(bit):计算机通过电路的开关和闭合处理信息,电路通...

快乐江湖的博客 3737

RP2040低功耗实战:寄存器级Sleep与Deep Sleep配置

低功耗模式是嵌入式系统实现长续航的核心技术,其本质并非简单暂停CPU,而是对芯片电源域、时钟树和IO状态的协同重构。理解Run/Sleep/Deep Sleep三种模式的能耗差异、唤醒机制与硬件约束,是优化电池供电设备的关键起点。RP2040支持亚微安级Deep Sleep,但实际效果高度依赖寄存器级配置——包括时钟门控、WAKEUP引脚上下拉、RTC闹钟设置及SRAM保留区管理。本文聚焦真实工程场景,覆盖电流测量陷阱、PCB布局影响、外设联动断电等易被忽略的细节,助力开发者将理论功耗指标转化为实测≤8μA

weixin_33862993的博客 246

PX4从放弃到精通(五):PX4中的姿态表示方法及转换关系

文章目录机体坐标系与地理坐标系一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 机体坐标系与地理坐标系 在实际应用中,加速度计的测量轴是由运动平台安装固定此器件的轴向决定的。这些坐标轴就形成了载体坐标系,定义如下: 坐标原点设在载体质心(这样可简化运动方程的推导); y轴指向载体前方,称为横滚轴,横滚角以y轴为起始旋转轴而得到,符合右手定则; x轴与y轴夹角90°,指向载体横向,称为俯仰轴,俯仰角以x轴为起始旋转轴而得到,符合右手定则; z轴与x轴、y轴构成右手笛卡儿坐标系,指向载体垂直方向

超维空间科技的博客 8110

linux设备中的阻塞与非阻塞io

1:阻塞与非阻塞io 阻塞操作:执行设备操作时若不能获得资源则挂起进程(进程进入休眠状态,将cpu资源让给其他进程),知道满足条件后在执行!唤醒睡眠的进程的地方最大可能发生在中断中,因为硬件资源的获得一般伴随着一个中断。 非阻塞:进程不能进行设备操作时并不挂起,它或者放弃,如果用户要获取设备资源,只能不停的轮训查询,直到可以操作位置(消耗cpu资源)。 2:等待队列

gxlovelxx的博客 493

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机操作系统基础(三)---进程管理之五状态模型

引言 本文为第三篇,进程管理之五状态模型,进程在操作系统里边是有多个状态的,本文就是了解进程在操作系统中的多个状态 1、进程的五个状态 创建状态 就绪状态 阻塞状态 执行状态 终止状态 2、进程处于这五种状态时在做什么 (1)就绪状态 当进程被分配到除CPU以外的所有必要资源后,就处于就绪状态 只要再获得CPU的使用权,就可以里立即运行 其它资源都准备好,只差CPU资源的状态,就是就绪状态 其它资源包括进程控制块(PCB)、内存、栈空间、堆空间等 在操作系统里边,我们知道,多个程序可以并发的运行,这

self_realian的博客 1056

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

操作系统中进程的五种基本状态及其转换

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

deniece1的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

操作系统中最基本的抽象:进程

本文主要是介绍操作系统中最基本的抽象--进程。进程最简单的定义为:进程就是运行的程序。一个程序本身是没有生命周期的,它只是存放在磁盘上的一些指令或者静态数据。是操作系统让这些躺在硬盘中的程序"跑起来"。 比如说,当我们用鼠标双击桌面上的"Chrome浏览器"图标,此时计算机操作系统会创建一个"浏览器"进程,并运行起来了。然后我们就能使用"浏览器"了。如果有的童鞋想一边写代码bug,一边听着歌儿呢...

ZeroTo_1的博客 917

第5讲:计算机操作系统进程管理——进程的三种基本状态与状态转换

本文详细讲解了进程的三种基本状态及其转换关系:运行态(CPU正在执行)、就绪态(资源就绪只缺CPU)和阻塞态(等待I/O等事件)。通过QQ、浏览器等实例,说明了状态转换的四种情况,强调"就绪是等CPU,阻塞是等事件"的核心区别。文章用银行办理业务等生活类比帮助理解,并指出单核CPU同一时刻只能有一个运行态进程。最后通过浏览器访问网页的完整生命周期示例,展示了进程状态动态变化的过程,为后续学习进程控制做铺垫。

Zguigo的博客 336

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一...

weixin_30508309的博客 3493

I/O 模型全解析:从阻塞 I/O 到 Epoll

本文介绍了五种常见的I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O,重点分析了I/O多路复用技术。详细比较了select、poll和epoll三种实现机制的特点,包括FD限制、时间复杂度和适用场景等。其中epoll通过红黑树和就绪队列实现高效监控,支持水平/边缘触发模式,是Linux下高并发场景的首选方案。文章还结合Socket通信流程,说明了I/O多路复用如何解决传统阻塞模型的性能瓶颈问题。

2301_78085749的博客 1791

【Linux】阻塞与非阻塞I/O

tsk是进程结构体,一般是current。

weixin_47596351的博客 1342

【操作系统概念】第13章:I/O系统

计算机的两个主要工作是I/O和处理。在很多情况下,主要工作是I/O,而处理只是附带的。例如,当浏览网页或编辑文件时,直接兴趣是读取或输入信息,而非计算答案。计算机的操作系统I/O功能是,管理和控制I/O操作和I/O设备。虽然其他章节也讨论了有关问题,但是这里汇集所有部分,以便给出一幅完整I/O图。首先,描述I/O硬件的基础知识,因为硬件接口本身对操作系统的内部功能有所限制。接着,讨论操作系统提供的 I/O服务以及这些服务的应用程序I/O接口的实现。

zzzzzyliu的博客 1098

I/O模型:从阻塞到异步的演进

I/O模型决定了程序与外部设备交互的效率,主要分为五种:阻塞I/O会完全阻塞进程;非阻塞I/O通过轮询减少等待;I/O多路复用通过单线程监控多个I/O;信号驱动I/O通过信号通知就绪;异步I/O则由内核完全处理。其中,I/O多路复用(如epoll)和异步I/O(如io_uring)最适合高并发场景。实际开发中应根据应用规模选择合适模型,中小规模可用I/O多路复用,大规模推荐异步I/O或成熟框架(如Netty),在性能和开发效率间取得平衡。

Qinti_mm的博客 1012

I/O 模型——阻塞 I/O、非阻塞 I/O、 I/O 多路复用、信号驱动 I/O、异步 I/O

模型特点使用场景优缺点阻塞 I/O阻塞操作,直到完成才返回简单应用场景,如文件操作编程简单,但性能差,阻塞线程,不适合高并发非阻塞 I/O发起 I/O 操作后立即返回,若没有准备好则返回错误适合高并发场景,轮询检查 I/O 状态编程复杂,CPU 占用高I/O 多路复用单线程监听多个 I/O 事件,减少线程切换开销高并发服务器,网络通信编程复杂,某些实现效率低,需频繁系统调用信号驱动 I/O使用信号来通知 I/O 完成较少使用,主要用于特定的事件处理编程复杂,信号处理可能影响控制流。

1345

既然阻塞 I/O 会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。这个期间如果使用 jstack 查看线程状态...

Java极客技术 2476
上一篇: 链表中有没有表头节点的影响是什么?
下一篇: C++复习资料
printfLILEI
博客等级 码龄4年 66粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值