[Linux 进程(三)] 进程优先级,进程间切换,main函数参数,环境变量

在这里插入图片描述

文章目录

  • 1、进程优先级
    • 1.1 Linux下查看进程优先级
    • 1.2 Linux 进程优先级的修改
      • PRI and NI
      • top命令配合操作更改优先级
    • 1.3 竞争 独立 并行 并发
  • 2、进程间切换
  • 3、Linux2.6内核进程调度队列
    • 3.1 活跃进程
    • 3.2 过期进程
  • 4 main函数参数 — 命令行参数
    • 4.1 利用main函数的参数实现一个计算器
    • 4.2 模拟实现touch命令
  • 5、环境变量
    • 5.1 PATH的认识
    • 5.2 修改环境变量PATH
    • 5.3 HOME的认识
    • 5.4 如何获取环境变量

1、进程优先级

排队的本质就是确认优先级。
优先级是什么?它也是PCB中的一个整型字段数值越小,优先级越高。是得到某种资源的先后顺序。
Linux进程的优先级数值范围:60~99。
Linux中默认进程的优先级都是80。

为什么要有优先级?本质是资源不足。
谈到优先级,就不得不说我们以前学的权限,它两区别是什么呢?
权限是能不能得到某种资源。优先级是保证能申请到某种资源,只不过需要等一等。就如现实中,我们去吃饭,人很多,但是做饭师傅只有那么几个,看到能给你做好端上来,只不过是有顺序的,讲究先来后到。
Linux下进程的优先级概念:

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

1.1 Linux下查看进程优先级

首先我们先写一份C语言代码:

#include <stdio.h>
#include <unistd.h>

int main()
{
    while(1)
    {
        printf("I am process, pid: %d\n", getpid());
        sleep(1);
    }
    
	return 0;
}

编译运行,我们查看一下该进程的优先级

ps -la

在这里插入图片描述

Linux下进程的优先级是由两部分组成的:PRI(priority) + NI(nice)
那么优先级可不可以改呢? 可以,下面我们就学习一下怎么改。

1.2 Linux 进程优先级的修改

修改进程的优先级,并不是直接修改 PRI 而是修改NI值,从而达到修改PRI值的。

PRI and NI

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。
  • 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数。

这里修改PRI值的公式:PRI(new) = PRI(old) + nice

top命令配合操作更改优先级

输入top命令 -> 输入r -> 输入PID -> 输入nice值 就完成了进程优先级的修改,我们来试一下:
我们输入top后回车,来到此界面,再输入r后就提示我们输入PID
在这里插入图片描述

接下来我们输入PID:
在这里插入图片描述

输入完PID,它提示我们输入nice值,我们输入10:
在这里插入图片描述

完成后,按q退出。
我们来查看一下13312进程的优先级有没有被改:
在这里插入图片描述

我们可以看到进程的优先级已经被改,并且nice值确实也变了。修改后PRI值变大了,意味着进程优先级顺序变小了。
我们在此基础上来修改一下nice值,这次我们输入-10,看看优先级会如何变化:
在这里插入图片描述
这里显示将PID为13312的进程nice值设置成-10是不被允许的操作,这是怎么回事?
进程的优先级修改时,如果我们只是将优先级调小,普通用户身份就可以完成。但是如果我们想要调大,就需要以管理员身份/普通用户身份提权来操作,因此我们 top前加sudo 来操作。
在这里插入图片描述
在这里插入图片描述
这下确实能修改了,但是我们是在之前的基础上修改的呀,为什么nice值改为-10后,PRI值却是70呢?
因为每次修改PRI值的时候,PRI(old)值都是以80为基础,加上设置的nice值,得出的数值再赋给PRI(new)的。
我们再来试试,直接将nice设置为100,再看看PRI值会被改为多少。
在这里插入图片描述
在这里插入图片描述
这里我们发现,nice值并不是-100,而是-20,这又是为什么呢?
因为我们优先级最高是60,不管我们怎么去调整,最高60就限制了nice最小只能到-20,只要我们输入的nice值小于等于-20,都会被当-20来处理。
那么PRI的值最大是99,由此我们可以推测出,nice值最大被限制在19了,输入nice值大于等于19,都会被当作19来处理。

