当前位置: 首页 > news >正文

并发程序设计

一、进程的创建和回收

一、进程的概念

1、进程!=程序

程序是静态的,而进程是动态的 

2、进程和程序的区别

1)进程控制块中包含进程的属性

2)程序在磁盘里面,堆栈都是在内存中,程序运行起来都在内存中

3)进程的运行在内存(RAM)中,手机内存指的是运行内存64G,电脑内存指的是硬盘(ROM)

4)初始化的全局变量在数据段,没有初始化的全局变量放在BSS中

代码段存放可执行文件,机器码

5) static声明的变量不在栈中,和全局变量放在一起

栈:参数,返回值,局部变量

堆:malloc

6)一个进程会被分为不同的区域

7)进程控制块(pcb):

PID、进程用户、进程状态、优先级、文件描述符表

3、进程的类型

1)交互最常用,前台运行,在shell下可以控制

2)批处理

3)守护进程,一直在后台运行,不能用shell命令控制

4、进程的状态

二、进程常用的命令

1、查看进程信息

1)ps当前状态下的进程

2)ps -e当前状态下Linux所有的进程

3)ps -elf Linux下进程的详细信息

4)进程状态

5)进程标志

6)ps下的目录含义

PID:进程ID

CMD:进程的名称

NI:进程优先级

PRI:进程优先级

SZ:占用内存

C:占用的CPU利用率

7)ps -elf|grep PID

查看某个进程

2、top实时查看进程信息

1)翻页shift+'<'(前翻页)或'>'(后翻页)

2)top -p PID查看某个进程

3)ctrl+c退出

3、/proc查看进程的某个目录

4、nice命令

越nice优先级越低

 1)一般nice只能调高

2)只有root才能设置为负值

3)nice打开一个进程,设置优先级

4)renice改变优先级

5、

6、前台和后台的区别

1)当./test运行时:

ctrl+C:结束前台运行

2)ctrl+Z:此时程序进入停止状态

3)jobs查看后台进程,这时进程已经在后台

4)bg将挂起的进程在后台运行

5)fg+序号

进程又重新挂到前台

7、ctrl+Z:把运行的前台进程转为后台并停止

8、./test &进入后台运行 

*三、创建子进程

(一)创建子进程

1、子进程的概念

在Linux下除了0号进程,其他的进程都是由别人创建的

2、创建子进程

让我们的进程创建子进程

1)代码

子进程B的代码和A的代码相同

但子进程B只执行程序中fork函数之后的代码

2)打印结果

父进程子进程分别打印

3)如何让父子进程分别执行

(二)父子进程

1、子进程只执行fork之后的代码

2、父子进程执行顺序是操作系统决定的

 3、父子进程的关系

(三)结束进程

4、若父进程先结束,被init进程收养,子进程变成后台进程

1)分别对父子进程加一个sleep

父子进程随机

子父进程ID

2)kill掉父进程

子进程的父进程变成了2107,也就是init

子进程变成后台进程

5、如果子进程先结束,父进程没有来得及回收,子进程变成僵尸进程

kill掉父进程

此时kill掉父进程,子进程消失

四、子进程进阶

1、孙进程

子进程也进行了for循环 

解决办法:子进程执行结束break

五、进程的退出

exit会刷新缓冲流-库函数-<stdlib.h>

_exit不会刷新缓冲流-系统调用-<unistd.h>

1、main函数return会隐式调用exit

两个结果相同,其他函数return只是返回上一级

2、exit:

两个结果相同

3、_exit:没有刷新流缓冲区

六、进程的回收

*(一)wait-回收并查看子进程的情况

1、status和结束返回2的进程不同

2、16进制打印200不是2

3、用宏来取得进程的返回值

4、父进程对子进程的回收

1)不回收

2)回收

僵尸进程:子进程结束,但是没有被父进程回收

*(二)waitpid

1、

2、指定pid

3、WNOHANG不阻塞,直接执行,如果当前子进程还未结束,则会出错

出错:

修正:休眠2秒,等子进程结束

二、exec函数族

一、exec函数族的执行过程

1、父进程的父进程是shell

2、函数族-有很多个函数

3、通过调用exec函数族执行某个程序

