Linux进程管理:deadline调度器

2023-11-19

一、概述

实时系统是这样的一种计算系统:当事件发生后,它必须在确定的时间范围内做出响应。在实时系统中,产生正确的结果不仅依赖于系统正确的逻辑动作,而且依赖于逻辑动作的时序。换句话说,当系统收到某个请求,会做出相应的动作以响应该请求,想要保证正确地响应该请求,一方面逻辑结果要正确,更重要的是需要在最后期限(deadline)内作出响应。如果系统未能在最后期限内进行响应,那么该系统就会产生错误或者缺陷。在多任务操作系统中(如Linux),实时调度器(realtime scheduler)负责协调实时任务对CPU的访问,以确保系统中的所有的实时任务在其deadline内完成。

如果对实时任务进行抽象,那么它需要三个元素:周期(period),运行时间(runtime)和最后期限(deadline)。Deadline调度器正是利用了这一点(指对实时任务完美的抽象),允许用户来指定该任务的具体需求,从而使系统能够做出最好的调度决策,即使在负载很高的系统中也能保证实时任务的调度。

二、Linux系统中的实时调度器

实时任务和非实时任务(或者普通任务)的区别是什么?实时任务有deadline,超过deadline,将不能产生正确的逻辑结果,非实时任务则没有这个限制。为了满足实时任务的调度需求,Linux提供了两种实时调度器:POSIX realtime scheduler(后文简称RT调度器)和deadline scheduler(后文简称DL调度器)。

RT调度器有两种调度策略:FIFO(first-in-first-out)和RR(round-robin)。无论FIFO还是RR,RT调度器都是根据任务的实时优先级(Linux进程描述符中的rt_priority成员)进行调度。最高优先级的任务将最先获得CPU资源。在实时理论中,这种调度器被归类为固定优先级调度器(fixed-priority scheduler,即每一个rt任务都固定分配一个优先级)。当实时优先级不同的时候,FIFO和RR没有什么不同,只有在两个任务具有相同优先级的时候,我们才可以看出FIFO和RR之间的区别。对于FIFO调度器,最先进入runnable状态的任务将首先获取CPU资源,并且一直占用该资源,直到该进程进入睡眠状态。而对于RR调度器,具有相同优先级的任务将以轮流执行的方式共享处理器资源。当某个RR任务开始运行后,如果该任务不会阻塞,那么它将一直运行,直到分配给该任务的时间片到期。当时间片用完,调度器将把该任务放在任务链表的末端(注意,只有相同优先级的任务才会放到一个链表中,不同优先级在不同的链表中),并从任务链表中选择下一个任务去执行。

和RT调度器不同,DL调度器是按照任务的deadline进行调度的(从名字也看的出来,哈哈)。当产生一个调度点的时候,DL调度器总是选择其Deadline距离当前时间点最近的那个任务并调度它执行。调度器总是根据任务的配置参数进行调度,对于RT调度器而言,用户需要配置任务的调度策略(FIFO或者RR)和那个固定的实时优先级。例如:

chrt -f 10 video_processing_tool

通过上面的命令,video_processing_tool任务会归于RT调度器管理,其实时优先级是10,调度策略是FIFO(-f参数)

对于DL调度器,用户需要设定三个参数:周期(period)、运行时间(runtime)和最后期限(deadline)。周期和该实时任务的工作模式相关。例如:对于一个视频处理任务,它的主要的工作是每秒钟处理60帧的视频数据,即每16毫秒需要处理每一帧视频,因此,该任务的周期就是16ms。

对于实时任务,一个周期内总是有固定的“工作”要做,例如在视频任务中,所谓的工作就是对一帧视频数据进行处理,Runtime是完成这些“工作”需要的CPU执行时间,即在一个周期中,需要CPU参与运算的时间值。在设定运行时间参数的时候我们不能太乐观,runtime在设定的时候必须考虑最坏情况下的执行时间(worst-case execution time ,WCET)。例如,在视频处理中,各个帧的情况可能不太一样(一方面帧间的相关性不同,另外,即便是针对一帧数据,其图像像素之间的相关性也不同),有些会耗时长一些,有些会短一些。如果处理时间最长的那帧视频需要5毫秒来处理,那么它的runtime设定就是五毫秒。

