当某个进程需要从磁盘中获取数据时,它实际上会停止在CPU上运行以让其他进程运行,因为该操作可能需要很长时间才能完成-至少需要5ms的磁盘寻道时间,而5ms就是1000万从程序的角度来看,CPU周期是永恒的!

从程序员的角度(也称为“在用户空间中”),这称为阻塞系统调用。如果您进行调用write(2)(这是同名系统调用周围的薄libc包装器),则您的进程不会完全在该边界处停止;它继续在内核中运行系统调用代码。在大多数情况下,它一直一直到特定的磁盘控制器驱动程序(文件名→文件系统/ VFS→块设备→设备驱动程序),在该驱动程序中,将磁盘上的块获取命令被提交给适当的硬件,这是非常重要的。大多数时候都可以快速操作。

然后,该进程进入睡眠状态(在内核空间中,阻塞称为“睡眠” –从内核的角度来看,没有“阻塞”过)。一旦硬件最终获取了正确的数据,它将被唤醒,然后该过程将被标记为可运行并进行调度。最终,调度程序将运行该过程。

最后,在用户空间中,阻塞的系统调用将返回正确的状态和数据,程序流程继续进行。

它可以调用大部分的I / O系统调用非阻塞模式(见O_NONBLOCKopen(2)fcntl(2))。在这种情况下,系统调用立即返回,并且仅报告提交磁盘操作。程序员将必须在稍后的时间显式检查操作是否成功完成,并获取其结果(例如,使用select(2))。这称为异步或基于事件的编程。

这里提到D状态TASK_UNINTERRUPTIBLE在Linux状态名称中称为D状态)的大多数答案都是错误的。在d状态是一种特殊的睡眠模式,这是只有在内核空间的代码路径,当代码路径引发不能被中断(因为这将是太复杂,程序),并期望它只会阻止了很短时间。我相信大多数“ D状态”实际上是不可见的。它们的寿命很短,无法通过“ top”之类的采样工具来观察。

在某些情况下,您可能会在D状态下遇到无法杀死的进程。NFS为此而闻名,我已经遇到过很多次了。我认为某些VFS代码路径之间存在语义冲突,它们假定始终到达本地磁盘并进行快速错误检测(在SATA上,错误超时将在几百毫秒左右),而NFS实际上从网络中获取数据,更具弹性,恢复速度较慢(TCP超时通常为300秒)。阅读本文,了解带有TASK_KILLABLE状态的Linux 2.6.25中引入的出色解决方案。在这个时代之前,有一种黑客,您实际上可以通过向内核线程发送SIGKILL来向NFS进程客户端发送信号rpciod,但是请不要理会这个丑陋的把戏。

在Linux中,当需要从磁盘读取块时,进程状态会发生什么变化?被封锁了吗?如果是这样,如何选择另一个流程来执行?的更多相关文章

  1. linux 中文件权限和磁盘管理、linux服务器项目如何部署

    chmod chmod 421 xx.txt //4=r,2=w,1=x df 查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认是按k为单位显示的 df常用参数有 –i -h -k ...

  2. Linux中VMware虚拟机增加磁盘空间的扩容操作

    用VMwareware虚拟机安装的Red Hat Enterprise Linux系统剩余空间不足,造成软件无法正常安装.如果重新装一遍系统就需要重新配置好开发环境和软件的安装配置.通过上网搜集的资料 ...

  3. Linux 中使用 dd 测试磁盘性能

    翻译自 : Linux I/O Performance Tests using dd 基本说明 dd 可以用来做简单的低级别复制文件. 这样做, 一般都是可一直直接访问设备文件. 需要说明的是, 错误 ...

  4. Linux中df命令查询磁盘信息和fdisk命令分区的用法

    df - 报告文件系统磁盘空间的使用情况  总览 df [OPTION]... [FILE]... POSIX 选项: [-kP] GNU 选项 (最短方式): [-ahHiklmPv] [-t fs ...

  5. Linux中删除文件,磁盘空间未释放问题追踪

    在客户使用我们产品后,发现一个问题:在删除了文件后.磁盘空间却没有释放.是有进程在打开这个文件,还是其它情况?我们一起来看看一下两个场景 一. 场景一:进程打开此文件 当一个文件正在被一个进程使用时. ...

  6. linux中利用fstab实现磁盘分区自动挂载

    如何格式化磁盘.给磁盘分区以及挂载,参考我的另一篇博客: https://www.cnblogs.com/mediocreWorld/p/11123786.html 博客中有一个格式化分区的命令: m ...

  7. Linux中挂载新的磁盘到指定目录或分区

    新增磁盘的设备文件名为 /dev/vdb 大小为100GB. #fdisk -l  查看新增的的磁盘 1.对新增磁盘进行分区 #fdisk /dev/vdb 按提示操作 p打印  n新增 d 删除 w ...

  8. 来一波Linux中查看cpu、磁盘、内存、网络的命令

    转载请注明出处. 如果想远程管理服务器就有远程管理卡,比如Dell idRAC,HP ILO,IBM IMM 查看硬件的温度/风扇转速,电脑有撸大师,服务器就有ipmitool.使用ipmitool实 ...

  9. linux中的硬连接和软连接

    linux中的硬连接和软连接 linux中的硬连接和软连接 背景 连接 硬连接 软连接 example reference 背景 linux中的文件主要分3块, - 真正的数据 - 索引节点号(ino ...

随机推荐

  1. TypeError: '<' not supported between instances of 'str' and 'int'

    <不支持str实例和int实例之间的对比 birth是str类型 2000是int类型 所以无法对比,报错 birth = input('birth: ') if birth < 2000 ...

  2. k8s 1.15.2 部署

    目录 一.环境准备 二.软件安装 三.部署master节点 四.部署node节点 五.集群状态检测 一.环境准备 IP地址 节点角色 CPU Memory Hostname Docker versio ...

  3. 【问题案例】K8S-Master修改IP地址之后,重新初始化的方法。

    使用kubeadm命令,执行:kubeadm reset 重新执行初始化:kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10 ...

  4. python 学习记录1

    存储 序号   分类    技术      用途 01      存储     Number  数字(不可变) String     字符串(不可变) List          列表 Tuple   ...

  5. elasticsearch 7.1 401 Unauthorized

    1.执行curl -XGET 'localhost:9200/_cat/indices?v&pretty'  报401 2.修改配置xpack.security.enabled: false ...

  6. iptables 命令

    NAME iptables — administration tool for IPv4 packet filtering and NAT SYNOPSIS iptables -ADC 指定链的规则 ...

  7. Redis基础与持久化

    Redis介绍 软件说明 Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. Redis采用内存(In-Memory)数据集(Dat ...

  8. Subarray Product Less Than K

    Your are given an array of positive integers nums. Count and print the number of (contiguous) subarr ...

  9. 查看Oracle索引是否被使用或者有效

    第一步: explain plan for select * from T_USER where OPEN_ID='12345'; 第二步: select * from table(dbms_xpla ...

  10. python虚拟环境的的使用

    基于创建虚拟环境 virtualenv 安装 pip3 install virtualenv 通过virtulaenv创建虚拟环境 virtualenv luffycity --python=C:\P ...