进程管理
文章平均质量分 92
进程是正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU(寄存器),IO,内存,网络资源等。很多人在回答进程的概念的时候,往往只会说它是一个运行的实体,而会忽略掉进程所占据的资源。比如说,同样一个程序,同一时刻被两次运行了,那么他们就是两个独立的进程。linux下查看系统进
简说Linux内核
这个作者很懒,什么都没留下…
展开
-
Linux内核进程管理几种进程状态
进程状态相关的定义同样在 include/linux/sched.h 文件的开头部分,以 #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) 为例,TASK_WAKEKILL表示用于在接收到致命信号时唤醒进程,将它与 TASK_UNINTERRUPTIBLE 按位或,就得到了 TASK_KILLABLE。最后,再补充一个知识点:使用ps命令查看进程时,会发现状态上面有其他符号,比如 S+、Z+ 等,如下所示,原创 2023-03-23 22:29:04 · 415 阅读 · 0 评论 -
Linux内核进程管理几种CPU调度策略
很简单,就是任务短的优先执行,但是此时又有问题了,任务虽然短,但是它的执行时间不一定短,就好比在一个银行业务中,客户填写一个表,这是一个非常短的任务吧——就单单填个表,但是这个表很长很长,那么这个短任务它的执行时间就很长了,我们怎么知道这个短的任务将来会执行多长的时间呢?所以,这样的策略还是依然有问题。那么,因为一个系统中,可能短任务占的比重较多,那些后来进入的短任务,就得等前面一大堆的任务执行完后,CPU才为这些短任务服务,这样的话,很多短任务即使服务时间短,但是它们的周转时间都比较长。原创 2023-03-23 22:28:23 · 709 阅读 · 0 评论 -
Linux内核进程的管理与调度
一,前戏1.1 进程调度内存中保存了对每个进程的唯一描述, 并通过若干结构与其他进程连接起来.调度器面对的情形就是这样, 其任务是在程序之间共享CPU时间, 创造并行执行的错觉, 该任务分为两个不同的部分, 其中一个涉及调度策略, 另外一个涉及上下文切换1.2 进程的分类linux把进程区分为实时进程和非实时进程, 其中非实时进程进一步划分为交互式进程和批处理进程类型描述示例。原创 2023-03-23 22:27:19 · 660 阅读 · 0 评论 -
Linux内核Socket通信原理和实例讲解
关于对 Socket 的认识,大致分为下面几个主题,Socket 是什么,Socket 是如何创建的,Socket 是如何连接并收发数据的,Socket 套接字的删除等。原创 2023-03-23 22:28:30 · 1449 阅读 · 1 评论 -
Linux内核IO基础知识与概念
在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为磁盘IO模型和网络IO模型。IO操作会涉及到用户空间和内核空间的转换,先来理解以下规则:内存空间分为用户空间和内核空间,也称为用户缓冲区和内核缓冲区;用户的应用程序不能直接操作内核空间,需要将数据从内核空间拷贝到用户空间才能使用;无论是read操作,还是write操作,都只能在内核空间里执行;原创 2023-03-23 22:27:27 · 2237 阅读 · 0 评论 -
Linux内核之进程和线程的创建和派生
在前文中,我们分析了内核中进程和线程的统一结构体task_struct,本文将继续分析进程、线程的创建和派生的过程。首先介绍如何将一个程序编辑为执行文件最后成为进程执行,然后会介绍线程的执行,最后会分析如何通过已有的进程、线程实现多进程、多线程。因为进程和线程有诸多相似之处,也有一些不同之处,因此本文会对比进程和线程来加深理解和记忆。本文十分之长,因为内容极多,源码复杂,本来想拆分为两篇文章,但是又因为过于紧密的联系因此合在了一起。原创 2023-03-22 21:50:21 · 882 阅读 · 0 评论 -
Linux内核进程述符和进程状态
在Linux系统中,进程的创建使用fork()系统调用,fork()调用会创建一个与父进程一样的子进程,唯一不同就是fork()的返回值,父进程返回的是子进程的进程ID,而子进程返回的是0。do_fork()主要的工作是申请一个进程描述符, 然后初始化进程描述符的各个字段, 包括调用 copy_files() 函数复制打开的文件, 调用 copy_sighand() 函数复制信号处理函数, 调用 copy_mm() 函数复制进程虚拟内存空间, 调用 copy_namespace() 函数复制命名空间.原创 2023-03-22 17:53:01 · 264 阅读 · 0 评论 -
Linux内核进程管理原理详解
前言:Linux内核里大部分都是C语言。建议先看《Linux内核设计与实现(Linux Kernel Development)》,Robert Love,也就是LKD。原创 2023-03-22 17:48:38 · 607 阅读 · 0 评论 -
Linux内核进程管理实时调度与SMP
core id(表示一个物理CPU内的core id,不同CPU间的core id可能一样);现在实时进程的调度其实就是使用之前内核的O(1),每个优先级(总共MAX_RT_PRIO)有一个queue,并且通过一个bitmap(位数也是MAX_RT_PRIO+1)表示所有优先级队列的状态,即bitmap的第0位,表示优先级queue[0]是否有等待运行的进程,0表示没有,1表示有,所以每次调度的时候总是查找bitmap第一个非0的位,然后取出它的queue的head,它就是这次调度获得的进程。原创 2023-03-22 17:44:26 · 448 阅读 · 1 评论 -
Linux内核进程管理六种状态
(参见《linux内核异步中断浅析》)在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。原创 2023-03-22 17:43:15 · 534 阅读 · 0 评论 -
Linux内核进程管理进程优先级
本文的目的是从Linux系统进程的优先级为出发点,通过了解相关的知识点,希望大家对系统的进程调度有个整体的了解。其中我们也对CFS调度算法进行了比较深入的分析。在我的经验来看,这些知识对我们在观察系统的状态和相关优化的时候都是非常有用的。比如在使用top命令的时候,NI和PR值到底是什么意思?类似的地方还有ps命令中的NI和PRI值、ulimit命令-e和-r参数的区别等等。当然,希望看完本文后,能让大家对这些命令显示的了解更加深入。原创 2023-03-22 17:41:50 · 898 阅读 · 0 评论 -
Linux内核进程管理并发同步与原子操作
上面代码可以看出, down() 函数首先对信号量进行自旋锁操作(为了避免多核CPU竞争),然后比较计数器是否大于0,如果是对计数器进行减一操作,并且返回,否则调用 __down() 函数进行下一步操作。与 自旋锁 不一样,当前进程对 信号量 进行上锁时,如果其他进程已经对其进行上锁,那么当前进程会进入睡眠状态,等待其他人对信号量进行解锁。count :信号量的计数器,上锁时对其进行减一操作(count--),如果得到的结果为大于等于0,表示成功上锁,如果小于0表示已经被其他进程上锁。原创 2023-03-22 17:39:39 · 281 阅读 · 0 评论 -
浅析Linux内核中进程完全公平CFS调度
cfs定义了一种新调度模型,它给cfs_rq(cfs的run queue)中的每一个进程都设置一个虚拟时钟-virtual runtime(vruntime)。如果一个进程得以执行,随着执行时间的不断增长,其vruntime也将不断增大,没有得到执行的进程vruntime将保持不变。而调度器将会选择最小的vruntime那个进程来执行。这就是所谓的“完全公平”。不同优先级的进程其vruntime增长速度不同,优先级高的进程vruntime增长得慢,所以它可能得到更多的运行机会。原创 2023-03-04 22:24:38 · 657 阅读 · 0 评论 -
深入理解Linux内核进程的管理与调度(全知乎最详细)
在Linux2.4.18中(linux-2.5)之前的内核, 当很多任务都处于活动状态时, 调度器有很明显的限制. 这是由于调度器是使用一个复杂度为O(n)O(n)的算法实现的调度器采用基于优先级的设计,这个调度器和Linus在1992年发布的调度器没有大的区别。该调度器的pick next算法非常简单:对runqueue中所有进程的优先级进行依次进行比较,选择最高优先级的进程作为下一个被调度的进程。原创 2022-11-07 16:31:02 · 1419 阅读 · 0 评论 -
Linux下创建进程的三种方式及特点
这样看来,fork是一个开销十分大的系统调用,这些开销并不是所有的情况下都是必须的,比如某进程fork出一个子进程后,其子进程仅仅是为了调用exec执行另一个可执行文件,那么在fork过程中对于虚存空间的复制将是一个多余的过程。fork()是全部复制,vfork()是共享内存,而clone() 是则可以将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的 clone_flags来决定。另外,clone()返回的是子进程的pid。原创 2023-01-07 21:33:19 · 1087 阅读 · 0 评论 -
程终止、进程睡眠、进程对信号处理过程中等的方法
在不支持内核抢占的系统中,进程/线程一旦运行于内核空间,就可以一直运行,直到他主动放弃或者耗尽时间片为止,这样就会导致非常紧急的进程或线程长时间得不到运行。为了提高Linux的实时性。在linux2.6中引入了“Kernel preemption”(内核抢占调度模式)。并很好的解决了这个问题。一句话就是抢占式内核可以在进程处于内核态时,进行抢占。而根据进程抢占发生的时机, 抢占可以分为内核抢占和用户抢占, 内核抢占就是指一个在内核态运行的进程, 可能在执行内核函数期间被另一个进程取。原创 2023-02-18 15:58:09 · 348 阅读 · 0 评论 -
操作系统:进程与线程之间的区别及联系
1、进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。是系统进行资源分配和调度的独立单位,也是基本的执行单元。是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动。进程结构特征: 由程序、数据和进程控制块三部分组成。具有 独立性、并发性、异步性和动态性的特点。第一,进程是一个实体。原创 2022-12-28 21:28:00 · 942 阅读 · 0 评论 -
一文搞懂操作系统进程同步的几种机制(含现实案列)
多进程的系统中避免不了进程间的相互关系。本讲将介绍进程间的两种主要关系——同步与互斥,然后着重讲解解决进程同步的几种机制。进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。通常的情况是两个或两个以上的进程需要同时访问某个共享变量。我们一般将发生能够问共享变量的程序段称为临界区。两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。原创 2022-12-27 15:25:07 · 1811 阅读 · 0 评论 -
一文搞懂Linux内核进程CPU调度基本原理
对于操作系统中的任务是不同的,例如,系统进程和用户进程、前台进程和后台进程,如果不加以区分,那么系统中关键的任务无法及时处理,后台运算导致视频播放卡顿,所以基于此,重要的任务需要被优先调度,就产生了优先级的概念。依据进程进入就绪队列的先后顺序排列,进程进入等待或者结束状态时,就绪队列中的下一个进程占用CPU,3个进程,计算时间分别为12,3,3,FCFS算法的周转时间,根据任务到达的顺序不同,周转时间不同。知道了进程的分类,那就可以知道哪些场景需要调度来协调,如IO消耗性的,例如磁盘,打印机,网络等场景。原创 2023-02-18 15:51:10 · 983 阅读 · 0 评论 -
深入理解Linux进程描述符task_struct结构体
进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中。谈到task_struct结构体,可以说她是linux内核源码中最复杂的一个结构体了,成员之多,占用内存之大。原创 2022-12-26 20:51:49 · 773 阅读 · 0 评论 -
Linux内核进程上下文的切换
进程管理中最重要的一步要进行进程上下文切换,其中主要有两大步骤:地址空间切换和处理器状态切换(硬件上下文切换),前者保证了进程回到用户空间之后能够访问到自己的指令和数据(其中包括减小tlb清空的ASID机制),后者保证了进程内核栈和执行流的切换,会将当前进程的硬件上下文保存在进程所管理的一块内存,然后将即将执行的进程的硬件上下文从内存中恢复到寄存器,有了这两步的切换过程保证了进程运行的有条不紊,当然切换的过程是在内核空间完成,这对于进程来说是透明的。原创 2023-02-25 20:21:35 · 764 阅读 · 0 评论 -
一文搞懂Linux内核进程原理及系统调用机制
本文介绍了进程四要素、进程生命周期,列举了task_struct数据结构的主要内容,系统调用写时复制思想,守护进程,进程退出原理等内容。原创 2022-12-28 21:31:28 · 1142 阅读 · 0 评论 -
一文让你彻底理解Linux内核调度器进程优先级
本文主要描述的是进程优先级这个概念。从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级、realtime优先级、归一化优先级和动态优先级等概念。我们希望能在第二章将这些相关的概念描述清楚。为了加深理解,在第三章我们给出了几个典型数据流过程的分析。原创 2023-02-25 22:03:54 · 1289 阅读 · 0 评论 -
Linux操作系统进程同步的几种方式及基本原理
其中sem=1表示进程PA和PB都未进入类名为S的临界区,sem=0表示进程PA或PB已进入类名为S的临界区,sem=-1表示进程PA和PB中,一个进程已进入临界区,而另一个进程等待进入该临界区。:一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程称为并发进程间的直接制约。在并发进程中,一个或多个进程要对公用资源进行访问时,必须确保该资源处于空闲状态,也就是说,在并发进程中,临界区只允许一个进程进入,而其他进程阻塞,等待该共享临界资源释放。原创 2023-03-15 16:23:03 · 1641 阅读 · 0 评论 -
一文读懂UNIX的原始进程模型
UNIX的传统倾向于将一个任务交给一个进程全权受理,但是一个任务内部也不仅仅是一个执行绪,比如一个公司的所有成员,大家都在做同一件事,每个人却只负责一部分,粒度减小之后,所有的事情便可以同时进行,不管怎样,大家还都共享着所有的资源。因此就出现了线程。线程其实就是共享资源的不同的执行绪、线程的语义和朴素的UNIX进程是不同的。原创 2022-12-22 22:27:27 · 131 阅读 · 0 评论 -
Linux内核进程地址空间与进程内存布局
由于栈中数据严格的遵守FIFO的顺序,这个简单的设计意味着不必使用复杂的数据结构来追踪栈中的内容,只需要一个简单的指针指向栈的顶端即可,因此压栈(pushing)和退栈(popping)过程非常迅速、准确。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用,每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的,最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。原创 2023-02-24 22:24:25 · 1725 阅读 · 0 评论 -
Linux操作系统进程的状态和转换(五态模型)
挂起等待态→挂起就绪态:引起进程等待的事件发生之后,相应的挂起等待态进程将转换为挂起就绪态挂起就绪态→就绪态:当内存中没有就绪态进程,或者挂起就绪态进程具有比就绪态进程更高的优先级,系统将把挂起就绪态进程转换成就绪态。运行态→挂起就绪态:当一个具有较高优先级的挂起等待态进程的等待事件结束后,它需要抢占 CPU,而此时主存空间不够,从而可能导致正在运行的进程转化为挂起就绪态。运行态→终止态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。原创 2023-03-15 16:18:15 · 2212 阅读 · 1 评论 -
浅析Linux内核进程间通信(信号量)
信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源(临界区,类似于互斥锁),同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。原创 2023-02-25 22:14:27 · 550 阅读 · 0 评论 -
玩转Linux内核进程调度,这一篇就够(所有的知识点)
其中 x19-x28 是 arm64 架构规定需要调用保存的寄存器,可以看到处理器状态切换的时候将前一个进程(prev)的 x19-x28,fp,sp,pc 保存到了进程描述符的 cpu_contex 中,然后将即将执行的进程 (next) 描述符的 cpu_contex 的 x19-x28,fp,sp,pc 恢复到相应寄存器中,而且将 next 进程的进程描述符 task_struct 地址存放在 sp_el0 中,用于通过 current 找到当前进程,这样就完成了处理器的状态切换。原创 2023-02-25 21:53:23 · 2545 阅读 · 0 评论 -
C/C++ Linux进程间通信-共享内存
共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。个人理解:在物理内存上有一块空间,不同的进程通过页表将其映射到自己的虚拟地址空间,返回一个地址,通过这个地址可以访问到那一块内存空间,此内存空间为共享内存;原创 2022-11-07 16:58:32 · 1526 阅读 · 0 评论 -
一文读懂Linux内核进程及调度时机原理
0.1 进程概要进程是对物理世界的建模抽象,每个进程对应一个 task_struct 数据结构,这个数据结构包含了进程的所有的信息。在 Linux 内核中,不会区分线程和进程的概念,线程也是通过进程来实现的,线程和进程的唯一区别就是:线程没有独立的资源,进程有。所有的进程都是通过其他进程创建出来的,因此,整个进程组织为一棵进程树。0 号进程是 无中生有 凭空产生的,是静态定义出来的,是所有进程的祖先,创建了 INIT(1号)和 kthreadd(2号进程)。0.2 进程调度时机系统调用 yield、paus原创 2023-01-07 21:25:16 · 1402 阅读 · 0 评论 -
Linux内核CPU可运行进程队列的负载均衡
提到负载,我们首先会想到命令uptime或者top命令输出系统的平均负载(load average),例如uptime的输出结果uptimeload average的三个值分别代表过去1分钟、5分钟、15分钟的系统平均负载,这三个值实际上来自于 /proc/loadavg, Linux的系统平均负载是系统中处于 runnable 与 uninterruptible 两个状态的任务总数与CPU数量的比值。CPU负载(cpu load)指的是某个时间点进程对系统产生的压力。原创 2023-02-18 16:00:51 · 1600 阅读 · 0 评论