4、调用exec函数族进程当前内容被指定的程序替换

5、相当于父子进程执行不同程序

二、execl函数和execlp函数

1、execl-需要写全部路径

相当于命令“ls -a -l”

2、execlp-不需要写全部路径

执行效果和execl相同

三、execv函数和execvp函数

1、execv-全部路径-将命令定义成数组

2、execvp-不需要全部路径-数组

四、system函数

1、system的实现

五、exec函数族特点

1、exec函数族-进程当前内容被指定内容替换,exec函数以后的程序没有被执行

2、第0个参数不使用但是要写

3、父子进程执行不同程序

三、GDB调试

一、GDB调试多进程程序

1、想要用GDB调试,编译加-g

gcc -g -o 文件名

2、进入gdb调试:gdb 可执行文件

3、quit 退出

4、start开始调试

5、n进入下一步

6、默认跟踪父进程

1)set follow-

显示可以跟踪的进程

2)set follow-fork-mode

可以继续选择跟踪父子进程

3)跟踪孩子

set follow-fork-mode child

4)同时调试父子进程

调试子进程,同时可以切换父进程

5)切换调试的进程

查看可以运行的进程

从进程5切换到了进程1

7、调试多进程

四、守护进程

一、守护进程的概念

1、守护进程是后台进程,始终后台运行

2、守护进程独立于终端

3、

1)进程组:

2)会话:一个终端界面可以理解成一个会话

3)控制终端-就是终端

4、

5、守护进程是孤儿进程

6、守护进程的创建

1)创建子进程,然后令子进程变成孤儿进程,被init收养,变成后台进程

此时子进程已经被init收养

2)创建会话-setsid

称为新的会话组长

自己当家做主人了 

3)改变工作目录-不被之前的父进程目录局限

4)重设掩码-创建文件权限(不是必须的)

5)关闭打开的文件描述符 

关闭文件描述符后,不会在打印到屏幕

守护进程不能在屏幕上打印东西,不能接收键盘的输入

7、nohup ./test.c &:将前台进程转为后台进程

没有写守护进程变成后台的方法

二、守护进程的实现

五、线程的创建和参数传递

一、线程的基本特点

1、线程共享相同的地址空间

共享全局变量

2、线程是在windows下创建的,被Linux引用,Linux不分线程和进程

3、线程的特点

4、线程共享资源

常用:静态数据、文件描述符、工作目录

5、  线程的私有资源

常用:错误号、堆栈

二、使用pthread库函数创建线程

线程不是通过Linux内核实现,而是由线程库来实现

2、创建线程

三、常见编译错误及处理方法

链接错误

四、线程的运行特点

1、线程创建需要时间,如果主进程退出,线程不能得到执行,马上退出

主进程退出,创建的线程也会退出

2、sleep 1秒,线程创建成功

五、线程id的获取

1、线程的退出

2、pthread_exit()函数-常用于清理线程

3、打印tid

1)主函数中,直接获取

2)pthread_self()函数-函数中获得自己的id

4、打印pid

**六、线程的参数传递

1、通过地址传递参数,注意类型转换

void定义下的arg是任意类型,直接转换成Int类型

2、也可以值传递-可能会报警,需要程序员自己保证数据长度正确

3、建立多个线程

七、段错误的原因及处理方法

六、线程的回收及内存演示

一、pthread_join与pthread_exit

相当于进程中的wait函数

1、pthread_join主函数对线程的回收-阻塞函数,线程没有回收则等待

2、pthread_exit 线程结束函数

二、常见的编译错误

三、pthread_join函数特点

1、一个缺点,如果是单线程回收方便,循环创建多线程,如果最开始的线程没有结束,pthread_join也会阻塞

四、线程分离pthread_detach

1、线程主动与主控线程断开关系,自己可以回收,不需要pthread_join

2、pthread_detach使用

在主函数中:

不阻塞

在线程函数中:

3、线程属性分离

4、回收线程的三种方式

1)pthread_join(局限)

2)pthread_detach

3)创建线程时分离属性

五、线程回收内存演示

查看内存命令: top -p 进程号

线程回收前

等待线程回收后

七、线程的取消和清理