我们来测试一下:
在这里插入图片描述
在这里插入图片描述
确实不出我们所料呀。
我们看到有疑惑,为什么要把优先级限定在一定的范围内呢?
os调度的时候,要做到公平,较为均衡的让每一个进程都要得到调度。因为优先级可以改,用户恶意让自己的进程不断在最前面执行,那么容易导致优先级较低的进程,长时间得不到CPU资源,导致进程饥饿。
总结:

  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为: PRI(new)=PRI(old)+nice。
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
  • 所以,调整进程优先级,在Linux下,就是调整进程nice值。
  • nice其取值范围是-20至19,一共40个级别。
  • 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
  • 可以理解nice值是进程优先级的修正修正数据。

1.3 竞争 独立 并行 并发

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

调整系统优先级有很多方法,这里我们只说了这一种方式,我们学习了本质,有了底层的打底,操作再去学习就会变的简单了,并且轻易我们是不需要去改优先级的。

2、进程间切换

我们要知道,一个进程并不是占有CPU就一直运行,每隔一段时间,自动被从CPU上剥离下来,所以这就会存在进程切换的过程。
Linux内核支持进程之间进行CPU资源抢占的。
如果一个进程的PRI值是80,它正在CPU上运行,但是又来一个进程,它的PRI是60,意味着它需要被运行,这时就把PRI为80的进程拿下来,先让PRI为60的进程跑,可能此时时间还没到。
所以Linux调度的原则全程:基于时间片的轮转式抢占式内核。
CPU运行的时间特别快,我们感知不到,在一段时间内,进程是高速的的不断的切换,我们所感知到的进程是并发的。
问题: 进程切换的时候,可能一份代码并没有跑完,但是需要切换另外一个进程了,那下一次再运行此进程的时候,CPU怎么知道是从哪开始呢?
CPU中有寄存器,eip就是专门记录程序运行到哪一行的。
由此,我们也可以知道,一个CPU虽然只有一套寄存器硬件,但是寄存器的数据不仅仅是一套。寄存器 != 寄存器内容。并且进程切换后,进程的数据存在CPU的寄存器中。
在这里插入图片描述
问题: CPU内的寄存器数据保存在哪呢?
CPU内的寄存器数据保存在进程PCB中(简单理解),本质:CPU寄存器的内容,保存在内存中。
保存完之后,寄存器中的数据不会清空,下个进程被调度运行时,直接覆盖即可。

在这里插入图片描述

3、Linux2.6内核进程调度队列

这部分是选学,读者看自己情况来决定。
下图就是CPU维护的运行队列我们主要盯着蓝色框和红色框来看
在这里插入图片描述

3.1 活跃进程

首先,我们要知道,Linux下进程优先级范围为60~99共计40个等级,其次,运行队列是分活跃队列和过期队列,他们两个的功能后面我们就知道了。
在这里插入图片描述
CPU在运行时,会从上到下去扫描队列,优先级为n的位置不为空就会去运行它指向的PCB,为空就往后走,去找不为空的位置,直到遍历完队列。

3.2 过期进程

问题: 如果CPU正在运行队列中,运行优先级为99的进程,而现在一个优先级为70的进程加载进来,会直接放入活跃进程队列中,与正在运行的队列抢占资源吗?
肯定是不会的,如果我们不断加载进来进程,原本优先级低的进程,迟迟得不到CPU资源,导致进程饥饿!
所以新加载进来的进程,会先去过期进程数组按照优先级顺序排队。

在这里插入图片描述

