当前位置: 首页 > news >正文

第三章:进程管理-进程描述符及任务结构

内核把进程的列表存放在叫做任务队列(task_list)的双向循环链表中,链表中每一项都是类型为task_struct、称为进程描述符的结构。
进程描述符包含了一个具体进程的所有信息。
进程描述符中包含的数据能完整地描述一个正在进行的程序:它打开的文件、进程的地址空间、挂起的信号、进程的状态,还有其他更多信息。
Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的。
内核通过一个唯一的进程标识值PID来标识每个进程。
内核把每个进程的PID存放在它们各自的进程描述符中。
PID的最大值为32768;
PID的最大值很重要,因为它实际上是系统中允许同时存在的进程的最大数量。
进程数据量越小,转一圈就越快,本来数值大的进程比数值的进程迟运行,但是这样一来就破坏了这一原则。
在内核中,访问任务通常需要获得指向其task_struct的指针。实际上内核中大部分处理进程的代码都是直接通过task_struct进行的。
 
进程状态
进程描述符中的state域描述了进程的当前状态,系统中每个进程都必然处于五种状态中的一种:
  • task_running(运行)
进程是可以执行的,它或者正在执行,或者在运行队列中等待执行。这是进程在用户空间中执行的唯一可能状态。
  • task_interruptible(可中断)
进程正在休眠(也就是说它被阻塞),等到某些条件达成,一旦条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为接收到信号而提前被唤醒并随时准备投入运行。
  • task_uninterruptible(不可中断)
除了就算是接收到信号也不会被唤醒或者准备投入运行外,这个状态与可中断状态相同,这个状态通常在进程必须在等待时不受干扰或者等待事件很快会发生时出现。
  • _task_traced
被其他进程跟踪的进程。
  • _task_stopped(停止)
进程停止状态,进程没有投入运行也不能投入运行。
 
进程上下文
可执行程序代码是进程的重要组成部分。这些代码从一个可执行文件载入到进程的地址空间执行。
一般程序在用户空间运行。
但一个程序调用执行了系统调用或者触发了某个异常,它就会陷入内核空间。此时我们成内核“代表进程执行”并处于进程上下文中。
 
特别提醒:在一个拥有大量进程的系统中通过重复来遍历所有的进程代价很大,因此,如果没有充足的理由,别这样做。

转载于:https://www.cnblogs.com/use-D/p/10680814.html

相关文章:

  • 嵌入式编程(二):ARM单片机如何将函数 定义到指定程序地址
  • 透过3D立方体深入理解perspective和translateZ的关系
  • 深入理解静态代理与JDK动态代理
  • 常见漏洞解析
  • [转] 谈谈前端异常捕获与上报
  • Apache Tomcat 8.5.40 与 7.0.94 发布
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 线程同步利与弊,线程同步的前提
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • Python数据类型、运算符、语句、循环
  • 激活效能,CODING 敏捷研发模块上线
  • cmd中subst的使用
  • [MySQL光速入门]003 留点作业...
  • C# - 为值类型重定义相等性
  • Es6初级入门(一)
  • (三)从jvm层面了解线程的启动和停止
  • java概述
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • PHP的类修饰符与访问修饰符
  • vue:响应原理
  • Vue组件定义
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 用简单代码看卷积组块发展
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云服务器如何修改远程端口?
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分布式缓存)Redis哨兵
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)setTimeout 和 setInterval 的区别
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net的DataSet直接与SQL2005交互
  • .NET使用存储过程实现对数据库的增删改查
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net中的Queue和Stack
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .php文件都打不开,打不开php文件怎么办
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @SuppressWarnings注解
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [20190416]完善shared latch测试脚本2.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [AR Foundation] 人脸检测的流程
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [c++] C++多态(虚函数和虚继承)
  • [c++] 自写 MyString 类
  • [CentOs7]搭建ftp服务器(2)——添加用户