一、pthread_cancel与线程取消点

1、查看线程-L大写

ps -eLf |grep detach

2、杀掉线程

1)必须有取消点-阻塞

2)gdb命令:bt-打印调用栈

二、GDB调试段错误

三、pthread_testcancel手动设置取消点

1、线程取消需要取消点

2、如果不确定有没有取消点,可以手动设置一个取消点

四、 pthread_setcancelstate设置取消属性

1、取消取消点

2、恢复其他地方取消点

3、主函数中的sleep

4、

五、线程清理

1、如果线程申请了一块内存,但线程因为阻塞被取消,则会造成内存泄露

2、线程清理是在线程异常退出之后,进行清理

3、线程的清理函数本质上是宏定义,必须成对使用

push-pop

4、

return可以结束线程,但是不能出发清理函数

5、可以cancel自己

两种情况:

1)到取消点取消,取消点之前可以取消

2)立即取消

八、**互斥锁/读写锁/死锁

一、互斥锁的概念和使用

(一)临界资源

1、临界资源是只允许一个资源访问的任务,互斥资源

2、外设、磁盘都是临界资源

3、临界区是访问临界资源的代码

(二)互斥机制

1、动态初始化创建

2、静态方式创建

3、锁的销毁

4、互斥锁的使用

5、申请锁

1)两个函数的区别

6、释放锁

*(三)互斥锁

1、创建两个线程,打印字符到文件中

主函数:

1.txt:两个线程随机打印,乱序

2、使用静态方式定义互斥锁

1)初始化互斥锁

2)添加互斥锁

3)添加了互斥锁之后的1.txt

4)如果线程执行多个任务,例如多个文件的写操作,需要定义多个互斥锁

二、读写锁概念和使用

1、读写锁-提高线程的读写速度-可同时读

2、防止读的时候有线程写入

3、同一时刻只有一个线程可以获得写锁,同一时刻可以有多个线程获得读锁

4、代码

1)在主函数中定义读写锁

2)结构体变量声明

3)加锁

4)结果与互斥锁相同

结论:读写锁与互斥锁结果相近

5、读写锁-只读

读写锁比互斥锁好的地方是,读写锁可以允许写的时候读

三、死锁的避免

1、死锁的概念

2、死锁都是在一把锁的情况下

3、代码

1)设置两把锁,两个线程同时调用两个资源

2)解决办法

延长休眠时间

1、使用一把锁,锁越少越好

2、获得1,2的先后顺序相同

九、条件变量的使用及注意事项

一、条件变量基本使用
1、线程等待某个资源时,休眠,提高运行效率
2、条件变量函数
1)等待资源
2)信号
3、步骤
1)初始化条件变量
2)定义互斥量
3)生产者
4)消费者
2、代码
1)主函数
2)生产者
3)消费者
4)准备条件
结果:
3、一定要和互斥锁使用
二、条件变量使用注意事项

十、线程尺及gdb调试多线程

一、线程池的概念

1、一般线程创建使用完都会被回收

2、线程的创建和销毁>线程的执行,时间不划算

3、线程池的结构

1)任务队列

2)线程池工作线程

二、线程池的实现

三、线程的GDB调试

1、主函数

2、设置断点 b

3、run运行程序

4、info thread查看线程

5、切换线程

6、下一步next

7、执行完一个线程后再次查看,线程消失

8、

9、设置线程锁

设置之后,除了选定的线程,其他不执行

10、切换到第3个,第6行断电

十一、有名管道和无名管道

一、无名管道基础

(一)进程间通信方式

**(面试题)1、进程间通信的方式

1)无名管道-亲缘进程

2)有名管道

*3)信号

4)共享内存

5)套接字-网络-进程间通信

进程-进程/主机-主机

开销最大

6)古老

(二)无名管道的特点

1、概念

相当于共享内存,通过管道传递消息

2、特点

1)只能父子或兄弟

2)单工通讯-固定读端和写端

2)创建两个文件描述符

3、无名管道的创建

单工通信-每个进程fd[0]和fd[1]只能用一个

(三)无名管道的创建

父子进程间的通信:

只有读操作之后才能打印buf

二、无名管道进阶

1、父进程创建了无名管道