最后我们来说说Deadline参数。在一个实时任务的工作周期内,deadline定义了处理完成的结果必须被交付的最后期限。我们还是以上面的视频处理任务为例,在一个视频帧的处理周期中(16ms),如果该任务需要在该周期的前10毫秒内把处理过的视频帧传送给下一个模块,那么deadline参数就是10毫秒。为了达到这个要求,显然在该周期的前10ms就必须完成一帧数据的处理,即5ms的runtime必须位于该周期的前10ms时间范围内。

通过chrt命令我们可以设定deadline调度参数,例如:上面的视频任务可以这样设定:

chrt -d --sched-runtime 5000000 --sched-deadline 10000000 \
--sched-period 16666666 0 video_processing_tool

其中“-d”参数说明设定的调度策略是deadline,“--sched-runtime 5000000”是将运行时间参数设定为5ms,“--sched-deadline 10000000”是将deadline设定为10ms,“--sched-period 16666666”则是设定周期参数。命令行中的“0”是优先级占位符,DL调度器并不使用优先级参数。

通过上面的设定,我们可以确保每16ms的周期内,DL调度器会分配给该任务5ms的CPU运行时间,而且这个5ms的CPU时间会保证在10ms内的deadline之前配备给该任务,以便该任务完成处理并交付给下一个任务或者软件模块。

Deadline的参数看似复杂,其实简单,因为只要知道了task的行为,就可以推断出其调度参数并进行设定。也就是说deadline任务的调度参数只和自己相关,和系统无关。RT task则不然,它需要综合整个系统来看,把适合的rt priority配置给系统中的各个rt task,以确保整个系统能正常的运作(即在deadline之前,完成各个rt task的调度执行)。

由于deadline任务明确的告知了调度器自己对CPU资源的需求,因此,当一个新的deadline task被创建,进入系统的时候,DL调度器可以知道CPU是否可以承担这个新创建的DL task。如果系统比较空闲(DL任务不多),那么可以该task进入调度,如果系统DL任务已经很多,新加入的DL任务已经导致CPU利用率超过100%,那么DL调度器会将其拒之门外。一旦DL任务被接纳,那么DL调度器则可以确保该DL task可以按照其调度参数的要求正确的执行。

为了进一步讨论DL调度器的好处,我们有必要后退一步,看看实时调度的蓝图。因此,下一节我们将描述一些实时调度的理论知识。

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

三、实时调度概述

在调度理论中,怎么来评估实时调度器的性能呢?具体的方法就是创建一组实时任务(后文称之实时任务集)让调度器来调度执行,看看是否能够完美的调度任务集中的所有任务,即所有实时任务的时间要求(deadline)都可以得到满足。为了能够在确定的时间内响应请求,实时任务必须在确定的时间点内完成某些动作。为此,我们需要对实时任务进行抽象,总结出其任务模型来描述这些动作确定性的时序。

每个实时任务都有N个不断重复的“工作”(job)组成,如果一个rt task所进行的工作总是在固定的时间间隔内到来,那么我们成该任务是周期性的(Periodic)。例如一个音频处理程序每隔20ms就会对一帧音频数据进行压缩。任务也可以是零散到来的(sporadic),sporadic task类似periodic task,只不过对周期要求没有那么严格。对于sporadic task而言,它只定义了一个最小的时间间隔。假如这个最小时间间隔是20ms,那么job可能在距离上一次20ms后到来,也可能30ms到来,但是不会小于20ms。最后一种是非周期任务,没有任何固定的模式。

上一段总结了实时任务的工作模式,下面我们看看deadline的分类。一个实时任务的Deadline有三种:第一种是隐含性的deadline(implicit deadline),即并不明确的定义deadline,其值等于period参数。这一种实时任务对时间要求相对比较低,只要在该周期内分配了runtime的CPU资源即可。第二种是受限型deadline(constrained deadline),即deadline小于(或者等于)period参数,这种实时任务对时间的要求高一些,需要在周期结束之前的某个时间范围内分配CPU资源。最后一种是arbitrary deadline:即deadline和周期没有关系。

根据抽象出来的任务模式,实时研究人员已经开发出一种评估调度算法优劣的方法:首先给定一组任务(包括了各种各样前面描述的实时任务类型),让被测试的调度器去调度这一组任务,以此来评估该调度器的调度能力。结果表明,在单处理器系统中,采用Early Deadline First(EDF)算法的调度器被认为是最佳的。之所以说它是最好的,言外之意就是当该调度器无法完成某个任务集调度的时候,其他调度器也无能为力。当在单处理器系统上调度periodic 和sporadic任务,并且deadline总是小于或等于周期参数(也就是constrained deadline)的时候,基于deadline参数进行调度的调度器性能优异,表现最佳。实际上,对于那些deadline等于period参数(即implicit deadline)的periodic或者sporadic tasks,只要被调度的那组任务不使用超过100%的CPU时间,那么EDF调度器都可以正常的完成调度,满足每一个rt task的deadline要求。Linux DL调度器实现了EDF算法。