在活跃进程数组没有被全部运行完时,CPU不会去调度过期进程的数组,这就保证了公平性。
当活跃队列的进程全部运行完后,CPU不是去过期进程数组调度,而是swap(active, expired),改变指向后,依然运行活跃进程数组。

由此我们也就知道,在进程间切换的时候,我们就是把换出的进程放入了过期进程的数组中,等待CPU下一次的调度。

4 main函数参数 — 命令行参数

main函数是有两个参数的,int argc,char* argv[]。
我们来介绍一下:

int main(int argc, char* argv[]);
// 这两个参数叫做命令行参数
// argv是一个数组,类型是char*,也就是指针数组
// argc表示这个数组的元素个数

我们现在还不知道这个数组中存放的是什么内容,我们在Linux下写一个main函数,打印一下数组内容看看:

#include <stdio.h>

int main(int argc, char* argv[])
{
	int i = 0;
    for( ; i < argc; i++)
    {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    
	return 0;
}

在这里插入图片描述
我们发现,它把我们的命令打印出来了,我们多写点看看如何。
在这里插入图片描述
这里原来是把我们的命令以空格分割开,存入到字符串指针数组中的!
在这里插入图片描述

问题: 那是谁把命令放入到数组中的?
将命令行输入的字符串放入数组是os干的。

4.1 利用main函数的参数实现一个计算器

既然main函数可以拿到命令行输入的字符串,那我们可以用其写出一个简易的计算器,代码如下:

#include <stdio.h>                                                                                                              
#include <string.h>
#include <stdlib.h>
 
int main(int argc, char* argv[]) // argc代表参数个数,argv是字符串数组参数
{
    // 简易版计算器
    if(argc != 4)
    {
        printf("Use Error!\nUsage %s op[-add|-sub|-mul|-div] d1 d2\n", argv[0]);
        return 0;
    }
 
    // 将字符数字转为
    int x = atoi(argv[2]);
    int y = atoi(argv[3]);
    int result = 0;
    // 你的程序一定有4个命令行参数,第一个是程序名
    if(strcmp("-add", argv[1]) == 0)
    {
        result = x + y;
        printf("%d + %d = %d\n", x, y, result);
    }
    else if(strcmp("-sub", argv[1]) == 0)
    {
        result = x - y;
		printf("%d - %d = %d\n", x, y, result);
    }
    else if(strcmp("-mul", argv[1]) == 0)
    {                                                                                                                           
        result = x * y;
        printf("%d * %d = %d\n", x, y, result);
    }
    else if(strcmp("-div", argv[1]) == 0)
    {
        if(y == 0) printf("%d / %d = error! div zero\n", x, y);
        else 
        {
            result = x / y;
            printf("%d / %d = %d\n", x, y, result);
    
        }
    }
    else 
    {
        printf("Use Error!\nThe second parameter should is [-add|-sub|-mul|-div] !\n");
        return 0;
    }

    return 0;
}

使用方法:
1、先输入可执行程序;
2、第二个字符串输入 -add/-sub/-mul/-div;
3、第三个,第四个输入操作数;
在这里插入图片描述

4.2 模拟实现touch命令

在使用完我们写的计算器后,有没有感觉到,跟我们的Linux下指令很类似。
比如:ls命令,我们可以配选项:ls -l -a。
这些指令就是用C语言写的,加上一些选项在显示器上显示不同结果,它们的本质不就是用到了命令行参数么。
下面我们自己在实现一份touch指令代码:

#include <stdio.h>

int main(int argc, char* argv[])
{
    if(argc != 2) // 输入的字符串不规范
    {
        printf("touch missing file operand!\n");
        return 1;
    }

    FILE* fp = fopen(argv[1], "w"); // 以"w"方式打开,当文件不存在时,会自动创建                                                
    if(fp != NULL)                                          
        fclose(fp);                                         
                                                            
    return 0;                                               
}        

我们使用自己写的touch来创建文件试一下:
在这里插入图片描述

5、环境变量

系统中有很多的环境变量,我们可以使用 env 命令来查看一下:
在这里插入图片描述
其他我们不知道,今天我们挑着来学几个。

5.1 PATH的认识

我们命令行参数算是学明白了,但是大家有没有想过这样几个问题。
问题:

  • 为什么我们写出来的程序在执行的时候需要加 ./
  • 为什么在执行系统的指令的时候不需要加 ./

执行一个程序的前提是先找到这个可执行程序我们写的程序在执行的时候,加上 ./ 本质是告诉bash在当前目录下找该程序。
系统指令也是 C/C++ 写出来的程序,那为什么系统指令不需要加呢?
一般的系统指令我们可以直接用,也可以加上它的路径执行:
在这里插入图片描述
这里系统指令不用加 ./ 就得提一下一个概念了:环境变量。
记录系统当中默认搜索路径的环境变量叫做:PATH(一般环境变量名是全大写的)。
在执行系统指令时,系统会去PATH中找当前的可执行程序在不在这些路径中,如果在正常执行,不在就报错。
查看环境变量内容指令:

echo $xxx  // 例如查看PATH,echo $PATH

在这里插入图片描述

这些路径按 : 分割开
先在/usr/local/bin找,没有去下一个路径找,找到执行,没找到继续下一个,找完都没有就返回错误信息。
因为我们自己的可执行程序并不在这些路径中,所以我们的可执行程序在执行的时候需要加上 ./ 来执行。

5.2 修改环境变量PATH

想要我们自己的程序像系统指令一样运行,我们可以将可执行程序的路径追加到环境变量PATH中去!
命令如下:

PATH = $PATH:要添加的路径

注意: 这里不能直接等于要添加的路径,直接等于就会覆盖掉原本的PATH,因为我们要按照上面追加的形式的来写。
在这里插入图片描述
此时,我们再去运行我们自己的mytouch程序就不用再带 ./ 了。我们来试试:
在这里插入图片描述
注意: 默认更改环境变量,只限于本次登录,重新登陆,环境变量自动被恢复。想要一劳永逸,可以将自己的可执行程序放入到默认的路径中这个过程就做程序安装)。

