但是只要系统中进程的数目比处理器的个数多,就注定会有一些进程不能一 直执行。这些进程在等待运行。在一 组处于可运行状态的进程中选择一个来执行,是调度程序所需完成的基本工作。...Linux 提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行以便其他进程能够得到执行机会。这个强制的挂起动作就叫抢占(preemption)。...== 进程在被抢占之前能够运行的时间是预先设置好的==,而且有一个专门的名字,叫进程的时间片(timeslicc):时间片实际上就是分配给每个进程的处理器时间段。...在包括Linux在内的某些系统中,优先级高的进程使用的时间片也较长。调度程序总是选择时间片未用尽面且优先级最高的进程运行。用户和系统都可以通过设置进程的优先级来影响系统的调度。...进程抢占 像前面所说的,Linux 系统是抢占式的。当-个进程进入TASK_RUNNING状态,内核会检查它的优先级是否高于当前正在执行的进程。
进程的概念 进程是指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。程序本身只是指令、数据及组织形式的描述,而进程才是程序真正的运行实体。...在Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...图片 Linux内核提供了一组宏值来表示进程的状态: TASK_RUNNING(可运行状态或就绪状态);Linux并没有严格区分运行态或就绪态,统一为TASK_RUNNING...限期进程是指必须在一定时间内要完成的进程。其余的非限期进程的实时进程也是需要在一定时间内完成,但不是那么急需。 Linux不支持硬实时处理,至少在主流的内核中不支持。...内核线程是直接由内核本身启动的线程,内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程“并行执行”(实际上也并行于内核自身的执行)。
进程状态转化图 进程级联 Linux进程之间存在一个明显的继承关系。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。...因为在一般情况下, 进程创建后都会马上运行一个可执行的文件。由于Unix强调进程快速执行的能力,所以这个优化是很重要的。 fork() Linux通过clone(系统调用实现fork()。...从内核的角度来说,它并没有线程这个概念。Linux把所有的线程都当作进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个使用某些共享资源的进程。...在其他的系统中,相较于重量级的进程,线程被抽象成一种耗费较少资源,运行迅速的执行单元。而对于Linux来说,它只是一种进程间共享资源的手段(Linux的进程本身就够轻了)。...它们只在内核空间运行,从来不切换到用户空间。内核进程和普通进程一样,可以被调度,也可以被抢占。 Linux确实会把一些任务交给内核线程去做,像pdflush和ksofirqd这 些任务就是明显的例子。
让我们了解和熟悉基本的Linux内核相关的信息,Linux内核我们主要从以下几个方面来讲解: Linux内核-什么是内核(本章节) Linux内核-内核参数 Linux内核-proc文件系统 Linux...什么是Linux内核 Linux 内核是Linux操作系统的核心部分,它是一个自由和开放源代码的类Unix操作系统内核。...以下是Linux内核的一些关键特点和功能: 开源:Linux内核的源代码是公开的,任何人都可以查看、修改和发布自己的版本。...模块化设计:Linux内核由许多模块组成,这些模块可以根据需要加载或卸载,这使得内核可以根据实际使用的硬件进行定制。 多任务处理:Linux内核能够同时运行多个进程,每个进程都有独立的虚拟地址空间。...内存管理:Linux内核提供了复杂的内存管理系统,用于管理物理内存,并通过虚拟内存技术来扩展可用内存。 进程调度:Linux内核使用一个调度程序来决定哪个进程在给定的时间运行。
:创建旧进程的副本,比如进程描述符和子进程运行需要的其它内核数据结构。...设置子进程的PID p->pid = pid_nr(pid); // 11. 根据是创建线程还是进程设置线程组组长、进程组组长等等信息 // ... // 12....esp寄存器加载thread.esp的值(也就是获取了子进程的内核态栈的地址),eip寄存器加载ret_from_fork()函数的返回地址(子进程执行的下一条指令)。...基本上,新进程的执行恰恰在fork()、vfork()或clone()系统调用结束之时。该系统调用的返回值保存在寄存器eax中:对于子进程是0,对于父进程来说就是子进程的PID。...创建完进程的4要素之后,把新进程的最开始执行的指令设置到eip寄存器即可。然后就是等待内核调度。当轮到新进程使用CPU的时候,就从eip寄存器开始执行。
作业:是一个进程组,作业分为前台作业(前台进程组),后台作业(后台进程组) 会话:会话是若干进程组的集合。会话有一个前台进程组和多个后台进程组。...fork创建的子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。...示意图 守护进程 守护进程的概念 守护进程是运行在操作系统后台的特殊进程,且守护进程和控制终端(比如xshell界面)是隔离的。...该函数返回时,父进程实际上是上一次调用fork产生的子进程。然后这个父进程被终止,留下新的子进程继续运行。...查询被进程ID对应的进程打开的文件:lsof -p 1000 查看进程内存情况:pmap PID 样例: 参考阅读: 《UNIX环境高级编程第3版》 《Linux C++ 通信架构实战》 《UNIX
1 进程切换 进程切换,又称为任务切换、上下文切换、或者任务调度。本文就研究Linux内核的进程切换。我们首先理解几个概念。...硬件上下文是进程执行上下文的一个子集,进程执行上下文包含进程执行所需要的所有信息。在Linux中,进程的硬件上下文一部分存储在进程描述符中,而其它部分存储在内核态的栈中。...但是,优化硬件上下文的切换是不可能的,因为都是由CPU完成的,而Linux是使用软件代替硬件上下文切换的,所以有优化的空间,以便提高执行时间。 进程切换只能发生在内核态。...2 执行进程切换 进程切换的时机: 中断处理程序中直接调用schedule()函数,实现进程调度。 内核线程,是一个特殊的进程,只有内核态没有用户态。...内核态进程没法直接主动调度,因为schedule()是一个内核函数,不是系统调用。所以只能在中断处理程序进行调度。
这一篇有区别于上一篇的“信号量”机制哈 平台的手机版对排版的支持有限,建议用电脑打开此文章 一,Linux信号的概念: 信号是 Linux 进程间通信的最古老的方式。...二,Linux信号的特点: 1.信号是异步的,进程不需要等待信号的到来,也不需要有获得信号的操作,而是在进程内部设置与信号对应的处理函数,有信号到达的时候,系统异步触发对应的处理函数。...在Linux终端上敲“Ctrl+c”,就产生一个“中断”,相当于产生一个信号,接着就会处理这个“中断任务”(默认的处理方式为结束掉当前进程) 2.信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件...SIGCHLD, Linux中当子进程结束时,子进程并未被完全销毁,因为父进程还要用它的信息。...2) 未决状态:在信号产生和递送之间的时间间隔内,称信号是未决的(pending) 如果为进程产生了一个被该进程设置为阻塞的信号,而且对该信号的动作是默认或者捕捉该信号,则内核为该进程将此信号保持为未决状态
本文是《Linux内核设计与实现》第四章的阅读笔记,代码则是摘自最新的4.6版本linux源码(github),转载请注明出处。...意思是说,既然要重新进行调度,那么可以继续执行进入内核态之前的那个进程,也完全可以重新选择另一个进程来运行,所以如果设置了,内核就会选择一个更合适的进程投入运行。...简单来说有以下两种情况会发生用户抢占: 从系统调用返回用户空间 从中断处理程序返回用户空间 内核抢占 Linux和其他大部分的Unix变体操作系统不同的是,它支持完整的内核抢占。...在Linux中,只要重新调度是安全的,内核就可以在任何时间抢占正在执行的任务,这个安全是指,只要没有持有锁,就可以进行抢占。...为了支持内核抢占,Linux做出了如下的变动: 为每个进程的引入了计数器,用于记录持有锁的数量,当它为0的时候就意味着这个进程是可以被抢占的。
进程优先级 Linux内核中进程优先级一般分为动态优先级和静态优先级,动态优先级是内核根据进程的nice值、IO密集行为或者计算密集行为以及等待时间等因素,设置给普通的进程;静态优先级是用户态应用设置给实时进程...任何普通进程的nice值在-20~19之间,0是默认,较高的nice值表示较低的进程优先级;实时进程的优先级范围是在0~99 从内核的优先级角度,所有的进程都处于0~139,其中的0~99是分配实时进程...实际调度器 调度器通用元素 CFS(完全公平)调度器 Linux内核中所有动态优先级的进程都是有CFS调度器处理,通常Linux内核中大部分都是非实时进程,所以CFS进程调度器也是最繁忙的调度器。...内核中支持实时进程,它们是由实时调度器来进行调度。...rt进程被分配了静态优先级,并且在内核中保持不变。于CFS不同,实时调度器采用了每个优先级1~99的单链表,并非采红黑树作为运行队列。
没有废话,内存管理暂时告一段落,正式进入进程管理的内容。 内核通过 task_struct 描述进程 用命令 pstree 可以让内核以树形的结构把进程之间的关系列出来,如下图: ?...这是进程在内核中的结构形式,那么内核是如何来以树形结构管理描述这些进程的呢?用来描述进程的数据结构,可以理解为进程的属性。...0是停止状态。 volatile long state; ...... //指向内核栈的指针 void *stack; .........对于ARM64平台,记录当前进程的task_struct地址是利用sp0_el1寄存器,当内核执行进程切换时会把当前要运行的进程task_struct地址记录到该寄存器中。...Linux中的 ready 和 running 对应的都是TASK_RUNNING标志位,ready 表示进程正处在队列中,尚未被调度;running 则表示进程正在CPU上运行; ?
大家好,又见面了,我是你们的朋友全栈君。 Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3个数字组成:r.x.y r:目前发布的内核主版本。...5: 表示这个当前版本的第5次微调patch , 而ELsmp指出了当前内核是为ELsmp特别调校的 EL : Enterprise Linux ; smp : 表示支持多处理器 , 表示该内核版本支持多处理器...kernel for uniprocessor machines 默认选项,支持单处理器机器 版本号-smp: SUSE Linux kernel that supports symmetric multiprocessing...支持单处理器机器 版本号.ELhugemem: Red Hat Linux kernel that supports up to 64 GB of RAM 支持64GB内存的对称多处理器机器 版本号....一般情况下,可以直接到官网:http://www.kernel.org下载, 缺点是:对于任何内核做过特殊优化调校的发行版是不合适的,尤其是fedora ubuntu 这一类的,毕竟他们在内核中打了大量的补丁
文章目录 一、进程特殊形式 ( 内核线程 | 用户线程 ) 二、C 标准库与 Linux 内核中进程相关概念 三、Linux 查看进程命令及输出字段解析 一、进程特殊形式 ( 内核线程 | 用户线程 )...又称为 线程 ; 线程组 : 共享 相同 用户虚拟地址空间 的线程 , 组成了一个 线程组 , 二、C 标准库与 Linux 内核中进程相关概念 ---- C 语言中 标准库 提供的 进程 , 与 Linux...内核 中的 进程 这两个概念是不同的 ; C 标准库 中的 包含多个线程 的进程 , 在 Linux 内核中 称为 " 线程组 " ; C 标准库 中的 只有一个线程 的进程 , 在 Linux 内核中...称为 " 任务 / 进程 " ; C 标准库 中的 线程 , 在 Linux 内核中 称为 " 共享 用户虚拟地址空间 的 进程 " 三、Linux 查看进程命令及输出字段解析 ---- 在 Ubuntu..., 不是 实时动态更新的 ; 实时进程使用 top 命令 ; 进程字段说明 : USER : 表示 进程是属于哪个账户的 ; PID : 进程 ID ; %CPU : 使用的 CPU 资源占用的 百分比
基本介绍 Linux的进程调度器是内核中最重要的核心组件,它决定了一个进程合适获取CPU的时间以及占用CPU的时间。...Linux进程调度器采用类似于vfs的设计采用简单的两层结构模式,第一层是通用调度器,定义作为进程调度器的入口抽象层;第二层是调度器的具体实现,根据调度策略实现进程的调度的器的具体实现。...sched_class rt_sched_class)、完全公平调度器(struct sched_class fair_sched_class) 内核中运行队列包含了所有的进程,每个CPU都有一个运行队列...内核中进程运行队列是通过struct rq来定义 // 省略大部分字段,着重描述下运行队列中的一些字段 struct rq { // 每个CPU的运行队列的锁 raw_spinlock_t lock...; unsigned long next_balance; }; 进程调度实现 进程调度是调用进程第一层的通用调度器,内核是从__schedule()函数开始,该函数是挑选下一个最佳的可运行的进程任务
基于这个目的,Linux内核在每个进程的进程描述符中还应该包含资源限制的数据结构,Linux使用了一个数组成员,该数组成员的包含关系为current->signal->rlim,数组的定义如下所示: struct...如果超过这个时间,内核会发送一个SIGXCPU信号,如果进程还是没有终止,再发送SIGKILL信号。 RLIMIT_DATA 最大堆大小,单位是字节。内核在扩大进程的堆空间之前,检查这个值。...RLIMIT_FSIZE 最大文件大小,单位是字节。如果进程尝试扩大文件超过这个值,内核发送一个SIGXFSZ信号。 RLIMIT_LOCKS 文件锁的最大数量(目前不强制)。...RLIMIT_SIGPENDING 进程挂起信号的最大数量。 RLIMIT_STACK 最大栈空间,单位是字节。在扩展进程的用户态栈时,内核会检查这个值。 RLIMIT_NICE 优先级的完美值。...但是,我们查看源码的时候会发现,大部分的资源限制都被设为RLIM_INFINITY(0xffffffff),这意味对资源没有用户限制(当然了,本身还要受到硬件的限制:比如可用的RAM,硬盘实际空间等等)
简介 Linux内核中进程调度的核心是选择哪个任务在哪个CPU上运行,解决各个进程之间能够公平的共享CPU资源,同时需要确认进程需要占用CPU时间,确定下一个需要运行的进程。...负载均衡的核心是各个CPU之间空闲和繁忙不均衡,提供系统整体的计算吞吐量。...,进程迁移到新的Core上缺失L1 Cache数据,这就需要进程的状态数据需要在CPU Core之间进行通信获取这些数据,根据上图CPU的通信模式可以了解,成本代价是蛮大的。...内核采用调度域解决现代多CPU多核的问题,调度域是具有相同属性和调度策略的处理器集合,任务进程可以在它们内部按照某种策略进行调度迁移。...目前内核进程调度按照如下的原则进行,这些原则都是按照cpu架构以及通信路径来进行的。
这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。 进程概念:进程是对正在运行程序的一个抽象。...在linux下线程属于轻量级进程,拥有完全一样的数据结构,是系统调度的最小单位。并且线程和cpu是1:1模型,也就是说当前cpu在一个时间片周期内只运行一个线程,这样可以充分利用硬件。 ...再看其中三个比较重要的结构: struct thread_info 字面意思是线程信息,其实主要是内核栈的信息,每个进程都有自己的内核栈和用户栈,还可以设置中断栈,其中和进程上下文切换相关的主要是内核栈...,则将父进程的组领导复制给新进程组领导,如果是进程则组领导是新进程本身 if (clone_flags & CLONE_THREAD) { p->group_leader = current->group_leader...group_leader是新进程本身,pgid是当前进程(创建子进程的进程)的pgid,tgid是新进程本身,parent是当前进程(创建子进程的进程)。
Cache基本视图如下图: [0k4d2tngtz.jpg] 从Cache和内存访问的视角,如果进程负载均衡需要把进程A迁移到另一个CPU上, 如果目标CPU和进程A之前所在CPU正好是同一个物理CPU...如果目标CPU和进程A之前所在CPU正好是同一个NUMA但是不同物理CPU上(多NUMA结构),虽然Cache已经是'冷'了,但至少内存访问还是在本NUMA中。...SMP组织 为了更好地利用Cache,内核将CPU(如果开启了超线程,那么以逻辑CPU为单位,否则以物理CPU核心为单位)组织成了调度域。...[718zvi6nuz.jpg] 单CPU视角 从单个CPU的视角分析,下图是调度域实际组织方式。 [y6rt4xcbla.jpg] 每个CPU的进程运行队列有一个成员指向其所在调度域。...[9n6cjr8brh.png] 以下是对CPU的每个层级调度域调用load_balance()函数核心流程,目的是把一些进程迁移到指定的CPU(该场景就是当前CPU)。
1、虚拟处理器、虚拟内存:让进程感觉自己拥有所有 image.png 2、进程上限,cat /proc/sys/kernel/pid_max 3、进程的五种状态 image.png set_task_state...(task,state); 4、每个进程都有一个父进程 image.png 5、进程的创建:fork() exec() image.png 6、写时拷贝COW image.png 7、线程和进程的区别不大...image.png 8、孤儿进程,父进程先关掉,再设置一个父进程,如果没有,设置init image.png 9、2.6内核后进程调度算法CFS:完全公平调度算法 10、进程分为IO消耗型和处理器消耗型...11、ps -eo state,uid,pid,ppid,rtprio,time,comm -不是实时进程 12、CFS??...image.png image.png 13、与调度相关的系统调用 image.png 14、系统调用在用户空间进程和硬件设备之间添加了一个中间层 image.png 15、中断 image.png
1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...(可能是等待IO读写完成,也可能等待其他内核路径释放一把锁等)。...内核是如何管理睡眠的任务的?我们会结合内核源代码来分析任务的睡眠,力求全方位角度来剖析。 注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。...当然,内核态中,睡眠有两种场景:一种是睡眠特定的时间的延迟操作(唤醒条件为超时),一种是等待特定条件满足(如IO读写完成,可睡眠的锁被释放等)。...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。
领取专属 10元无门槛券
手把手带您无忧上云