我们举一个实际的例子,假设系统中有三个周期性任务,参数如下(deadline等于period):

Task Runtime(WCET) Period
T1 1 4
T2 2 6
T3 3 8

这三个任务对 CPU时间的利用率还没有达到100%:CPU利用率 = 1/4 + 2/6 + 3/8 = 23/24

对于这样的一组实时任务,EDF调度器的调度行为如下图所示:

通过上图可知3个rt任务都很好的被调度,满足了各自的deadline需求。如果使用固定优先级的调度器(例如Linux内核中的FIFO)会怎样呢?其实不管如何调整各个rt task的优先级,都不能很好的满足每个任务的deadline要求,总会有一个任务的Job会在deadline之后完成,具体参考下面的图片:

基于deadline的调度算法最大的好处是:一旦知道了一个实时任务集中每个任务的调度参数,其实根本不需要分析其他任务,你也能知道该实时任务集是否能在deadline之前完成。在单处理器系统,基于deadline进行调度所产生的上下文切换次数往往会比较少。此外,在保证每个任务都满足其deadline需求的条件下,基于deadline的调度算法可以调度的任务数目比固定优先级的调度算法要多。当然,基于deadline参数进行调度的调度器(后面简称deadline调度器)也有一些缺点。

deadline调度器虽然可以保证每个RT任务在deadline之前完成,但是并不能保证每一个任务的最小响应时间。对于那些基于固定优先级的进行调度的调度器(后文简称priority调度器),高优先级的任务总是有最小的响应延迟时间。EDF调度算法的priority调度算法要复杂一些。priority调度算法的复杂度可以是O(1)(例如Linux中的RT调度器),相比之下,deadline调度器的复杂度是O(log(n))(例如Linux中的DL调度器)。不过priority调度器需要为每一个task选择一个最适合的优先级,这个最优优先级的计算过程可能是离线的,这个算法的复杂度是O(N!)。

如果系统出于某种原因发生过载,例如由于新任务添加或错误的估计了WCET,这时候,deadline调度有可能会有一个多米诺效应:当一个任务出现问题,影响的并非仅仅是该任务,这个问题会扩散到系统中的其他任务上去。我们考虑这样的场景,由于运行时间超过了其runtime参数指定的时间,调度器在deadline之后才完成job,并交付给其他任务,这个issue很影响系统中所有其他的任务,从而导致其他任务也可能会错过deadline,如红下面的区域所示:

而对于那些基于固定优先级的调度算法则相反,当一个任务出问题的时候,受影响的只是那个优先级最低的task。(顺便说一句:在linux中,DL调度器中实现了CBS,从而解决了多米诺效应,下一篇文档会详述。)

在单核系统中,调度器只需要考虑任务执行先后顺序的问题,在多核系统中,除了任务先后问题,调度器还需要考虑CPU分配问题。也就是说,在多核系统中,调度器还需要决定任务在那个CPU上运行。一般来说,调度器可以被划分为以下几类:

(1)全局类(Global):即一个调度器就可以管理系统中的所有CPU,任务可以在CPU之间自由迁移。

(2)集群类(Clustered):系统中的CPU被分成互不相交的几个cluster,调度器负责调度任务到cluster内的CPU上去。

(3)分区类(Partitioned ):每个调度器只管自己的那个CPU,系统有多少个CPU就有多少个调度器实体。

(4)任意类(Arbitrary ):每一个任务都可以运行在任何一个CPU集合上。

对于partitioned deadline调度器而言,多核系统中的调度其实就被严格分解成一个个的单核deadline调度过程。也就是说,partitioned deadline调度器的性能是最优的。不过,多核系统中的global、clustered和arbitrary deadline调度器并非最优。例如,在一个有M个处理器的系统中,如果有M个runtime等于period参数的实时任务需要调度,调度器很容易处理,每个CPU处理一个任务即可。我们可以进一步具体化,假设有四个“大活”,runtime和period都是1000ms,一个拥有四个处理器的系统可以分别执行这四个“大活”,在这样的场景下,CPU利用率是400%:

4 * 1000/1000 = 4

调度的结果如下图所示:

在这么重的负载下,调度器都能工作起来,每个“大活”的deadline都得到满足。当系统的负载比较轻的情况下,我们直觉就认为调度器也应该能hold住场面。下面我们构造一个轻负载:调度器要面对的是4个“小活”和一个“大活”,“小活”的runtime是1ms,周期是999ms,“大活”同上。在这种场景下,系统的CPU利用率是100.4%:

4 * (1/999) + 1000/1000 = 1.004

1.004是远远小于4的,因此,我们直观上感觉调度器是可以很好的调度这个“4小一大”的调度场景的。然而实时并非如此,单核上表现最优的EDF调度器,在多核系统中会出现问题(指Global EDF调度器)。具体原因是这样的:如果所有任务同时释放,4个小活(deadline比较早)将会被调度在4个CPU上,这时候,“大活”只能在“小活”运行完毕之后才开始执行,因此“大活”的deadline不能得到满足。如下图所示。这就是众所周知的Dhall效应(Dhall's effect)。

把若干个任务分配给若干个处理器执行其实是一个NP-hard问题(本质上是一个装箱问题),由于各种异常场景,很难说一个调度算法会优于任何其他的算法。有了这样的背景知识,我们就可以进一步解析Linux内核中的DL调度器的细节,看看它是如何避免潜在的问题,发挥其强大的调度能力的。

原文作者:极致Linux内核

原文地址:Linux进程管理:deadline调度器 - 知乎(版权归原文作者所有,侵权留言联系删除)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux进程管理:deadline调度器 的相关文章

  • 如何从内核空间读取/写入 linux /proc 文件?

    我正在编写一个由用户程序和内核模块组成的程序 内核模块需要收集数据 然后将其 发送 到用户程序 这必须通过 proc 文件来完成 现在 我创建了文件 一切都很好 并且花了很长时间在互联网上寻找答案 但仍然找不到 如何读 写 proc 文件f
  • 比较不同文件中的列并打印那些不匹配的列

    我有两个文件 file1 和 file2 我想将 file1 的几列 1 2 3 和 4 与 file2 的几列 1 2 3 和 4 进行比较 并打印 file2 中与 file1 中任何行都不匹配的那些行 E g file1 aaa bb
  • I2C 驱动程序应如何在 ACPI 中与 HID PRP0001 匹配

    我正在尝试实例化这个传感器 https elixir bootlin com linux v5 2 source drivers iio proximity vl53l0x i2c c在 ACPI 中使用设备特定数据 即Name DSD 并
  • Linux bash 中波浪号的含义(不是主目录)

    首先 我知道 是主目录 CD 至 or 带我到主目录 然而 cd X带我去一个特别的地方 在那里X似乎是什么 在 bash 中 如果我点击 cd 然后点击选项卡 它会显示一堆可能的 X选项如 mail and postgres and ss
  • lseek() 的复杂度是 O(1) 吗?

    我知道我的问题在这里有答案 QFile 寻道性能 https stackoverflow com questions 6171403 qfile seek performance 但我对这个答案并不完全满意 即使在查看了以下实现之后gene
  • Vagrant、共享文件夹:利用 inotify 而非 NFS

    我们的 Symfony2 Web 应用程序在开发模式下使用 Assetic 观察器来动态重新编译资产 Web 应用程序在 Docker 容器中运行 该容器在 Vagrant VM Ubuntu 12 04 Precise 中运行 主机是 O
  • 在 CentOS 6.4 中意外删除了符号链接 libc.so.6。如何获得 sudo 权限来重新创建它?

    我不小心删除了符号链接 lib64 libc so 6 gt lib64 libc 2 12 so sudo rm libc so 6 然后我不能使用任何东西 包括ls命令 我输入的任何命令都会出现错误 ls error while loa
  • 反馈两个进程的stdin和stdout

    我有两个进程通过标准输入和标准输出相互连接 假设我有进程 A 和进程 B B 的标准输出需要输入到 A 的标准输入中 A 的标准输出需要输入到进程 B 的标准输出中 是否有一种简单的方法可以用简单的命令来表达这种关系 或者是否有一个基本的
  • 计算以某个单词开头的行数

    如何计算文本文件中以某个单词开头的行数 我不想使用sed进而wc l 有更好的解决办法吗 只需 grep 你的单词 然后使用 wc l 来计算行数 就像这样 grep your word path to file wc l
  • 如何获取子进程的返回值?

    程序计算从 1 到 N 的数字之和 子进程计算偶数之和 父进程计算奇数之和 我想在父进程中获取子进程的返回值 我怎么做 include
  • gcc 中“-l”选项的放置

    我在放置时遇到一些问题 l使用时的选项gcc 这是一个用于重现问题的精简版本 t c include
  • OpenSSL 和 CryptoJS SHA256 加密转换

    我的问题是 OpenSSL 的新版本与 CryptoJS 的默认设置不兼容 openssl enc 用于基于密码的密钥派生的默认哈希值 1 1 0 中更改为 SHA256 而较低版本中更改为 MD5 https unix stackexch
  • -bash:!/usr/bin/env:未找到事件[重复]

    这个问题在这里已经有答案了 我在尝试将 shebang 写入 python 脚本时收到此奇怪的错误消息 echo usr bin env python gt scripts sandbox py bash usr bin env event
  • 执行 grails/groovy 时,Linux 上没有可用的控制台输出

    当执行 groovy 脚本或 grails 应用程序时 没有可用的输出 输入 gt 只有一个清晰的控制台屏幕 即使不启动 X Window System 输出也是不可见的 我也尝试过 grailscompile plain output 也
  • 为什么链接器要修改--defsym“绝对地址”

    目标 一个使用可执行文件中的函数 不导出符号 的共享库 Means gcc Wl defsym function 0x432238 手册页指出 defsym symbol expression Create a global symbol
  • 删除损坏的链接 Unix

    我想删除损坏的链接 但在此之前我想确认目录中是否存在链接文件 我们来调用一下链接A if a A then print ya A is ther fi But if A链接已损坏 那么我该如何检查 find L type l找到损坏的符号链
  • 如何在生产环境中运行 spring boot 可执行 jar?

    Spring Boot 的首选部署方法是通过内部包含 tomcat 的可执行 jar 文件 它是从一个简单的开始java jar myapp jar 现在 我想将该 jar 部署到 EC2 上的 Linux 服务器上 我是否遗漏了某些内容
  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在
  • accept() 创建一个新套接字是什么意思?

    我的问题基于以下理解 套接字由 ip port 定义 服务器和客户端都有自己的套接字 Socket连接由五组server ip server port client ip client port protocol定义 套接字描述符是标识套接
  • 从该共享库中查找加载的共享库的位置?

    从共享库中的函数 在正在运行的进程 用 C 编写 内 我如何发现该共享库是从哪里加载的 我找到的所有答案都涉及使用诸如ldd在命令行中 或者通过查看 proc self maps 在 Win32 上 我只需使用GetModuleFileNa

随机推荐

  • 虚拟机上ubuntu-server的安装(详细完整版)

    一 安装 安装VMware 网上找Ubuntu的iso文件 桌面版的或者服务器版的都可以 Index of ubuntu releases 清华大学开源软件镜像站 Tsinghua Open Source Mirrorhttps mirro
  • 软件项目管理

    目录 前言 项目管理概述 项目与软件项目 项目管理与软件项目管理 项目管理知识体系 过程管理与软件项目管理的关系 软件项目管理过程 项目初始 项目确立 项目立项 项目招投标 项目授权 敏捷开发总结 scrum模型 迭代式增量软件开发过程 术
  • Apple:如何在iphone、ipad上安装一些常用命令行命令

    Apple 如何在iphone ipad上安装一些常用命令行命令 相信对Linux Unix比较熟悉的朋友 在iphone或 ipad越狱后发现通过Cydia可以安装OpenSSH 一定都想安装上并且通过ssh登录上去看看 但是登录后却发现
  • 推荐一些网络安全的网站和论坛

    今天小编给大家推荐一批网络安全的网站和论坛 想学习网络安全技术的朋友们可以去这些网站看看 1 红黑联盟 红黑联盟论坛 网址 bbs 2cto com 2 安全客 一个提供网络安全资讯的网站 网址 www anquanke com 3 T00
  • 【批处理DOS-CMD命令-汇总和小结】-CMD窗口的设置与操作命令-关闭cmd窗口、退出cmd环境(exit、exit /b、goto :eof)

    一 对exit命令和goto命令的基本认知 打印exit命令的帮助信息 执行命令 exit C Users Administrator gt exit 退出 CMD EXE 程序 命令解释器 或当前批处理脚本 EXIT B exitCode
  • php文件打印服务器,PHP打印到服务器端打印机

    我想用PHP打印到服务器端打印机 我发现了类似的示例代码 它们大多都使用相同的API函数来执行此任务 当我在我的服务器上运行它来测试它所说的代码时 PHP致命错误 调用未定义的函数printer open 所以我发现至少有三种不同版本的ph
  • keras.layers.Conv2D 与tf.layers.Conv2D 的兼容性: AttributeError: ‘tuple‘ object has no attribute ‘layer‘

    结论 keras layers Conv2D 与 tf layers Conv2D有相同的参数设置模式 keras layers Conv2D 可以兼容处理 tf layers Conv2D得到的tensor tf layers Conv2
  • 表示数值的字符串(含思路解答示意图)【剑指offer——JAVA实现】

    题目描述 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值 但是 12e 1a3 14 1 2 3 5 和 12e 4 3 都不是 解法一 思路 状态机
  • 三、react中类组件和函数组件

    简介 本篇我们只要介绍react中类组件与函数组件两种组件的写法 两者的优缺点 同时对在我们的项目开发中该使用类组件还是函数组件进行思考分析 废话不多说进入正题 类组件 设计思路 类组件时面向对象编程的思想 在其中我们去设计类组件时使用st
  • 【每日一题】leetcode 二叉树层序遍历 - 介绍

    层序遍历 遍历顺序为 F B G A D I C E H 一层一层遍历 代码 import java util ArrayList import java util LinkedList import java util List impo
  • 《软件调试的艺术》学习笔记——GDB使用技巧摘要(1)

    软件调试的艺术 因为名是The Art of Debugging with GDB DDD and Eclipse 作者是美国的Norman Matloff和Peter Jay Salzman 中文版由张云翻译 是人邮出版社图灵程序设计丛书
  • 机器学习2-线性回归

    一 矩阵求导公式 1 总体情况 2 分子布局 Numerator layout 和分母布局 Denominator layout 首先我们常说 y 对 x 求导 这里的 y 和 x 均默认为列向量 y为 mx1 x为 nx1 1 分子布局
  • stm32—外部中断、中断和事件的区别

    目录 EXTI 简介 EXTI 框图 1 中断的线路 1 2 3 4 5 2 产生事件线路 1 2 3 6 7 8 疑惑 中断和事件的区别 1 硬件级与软件级 2 事件不一定产生中断 外部中断 事件线映射 EXTI 配置步骤 初始化函数 E
  • sklearn:卡方分布输入不能是负数

    今天使用sklearn进行特征选择的时候出现一个错误 ValueError Input X must be non negative 找了stackoverflow 原来是卡方验证不能用于负值 卡方分布是通过统计当前变量的频次 和目标变量的
  • 【程序人生】底层程序员,出局

    底层程序员 出局 不如去送外卖 这是徐亮和同事们常开的一个玩笑 入职两三个月 最初的激情退去 在加完班的夜晚 他疲惫地躺在床上 经常自嘲式地想起这个玩笑 送外卖是搬运食物 自己是搬运代码 都不产出新的东西 在深圳 每个人都走得很快 这是徐亮
  • kafka的安装和使用

    ZooKeeper简介 ZooKeeper 是一个为分布式应用所设计的分布的 开源的 java 协调服务 分布式的应用可以建立在同步配置管理 选举 分布式锁 分组和命名等服务的更高级别的实现的基础之上 ZooKeeper 意欲设计一个易于编
  • C语言(二十一)

    1 查找指定字符 本题要求编写程序 从给定字符串中查找某指定的字符 输入 输入待查找的字符c以及字符串s 输出 找到则输出字符c在字符串s中所对应的最大下标index 否则输出 Not Found 优化目标 无 include
  • TCP/IP详解 卷1:协议 学习笔记 第二十九章 网络文件系统

    NFS 网络文件系统 使客户可以透明地访问服务器上的文件和文件系统 NFS的基础是RPC 两个常用的网络编程API socket和TLI 运输层接口 Transport Layer Interface 通信的双方可使用不同的API RPC可
  • 蚁剑的使用以及用蚁剑做一道ctf题

    一 蚁剑的介绍及下载 1 蚁剑是一款和菜刀相像的shell控制端软件 主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员 2 蚁剑的下载 这是gethub的官方下载地址 供大家下载 3 蚁剑的安装 点击初始化就完成安装 再次点
  • Linux进程管理:deadline调度器

    一 概述 实时系统是这样的一种计算系统 当事件发生后 它必须在确定的时间范围内做出响应 在实时系统中 产生正确的结果不仅依赖于系统正确的逻辑动作 而且依赖于逻辑动作的时序 换句话说 当系统收到某个请求 会做出相应的动作以响应该请求 想要保证