5.3 HOME的认识

问题: 大家有没有疑惑过,我们在登录xshell的时候,我们以不同身份登录,进入的是不同的目录呢 ?
在这里插入图片描述
问题:

  • 凭什么普通用户,登录后默认所处的目录是/home/XXX ?
  • 凭什么root,登录后默认所处的目录是/root ?

因为系统中有一个环境变量HOME,在我们输入用户名与密码的时候,识别出登录者身份,初始化HOME,它能识别出登录者是普通用户还是root,并完成正确的初始化。
在这里插入图片描述
系统在登录的最后一刻,cd HOME所记录的路径,因此就实现了不同身份,进入不同的目录。
总结:
1、输入用户名 && 密码;
2、认证;
3、形成环境变量(不止一个);
 3.1 根据用户名,初始化 H O M E = / r o o t , HOME=/root, HOME=/rootHOME=/home/XXX
4、最后,cd $HOME。

5.4 如何获取环境变量

我们知道了环境变量,以及查看环境变量命令,加之对HOME这个环境变量的学习后
我们明白了,系统中会存在大量的环境变量,每一个环境变量都有自己的特殊用途,用来完成特定的系统功能!
问题: 那么如何获取环境变量呢?
我们这里讲一个函数,getenv(),并配合一个场景来讲。
在这里插入图片描述

这里讲了,getenv()函数是以变量名来查找的,返回相应的字符串指针。
我们是不是可以按照用户名来对用户做甄别,不同用户去执行不同的代码。
假如,我们写一段代码,只想让root来执行,普通用户不能执行:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char* user = getenv("USER"); // 获取环境变量USER的内容
	if(strcmp(user, "root") == 0)
    {
        printf("myself command!\n");
    }
    else
    {
        printf("%s是一个非法用户!\n", user);
    }
    
	return 0;
}