2、子进程进程描述符相同

3、关闭管道

父子进程都可以关闭读写管道,无论这一段是读还是写

4、在同一个进程自己读和自己写是进行不了的

子进程之间相互通信:

5、管道可以用于大于两个进程的共享

6、可以两个子进程读/写,父进程写/读

7、无名管道的读写特性

管道大小是64K

三、有名管道概念和使用

(一)有名管道的特点

1、通过文件系统,但是文件不是放在磁盘,放在内存中,通过文件IO

2、有名管道的特点

(二)有名管道的创建

1、有名管道的创建

路径不能是Linux和wins共享目录

2、直接创建在根目录下

(三)有名管道的读写

1、写进程代码:

2、读进程代码:

读写结果:

四、有名管道的注意事项

1、不能使用读写方式打开文件

2、文件可以创建在根目录下,但是不能创建在共享目录下

3、默认情况下只写O_RDWR和只读O_RDONLY参数是阻塞的,加了第二个参数,不会阻塞,没有内容可读,直接退出

一个参数阻塞:

两个参数:

读文件:没有内容直接报错

有内容读内容

写文件:打开失败

相关文章:

并发程序设计

一、进程的创建和回收 一、进程的概念 1、进程&#xff01;程序 程序是静态的&#xff0c;而进程是动态的 2、进程和程序的区别 1&#xff09;进程控制块中包含进程的属性 2&#xff09;程序在磁盘里面&#xff0c;堆栈都是在内存中&#xff0c;程序运行起来都在内存中 3…...

openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换

文章目录 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换104.1 操作场景104.2 前提条件104.3 注意事项104.4 操作步骤 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换 openGaus…...

react仿照antd progress实现可自定义颜色的直角矩形进度条

可传颜色、带滑块的直角进度条 很歹毒的UI设计&#xff08;真的很丑&#xff09; 实现&#xff1a; class RankProgress extends React.Component {render() {const { percent, progressColor } this.props;return (<div className{styles.progress}><div classNam…...

【网络安全】被恶意攻击的IP地址有多可怕?

被恶意攻击的IP地址可以导致一系列问题&#xff0c;其严重性和可怕程度取决于攻击的性质、目标、攻击者的动机以及受影响的系统或组织。以下是一些可能出现的问题和可怕性的因素&#xff1a; 数据泄露和盗窃&#xff1a;攻击者可能试图入侵系统&#xff0c;窃取敏感数据&#x…...

Guava-RateLimiter详解

简介&#xff1a; 常用的限流算法有漏桶算法和令牌桶算法&#xff0c;guava的RateLimiter使用的是令牌桶算法&#xff0c;也就是以固定的频率向桶中放入令牌&#xff0c;例如一秒钟10枚令牌&#xff0c;实际业务在每次响应请求之前都从桶中获取令牌&#xff0c;只有取到令牌的请…...

【C++11】右值引用、移动构造、移动赋值、完美转发 的原理介绍

文章目录 一、概念1.1 左值1.2 左值引用1.3 什么是右值&#xff1f;1.4 什么是右值引用&#xff1f;对于参数左值还是右值的不同&#xff0c;是被重载支持的左值引用的使用场景 和 缺陷 二、移动语义2.1 移动拷贝构造2.2 移动赋值 三、右值引用 与 STL3.1 移动拷贝构造 和 赋值…...

Python【理解标识符的定义】

标识符是用来表示变量、函数、类、模块等命名实体的名称。它是由字母&#xff08;大小写均可&#xff09;、数字和下划线组成的字符串&#xff0c;遵循一定的命名规则和约定。以下是标识符的定义&#xff1a; 标识符必须以字母&#xff08;大小写均可&#xff09;或下划线(_)开…...

AR智能眼镜主板设计方案_AR眼镜PCB板设计

AR智能眼镜是一种采用先进技术的创新产品&#xff0c;具备强大的功能和性能。它采用了MTK8788八核 12nm低功耗硬件平台&#xff0c;搭载IMG GE830063OMhz或以上的GPU&#xff0c;并运行Android 11.0或以上的操作系统。该眼镜支持光波导1080P显示和LVDS接口自由曲面显示&#xf…...

