您好、欢迎来到现金彩票网!
当前位置:众购彩票 > 分时系统命令 >

linux内核对进程的管理分为两个方面

发布时间:2019-05-22 15:25 来源:未知 编辑:admin

  在linux系统中,每个被运行的程序实例对应一个或多个进程。linux内核需要对这些进程进行管理,以使它们在系统中“同时”运行。linux内核对进程的这种管理分两个方面:进程状态管理,和进程调度。

  在linux下,通过ps命令我们能够查看到系统中存在的进程,以及它们的状态:

  只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

  只要可执行队列不为空,其对应的CPU就不能偷懒,就要执行其中某个进程。一般称此时的CPU“忙碌”。对应的,CPU“空闲”就是指其对应的可执行队列为空,以致于CPU无事可做。

  有人问,为什么死循环程序会导致CPU占用高呢?因为死循环程序基本上总是处于TASK_RUNNING状态(进程处于可执行队列中)。除非一些非常极端情况(比如系统内存严重紧缺,导致进程的某些需要使用的页面被换出,并且在页面需要换入时又无法分配到内存……),否则这个进程不会睡眠。所以CPU的可执行队列总是不为空(至少有这么个进程存在),CPU也就不会“空闲”。

  很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。

  处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

  通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。

  与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。

  绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将惊奇的发现,kill -9竟然杀不死一个正在睡眠的进程了!于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。

  而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。

  在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。(比如read系统调用触发了一次磁盘到用户空间的内存的DMA,如果DMA进行过程中,进程由于响应信号而退出了,那么DMA正在访问的内存可能就要被释放了。)这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。

  向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。)

  当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。

  对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。

  而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态。

  在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。

  之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件。

  当然,内核也可以将这些信息保存在别的地方,而将task_struct结构释放掉,以节省一些空间。但是使用task_struct结构更为方便,因为在内核中已经建立了从pid到task_struct查找关系,还有进程间的父子关系。释放掉task_struct,则需要建立一些新的数据结构,以便让父进程找到它的子进程的退出信息。

  父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。

  子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号。

  只要父进程不退出,这个僵尸状态的子进程就一直存在。那么如果父进程退出了呢,谁又来给子进程“收尸”?

  当进程退出的时候,会将它的所有子进程都托管给别的进程(使之成为别的进程的子进程)。托管给谁呢?可能是退出进程所在进程组的下一个进程(如果存在的线号进程。所以每个进程、每时每刻都有父进程存在。除非它是1号进程。

  linux系统启动后,第一个被创建的用户态进程就是init进程。它有两项使命:

  1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙);

  2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作;

  init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于TASK_INTERRUPTIBLE状态,“收尸”过程中则处于TASK_RUNNING状态。

  而进程在退出过程中也可能不会保留它的task_struct。比如这个进程是多线程程序中被detach过的进程。或者父进程通过设置SIGCHLD信号的handler为SIG_IGN,显式的忽略了SIGCHLD信号。(这是posix的规定,尽管子进程的退出信号可以被设置为SIGCHLD以外的其他信号。)

  此时,进程将被置于EXIT_DEAD退出状态,这意味着接下来的代码立即就会将该进程彻底释放。所以EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到。

  进程是通过fork系列的系统调用(fork、clone、vfork)来创建的,内核(或内核模块)也可以通过kernel_thread函数创建内核进程。这些创建子进程的函数本质上都完成了相同的功能——将调用进程复制一份,得到子进程。(可以通过选项参数来决定各种资源是共享、还是私有。)

  那么既然调用进程处于TASK_RUNNING状态(否则,它若不是正在运行,又怎么进行调用?),则子进程默认也处于TASK_RUNNING状态。

  进程自创建以后,状态可能发生一系列的变化,直到进程退出。而尽管进程状态有好几种,但是进程状态的变迁却只有两个方向——从TASK_RUNNING状态变为非TASK_RUNNING状态、或者从非TASK_RUNNING状态变为TASK_RUNNING状态。

  进程从非TASK_RUNNING状态变为TASK_RUNNING状态,是由别的进程(也可能是中断处理程序)执行唤醒操作来实现的。执行唤醒的进程设置被唤醒进程的状态为TASK_RUNNING,然后将其task_struct结构加入到某个CPU的可执行队列中。于是被唤醒的进程将有机会被调度执行。

  课程从0开始,讲到云计算结束,按阶段授课,从入门到跑路,适合初学者,也适合定制,需要哪个模块学哪个模块2,包含初级运维工

  CPU处理器作为电脑最核心的硬件,大家在买CPU的时候,一般都是看CPU主频、核心数等参数。现在问题...

  嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随...

  Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文...

  先不去解释总线的总类与它们的工作原理,也不去解释设备的工作原理,做个比方:CPU好比大脑,设备就好比...

  本文档详细介绍的是176条DevOps人员常用的linux命令速查表资料合集

  面对大量用户访问、高并发请求,海量数据,可以使用高性能的服务器、大型数据库,存储设备,高性能Web服...

  书籍内容基于主流 Linux 系统编写,全书总共20个章节,16开本超400页,通用于RHEL、Ce...

  过去几周,Arch Linux 维护人员比较了不同的压缩算法,最终计划使用 zstd 取代 devt...

  Intel处理器是x86架构,特点是基于复杂指令集,可以做到很高性能,但缺点是功耗和发热量会很大,无...

  是什么原因造成了MMORPG游戏的卡顿?游戏的3D场景建模,AI以及物理运算,大量的数据传输以及伤害...

  从寄存器位到访问类型、属性和功能的各种因素的数量,在现代SoC中可能是绝对令人吃惊的。 例如,如果有...

  CPU的的单核性能有多重要,这个不用再重复了,但是CPU的单核性能可以无限增加下去吗?回答这个问题之...

  随着英伟达确定收购Mellanox,英特尔官方几乎在同一时间宣布成立CXL (Computing E...

  英特尔是美国一家主要以研制CPU处理器的公司,是全球最大的个人计算机零件和CPU制造商,它成立于19...

  图中所示:红色框是多层AHB矩阵总线;绿色框是多块分立的存储块。主CPU和从CPU的代码数据可存放在...

  Linux系统目前主要应用在企业服务器上,学习Linux,更多的是向Linux系统/运维工程师方向进...

  在设计上,ColorOS 6提出了“无边界”的设计理念。“无边界”设计理念采用了轻量与淡雅的颜色,利...

  IBM早在20世纪90年代豪赌微内核,看好它是操作系统领域的下一大技术,为此不惜耗费数十亿美元,最后...

  由于微控制器是控制外围元器件的器件,通过微控制器的定期故障诊断,可尽早发现外围元器件的故障并规避风险...

  在兼容性方面,Stadia云游戏平台可以在任何带有屏幕的设备上运行,其在正式发布后将支持PC、电视、...

  现在的电脑配件一天一个价,今天三千多买的9900K可能明天就掉到2999了。想升级电脑就要花更多的钱...

  内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存的物理特性出发,深...

  PLC由CPU、电源、输入电路、输出电路、存储器和通信接口电路几大部分组成如图所示.

  云计算的到来让许多人对底层的基础架构产生了‘误解’,认为在云时代企业将不再需要硬件。事实恰恰相反,尤...

  操作系统技术包含服务器和客户机操作系统两套技术,目前支持瘦客户机计算的服务器技术主要是VNC、Cit...

  NVIDIA RTX服务器包括全面优化的软件堆栈,可用于Optix RTX渲染、游戏、VR和AR、以...

  SUSE 创办于 1992 年,是全球首家企业级开源 Linux 操作系统供应商。1994 年,他们...

  据消息,IDC的一份新报告预测,包括传统PC和平板电脑在内的全球个人计算设备(PCD)市场今年将出现...

  近期华为创始人任正非频繁接受了外媒的采访,阐明了华为的立场以及对美国的态度。

  原本品牌厂、ODM 厂以及市场共识认为 CPU 缺货情况第二季将能纾解,不过目前已经在第一季尾声,将...

  以前在上面的系统上,手机上的游戏基本是不可以玩的,好在如今出来了一个模拟器,安装了它就可以玩大部分的...

  兆芯技术团队对x86 CPU的设计研发技术已经实现了消化吸收和再创新,拥有了自身的技术积累。兆芯国产...

  说了好多好多,有的时候后悔离开北京来到这里,北京的机会真的是太多太多了,或者上海。既然安顿了,就继续...

  如Mifare1卡(即M1卡),由非易失性存储器和硬件加密逻辑组成,通过校验密码的方式来保护卡内的数...

  一般来说,PLC是极其可靠的设备,出故障率很低。PLC的CPU等硬件损坏或软件运行出错的概率几乎为零...

  Intel和AMD已经对着干几十年了,两家经典的CPU实在太多了,其实在不同年代有不同的经典产品,太...

  电脑组装过程中很多细节十分重要,比如为CPU涂抹硅脂,看似十分简单,但是错误的涂抹散热硅脂,可能会对...

  阿里巴巴,思科,戴尔EMC,Facebook,谷歌,HPE,华为,英特尔公司和微软合作推出新的Com...

  即便英特尔(Intel)已表示,2019年下半新建的14纳米厂房将能提供足够支应市场需求的产能,但X...

  相信很多DIY爱好者,在组装电脑时只注重CPU、显卡,往往忽视电源,其实电源作为电脑的给各个部件提供...

  从外边看,主机就是一个扁扁方方的铁盒子,但很多朋友确没有真正了解过它内部到底是什么样子的,越是看不着...

  硬盘是主要的电脑存储媒介,硬盘相当于计算机的仓库,操作系统、安装的软件,还有文档、资料等等,都是以数...

  奇趣科技公司日前推出了一款基于嵌入式linux的面向单一应用嵌入式产品的开发平台qtopiacore...

  对于硬件工程师,I²C再熟悉不过了,两根线,一根数据SDA一根时钟SCL。当时在使用avr CPU设...

  当下的人工智能发展到了哪一步?未来又会怎样发展?本文作者对过去几年的 AI 发展进行了梳理总结,并对...

  2018年年初,中兴事件发生,敲响我国核心科技的警钟。一时间,一场关于国产化芯片的讨论就此展开。多位...

  据北京君正2018年半年报显示,去年公司产品在物联网和智能视频等领域的销售收入持续增长,上半年实现营...

  SK 海力士日前宣布将斥资 120 兆韩元(约 1,070 亿美元)兴建 4 座晶圆厂,针对既有的 ...

  首先,我要说的是,就业成功最关键的因素在于扎实的基础,很宽的知识面,丰富的实践经验。这些都是,工作学...

  操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外...

  3月6日早间消息,据外媒报道,美国伍斯特理工学院研究人员在英特尔处理器中发现一个高危漏洞名为Spoi...

  本视频主要详细介绍了中国操作系统有哪些,分别是SPG思普操作系统[简称SPGnux]、深度Linux...

  本文主要详细介绍了为什么黑客都用linux,分别有黑客不给自己开发的功能加上图形界面、欧美国家的Li...

  因为单片机有CPU、存储器、IO等等,使他(人性化一点以配合下文)看起来就像一个比较小的计算机,所以...

  TMS320VC5501(5501)定点数字信号处理器(DSP)基于TMS320C55xDSP生成CPU处理器内核。 C55xDSP架构通过增加并行性和全面关注降低功耗来实现高性能和低功耗。 CPU支持内部总线结构,该结构由一个程序总线,三个数据读总线,两个数据写总线以及专用于外设和DMA活动的附加总线组成。这些总线能够在一个周期内执行最多三次数据读取和两次数据写入。并行,DMA控制器可以独立于CPU活动执行数据传输。 C55xCPU提供两个乘法累加(MAC)单元,每个单元能够进行17位×17位乘法运算。单循环。额外的16位ALU支持中央40位算术/逻辑单元(ALU)。 ALU的使用受指令集控制,提供优化并行活动和功耗的能力。这些资源在C55x CPU的地址单元(AU)和数据单元(DU)中进行管理。 C55x DSP代支持可变字节宽度指令集,以提高代码密度。指令单元(IU)从内部或外部存储器执行32位程序提取,并为程序单元(PU)排队指令。程序单元解码指令,将任务指向AU和DU资源,并管理完全受保护的管道。预测分支功能可避免执行条件指令时的管道刷新。 5501外设...

  TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...

http://philogene.net/fenshixitongmingling/198.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有