编译后我们以普通用户身份运行:
在这里插入图片描述
我们再切换到root身份运行:
在这里插入图片描述在这里插入代码片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/318539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

golang实现rpc方法二:使用jsonrpc库【跨平台】

首先在golang实现rpc方法一net/rpc库中实现了RPC方法&#xff0c;但是那个方法不是跨平台的&#xff0c;没法在其他语言中调用这个实现的RPC方法&#xff0c;接下来我们可以通过jsonroc库实现跨语言的RPC方法。俩种实现方式的代码其实也是差不多的&#xff0c;大差不差&#xf…

Spark---累加器

1.累加器实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中定义的变量&#xff0c;在Executor 端的每个 Task 都会得到这个变量的一份新的副本&#xff0c;每个 task 更新这些副本的值后&#xff0c;传回 Driver 端进行 merge。 //建立与Spark框架…

wpf使用Popup封装数据筛选框

(关注博主后,在“粉丝专栏”,可免费阅读此文) 类似于DevExpress控件的功能 这是DevExpress的winform筛选样式,如下: 这是DevExpress的wpf筛选样式,如下: 这是Excel的筛选样式,如下: 先看效果 本案例使用wpf原生控件封装,功能基本上都满足,只是颜色样式没有写…

扫描电镜技术在材料科学中的应用及发展趋势

在材料科学领域&#xff0c;扫描电镜技术扮演着极为重要的角色&#xff0c;广泛应用于多种材料形态结构、界面状况、损伤机制和材料性能预测的研究。本文将深入探讨扫描电镜技术的结构、主要性能、工作原理、试样制备技术以及在不同领域的应用。 第一部分&#xff1a;扫描电镜…

【现代密码学】笔记4--消息认证码与抗碰撞哈希函数《introduction to modern cryphtography》

【现代密码学】笔记4--消息认证码与抗碰撞哈希函数《introduction to modern cryphtography》 写在最前面4 消息认证码与抗碰撞哈希函数MAC概念回顾&#xff08;是的&#xff0c;我忘记这些缩写是什么了。。&#xff09;MAC的定义适应性CMA&#xff08;Chosen Message Attack&a…

Android json功能解析

1. 简介 JAVAScript Object Notation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;。  JSON采用兼容性很高的文本格式&#xf…

Python | 四、链表

为什么需要链表 在Python中&#xff0c;引入链表这一结构没有像C等语言那样有很多好处&#xff0c;因为Python里的列表和字符串结构已经十分灵活且大小可变&#xff0c;仍保留的好处如下&#xff1a; 列表、字符串等结构是连续存储的&#xff0c;因此如果有一块较小的内存区域…

QuEra 10,000个物理量子位和100个逻辑量子位的量子计算机2026

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

mongoose6.0版以上操作mongodb数据库的基本使用

1、介绍 Mongoose 是一个对象文档模型库&#xff0c;官网 http://www.mongoosejs.net/ 2、作用 方便使用代码操作 mongodb 数据库 3、使用流程 3.1、链接数据库 //1. 安装 mongoose---> npm install mongoose --save//2. 导入 mongoose const mongoose require(&quo…

网络安全B模块(笔记详解)- 网络渗透测试

LAND网络渗透测试 1.进入虚拟机操作系统:BT5中的/root目录,完善该目录下的land.py文件,填写该文件当中空缺的Flag1字符串,将该字符串作为Flag值(形式:Flag1字符串)提交;(land.py脚本功能见该任务第6题) 输入flag sendp(packet) Flag:sendp(packet) 2.进入虚拟机操作…

鸿蒙Harmony-PersistentStorage--持久化存储UI状态储详解