【SA8295P 源码分析 (三)】79 - AIS Camera Event 事件处理函数 AisEngine::EventHandler() 源码分析

【SA8295P 源码分析】79 - AIS Camera Event 事件处理函数 AisEngine::EventHandler 源码分析 一、AIS Camera Event 事件处理函数 AisEngine::EventHandler()二、AisEngine::ProcessEvent() 函数负责处理哪些 Event 事件?三、pEngine->m_eventHandlerSignal 事件什么情况下…...

Web安全测试详解

前言 随着互联网时代的蓬勃发展&#xff0c;基于Web环境下的应用系统、应用软件也得到了越来越广泛的使用。 目前&#xff0c;很多企业的业务发展都依赖于互联网&#xff0c;比如&#xff0c;网上银行、网络购物、网络游戏等。但&#xff0c;由于很多恶意攻击者想通过截获他人…...

react配置 axios

配置步骤&#xff08;基本配置&#xff09;&#xff1a; 1.安装 axios cnpm install axios --save2.src/utils 新建一个 request.js文件(没有utils就新建一个目录然后再建一个request.js) 3.request代码如下&#xff1a; 这个是最简单的配置了&#xff0c;你可以根据自己的需…...

【图解RabbitMQ-5】RabbitMQ Web管控台图文介绍

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

GoogleNet论文精读

论文名&#xff1a;Going depper with convolutions论文下载地址&#xff1a;https://github.com/jixiuy/paper引言第一段&#xff1a;背景成绩1*1的卷积在channel上升维和降维&#xff0c;channel融合&#xff0c;计算方法上等价于FNNGAP&#xff08;全局平均池化&#xff09;…...

智能指针shared_ptr简介及小例子

shared_ptr是一种智能指针&#xff0c;用于处理动态分配的对象。它提供了一种引用计数的机制&#xff0c;当没有任何其他shared_ptr指向一个对象时&#xff0c;该对象将被自动删除。 shared_ptr的作用类似于常规指针&#xff0c;但有一些额外的功能。它能够记录有多少个shared…...

机器人精确移动包

move_near 之前有写过, 将ROS官方的move_basic包改写成了python形式, 同时将它写成了一个完整的action接口 最近测试时发现了问题, odom的数据波动可能会导致机器人陷入正反馈从而一直移动 具体表现为: 机器人移动精度设置为0.005 [m] 机器人在移动到接近0.005的位置, odom…...

强化学习环境报错解决

问题&#xff1a;nameerror: name ‘glpushmatrix‘ is not defined 解决&#xff1a;更换pyglet包的版本。pyglet2.0a4会报这个错误&#xff0c;把版本换成pyglet1.5.27即可。 问题&#xff1a;安装了gym和ale-py但是还是找不到模型&#xff0c;报错ModuleNotFoundError: No…...

Ganache本地测试网如何在远程环境中进行访问和操作

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…...

Kotlin中的函数分类(顶层、成员、局部、递归等)

在 Kotlin 中&#xff0c;函数可以按照不同的方式进行分类。在本篇博客中&#xff0c;我们将介绍以下几种常见的函数分类&#xff0c;并提供示例代码进行演示。 顶层函数&#xff1a; 顶层函数是指定义在文件中的函数&#xff0c;不依赖于任何类或对象。它们可以在文件的任何…...

字符串排序程序

字符串排序程序&#xff0c;对一个字符串中的数值进行从小到大的排序 例如排序前给定的字符串为" 20 78 9 -7 88 36 29" 排序后&#xff1a; -7 9 20 29 36 78 88 要求使用包装类对数值类型的字符串转换成整型进行排序。 public class StringSort {public static vo…...

功率放大器在材料测试中的应用有哪些

功率放大器在材料测试中有广泛的应用&#xff0c;尤其在材料的物理、电子和热学性质等方面的研究中起到了重要的作用。下面Aigtek安泰将详细介绍功率放大器在材料测试中的一些主要应用。 电学特性测试&#xff1a;功率放大器用于材料的电学特性测试&#xff0c;如电导率、介电常…...

汽车屏类产品(一):流媒体后视镜Camera Monitoring System (CMS)