用简单的心境&#xff0c;对待复杂的人生&#xff0c;方能看淡得失&#xff0c;从容入世&#xff0c;潇洒自如&#xff0c;心变得简单了&#xff0c;世界也就简单了 目录 一&#xff0c;定义 二&#xff0c;限制条件 三&#xff0c;使用 一&#xff0c;定义 LocalStorage和App…

Open3D AABB包围盒计算与使用(19)

Open3D AABB包围盒计算与使用(19) 一、算法速览二、算法实现1.代码2.结果少年听雨歌楼上。红烛昏罗帐。壮年听雨客舟中。江阔云低、断雁叫西风。 而今听雨僧庐下。鬓已星星也。悲欢离合总无情。一任阶前、点滴到天明。 一、算法速览 AABB包围盒就是将点云用一个各条边沿着坐…

Android Studio 虚拟机 Unknown Error 解决

前言 尝试了网上很多解决方式&#xff0c;但很遗憾&#xff0c;都没效果&#xff1b; 于是我就想啊&#x1f914;&#xff0c;虚拟机属于SDK的一部分&#xff0c;那有没有一种可能&#xff0c;是SDK出了问题&#xff1b; 于是我就换了新的SDK&#xff0c;结果 ---- 完美解决…

halcon学习-blob分析统计木材个数

本文用到的主要算子简单介绍如下&#xff1a; 1、矩形结构开运算opening_rectangle1(); 2、圆形结构腐蚀运算erosion_circle(); 3、统计非连通区域个数count_obj(); 4、合并非连通区域concat_obj(); *读取图像 read_image(image,../wood.jpg) *图像转灰度 rgb1_to_gray(image,…

爬虫补环境jsdom、proxy、Selenium案例:某条

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、简介 爬虫逆向补环境的目的是为了模拟正常用户的行为&#xff0c;使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…

《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)

1.简介 通过前边的讲解和学习&#xff0c;细心认真地小伙伴或者童鞋们可能发现在Playwright中&#xff0c;没有Element这个概念&#xff0c;只有Page的概念&#xff0c;Page不仅仅指的是某个页面&#xff0c;例如页面间的跳转等&#xff0c;还包含了所有元素、事件的概念&#…

大数据仓库开发规范示例

大数据仓库开发规范示例 一、前提概要二、数仓分层原则及定义2.1 数仓分层原则2.2 数仓分层定义 三、数仓公共开发规范3.1 分层调用规范3.2 数据类型规范3.3 数据冗余规范3.4 NULL字段处理规范3.5 公共字段规范3.6 数据表处理规范3.7 事实表划分规范 四、数仓各层开发规范4.1 分…

Linux配置JAR包为服务实现自启动

一、实现bash脚本 1.1 绘图工具 绘图需安装idea的插件plantUML-Integration 只需要上图一个就可以&#xff0c;别的也不需要装。 启动服务的逻辑如下 关闭服务的逻辑如下 1.2 逻辑实现 在/root路径下创建entrance文件&#xff0c;实现逻辑如下 #!/usr/bin/env bash # 2>…

【120版本】最新谷歌浏览器驱动下载地址

在使用selenium时可能会遇到谷歌浏览器和谷歌驱动器版本不一致的问题&#xff0c;并且国内可以搜到的谷歌浏览器下载地址里面最新的驱动器只有114版本的&#xff0c;但目前谷歌浏览器最新版本是120。所以这里记录下最新版本120谷歌驱动器下载地址&#xff1a; Chrome for Test…

spark中Rdd依赖和SparkSQL介绍--学习笔记

1&#xff0c;RDD的依赖 1.1概念 rdd的特性之一 相邻rdd之间存在依赖关系&#xff08;因果关系&#xff09; 窄依赖 每个父RDD的一个Partition最多被子RDD的一个Partition所使用 父rdd和子rdd的分区是一对一&#xff08;多对一&#xff09; 触发窄依赖的算子 map()&…
最新文章