前言: CMS,有叫电子侧视镜,虚拟倒车镜,电子倒车镜, 电子取代镜等,ISO 国际标准组织称其为摄像头监控系统。电子后视镜由“摄像头+屏幕”组成,汽车外后视镜经历了光学镜面从平面镜到曲面镜的迭代进步,CMS也实现从商用车到乘用车的过渡。显示模式为外部摄像头采集图像,…...

三元组(C++ 实现矩阵快速转置)

三元组稀疏矩阵是一种高效存储稀疏矩阵的方法。它通过记录矩阵中非零元素的行、列和值来表示一个稀疏矩阵。我们在三元组里存储的是每个元素的行、列以及值。 题目&#xff1a; 任意输入一个稀疏矩阵M&#xff0c;用三元组顺序表压缩存储该稀疏矩阵M&#xff0c;然后求其转置矩…...

Apriori(关联规则挖掘算法)

关联规则分析 事务库 上表所示的购物篮数据即是一个事务库&#xff0c;该事务库记录的是用户行为的数据。 事务 上表事务库中的每一条记录被称为一笔事务。在购物篮事务中&#xff0c;每一次购物行为即为一笔事务&#xff0c;例如第一行数据“用户1购买商品A,B,C”即为一条事…...

new Object()到底占用几个字节

Java内存模型 对象内存中可以分为三块区域&#xff1a;对象头(Header)&#xff0c;实例数据(Instance Data)和对齐填充(Padding)&#xff0c;以64位操作系统为例(未开启指针压缩的情况)Java对象布局 如下图所示&#xff1a; 其中对象头中的Mark Word中的详细信息在文章synchr…...

瞬态抑制二极管TVS的工作原理?|深圳比创达电子EMC(上)

TVS二极管具有响应速度快、漏电流小、钳位电压稳以及无寿命衰减的特性&#xff0c;从小到信号线静电防护&#xff0c;大到电力系统抗雷击浪涌&#xff0c;TVS都发挥着至关重要的作用。本章对瞬态抑制二极管TVS工作机理展开分析&#xff0c;供产品选型参考。接下来就跟着深圳比创…...

Nginx 同一端口 同时支持http与https 协议

文章目录 需求分析 需求 通过 nginx &#xff0c;让同一端口 同时支持http与https 协议 分析 通过使用 Nginx&#xff0c;可以实现同一端口同时支持 HTTP 和 HTTPS 协议。下面是一种可能的配置方式&#xff1a; 配置 HTTP 服务 在 Nginx 配置文件中&#xff0c;添加以下配置…...

【Express】文件上传管理 multer 中间件

Multer是Node.js中用于处理文件上传的中间件。它可以帮助你处理文件上传的相关逻辑&#xff0c;如接收和保存上传的文件、限制文件大小、设置文件类型限制等。只能用于处理 multipart/form-data 类型的表单数据&#xff0c;它主要用于上传文件。 下面是使用Multer中间件的基本…...

性能监控软件是什么?有哪些优势?

在现代科技驱动的世界中&#xff0c;计算机系统的性能对于企业和个人用户都至关重要。性能监控软件是一种不可或缺的工具&#xff0c;可以帮助我们实时跟踪、分析和优化系统的性能。本文将介绍性能监控软件的概念、其重要性以及如何选择和使用这些工具来提高系统效率。 一、性能…...

分布式事务及CAP和BASE顶底

一、分布式事务 单体应用肯定就不存在分布式事务了&#xff0c;只有在分布式微服务系统中&#xff0c;各个服务之间通过RPC调用后&#xff0c;每个微服务有自己和数据库的连接&#xff0c;各个微服务的回滚不影响其他的微服务事务&#xff0c;这几必须使用分布式事务来解决分布…...

Django REST Framework完整教程-认证与权限-JWT的使用

文章目录 1.认证(Authentication)与权限(Permission)1.1.视图添加权限1.2.登录验证1.3.常用DRF自带权限类1.4.自定义权限类1.5.全局权限1.6.函数视图权限 2.认证详解2.1.认证方案2.2.如何使用TokenAuthentication&#xff1f; 3.JSON Web Token(JWT)认证3.1.工作原理3.2.安装3.…...