深信服面经---云计算方向(附问题知识点解析)
深信服面经---云计算高级开发
- 一、一面问题概览
- 二、实操相关
- 三、复盘对问题答案进行整理(查漏补缺)
- 3.1、go语言简单了解
- 3.2、项目中成就感最大或挑战最大的地方
- 3.3、项目问题---协议头引入之后,包的大小增加了多少
- 3.4、如何建立缓存
- 3.5、cache中间件更新机制
- 3.6、redis缓存的写策略
- 3.7、redis缓存热点数据,在什么场景下会产生脏数据
- 3.8、在CRUD中如果操作主数据库和缓存数据库
- 3.9、内存泄漏怎么检测?
- 3.10、socket句柄比较多,怎么分析和解决?
- 3.11、什么是零拷贝?
- 3.12、协程、线程、进程三者的关系和区别
- 3.13、父子进程在资源上有什么区别?
- 3.14、C++中map数据结构,底层为什么不使用高度平衡二叉树?
- 3.15、消息队列存在的价值
- 3.16、引入消息队列会带来什么问题?
- 四、面向stack overflow编程
- 五、算法题
- 总结
- 参考
一、一面问题概览
1、先做一下的自我介绍。
2、是否了解go语言?
3、项目中成就感最大的是哪个?
4、协议头引入之后,包的大小增加了多少(根据项目问的)?
5、redis缓存问题,如何建立缓存(根据项目问的)?
6、cache中间件更新机制是怎么样的(根据项目问的)?
7、为什么更新数据的时候不是用写的方式而是使用删除的方式(根据项目问的)?
8、redis缓存热点数据,具体在什么场景下会产生脏数据?
9、在CRUD中,你的后台服务是先处理数据库还是先处理缓存(redis)?这四个操作分别是怎么处理的?
10、缓存方案中,先删除缓存数据,再更新数据库,最后再同步(写),这种方式在高并发下会产生什么问题 ?数据一致性会不会有问题?(或者说同时出现并发读和并发写的情况,会发生什么?)
11、还知道其他的缓存更新模式吗?
12、内存泄漏怎么检测?
13、如果一个服务的句柄(文件句柄或socket句柄)一直增加没有下降,怎么分析?是什么问题?
14、系统下调大句柄数量的命令是什么?ulimit。
15、socket句柄比较多,怎么分析和解决?这种现象在什么情况下是正常的?在什么场景下是不正常的?
16、服务非常多,接口也非常多,现在不知道在内存或socket句柄在何处泄漏的,怎么分析?
17、什么是零拷贝?
18、哪些技术可以做到零拷贝?
19、什么是Direct IO?
20、操作系统上,说一下协程、线程、进程三者的关系?在资源上面有什么差别?
21、父子进程在资源上有什么区别?(可以从fork的写时复制来说明)
22、C++中map数据结构,底层为什么不使用高度平衡二叉树来做?(https://blog.csdn.net/weixin_61207303/article/details/123402294)
23、对windows上的程序开发是怎么理解的?
24、window开发客户端最头疼的问题是什么?
25、windows用户界面库有哪些?(qt、duilibUI)
26、消息队列存在的价值是什么?主要解决什么问题?
27、引入消息队列会带来什么问题?
28、说一下消息队列的优缺点
二、实操相关
1、面向google编程,面向stack overflow编程,画出流程图。
1)Google不到代码怎么办?
2)如果google到的代码最后验证不是想要或合适的(验证失败),怎么办?
2、算法题,给一个数组root[]={6,3,5,3,6,7,8,-1,-1,5,6},构建二叉树,然后中序遍历输出二叉树。
小结:
- 回答方式有待提升,需要拓展讲述技术,切忌一问一答(应该就问的知识点进行扩展讲述)。
- 回答需清晰贯通,尽量避免停顿。
- 语速平和,逻辑要清晰。
三、复盘对问题答案进行整理(查漏补缺)
3.1、go语言简单了解
大厂后端高并发程序 / 服务基本都有引入golang语言来开发,所以需要了解一下golang语言。
golang为高并发而生,由google在2009年正式发布,golang从语言级别支持并发,通过轻量协程goroutine实现程序并发运行。
golang语言是google推出的具有强类型,原生支持并发,且具有垃圾回收(GC)功能的编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
golang的轻量主要体现在:
- 上下文切换代价小。goroutine上下文切换只涉及三个寄存器(计数寄存器PC、堆栈指针寄存器SP、数据寄存器DX)的值修改,而对比线程的上下文切换则需要涉及模式切换(从用户态切换到内核态)、以及 超过16 个寄存器的刷新。
- 内存占用少。线程栈空间是2M,goroutine的栈空间最小只有2K。
Golang 程序中可以轻松支持10w 级别的 Goroutine 运行,而线程数量达到 1k 时,内存占用就已经达到 2G。
go调度器模型通常称为G-P-M模型,它包括四个重要结构:G、P、M、Sched。go程序通过调度器来调度goroutine在内核线程上的执行,但是G(goroutine)并不直接绑定OS线程M(Machine)运行,而是由goroutine scheduler中的P(processor,逻辑处理器)来作为获取内核线程资源的中介。
Go 调度器中有两个不同的运行队列:全局运行队列(GRQ)和本地运行队列(LRQ);每个 P 都有一个 LRQ,用于管理分配给在 P 的上下文中执行的 Goroutines,这些 Goroutine 轮流被和 P 绑定的 M 进行上下文切换。GRQ 适用于尚未分配给 P 的 Goroutines。
(1)G:Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。G 并非执行体,每个 G 需要绑定到 P 才能被调度执行。
(2)P: Processor,表示逻辑处理器,对 G 来说,P 相当于 CPU 核,G 只有绑定到 P 才能被调度。对 M 来说,P 提供了相关的执行环境(Context),如内存分配状态,任务队列等。P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量)。P 的数量由用户设置的 GoMAXPROCS 决定,但是不论 GoMAXPROCS 设置为多大,P 的数量最大为 256。
(3)M: Machine,OS 内核线程抽象,代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取。M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000 个。M 并不保留 G 状态,这是 G 可以跨 M 调度的基础。
(4)Sched:Go 调度器,它维护有存储 M 和 G 的队列以及调度器的一些状态信息等。调度器循环的机制大致是从各种队列、P 的本地队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 Go exit 做清理工作并回到 M,如此反复。
Go 程序可以利用少量的内核级线程来支撑大量 Goroutine 的并发。多个 Goroutine 通过用户级别的上下文切换来共享内核线程 M 的计算资源,但对于操作系统来说并没有线程上下文切换产生的性能损耗。
为了更加充分利用线程的计算资源,Go 调度器采取了以下几种调度策略:
(1)任务窃取(work-stealing)。当每个 P 之间的 G 任务不均衡时,调度器允许从 GRQ,或者其他 P 的 LRQ 中获取 G 执行。
(2)减少阻塞。在 Go 里面阻塞主要分为一下 4 种场景:
- 由于原子、互斥量或通道操作调用导致 Goroutine 阻塞,调度器将把当前阻塞的 Goroutine 切换出去,重新调度 LRQ 上的其他 Goroutine。
- 由于网络请求和 IO 操作导致 Goroutine 阻塞,Go 程序提供了网络轮询器(NetPoller)来处理网络请求和 IO 操作的问题,其后台实现 IO 多路复用。通过使用 NetPoller 进行网络系统调用,调度器可以防止 Goroutine 在进行这些系统调用时阻塞 M。这可以让 M 执行 P 的 LRQ 中其他的 Goroutines,而不需要创建新的 M;有助于减少操作系统上的调度负载。实现了 goroutine-per-connection 简单的网络编程模式(但是大量的 Goroutine 也会带来额外的问题,比如栈内存增加和调度器负担加重)。
- 当调用一些系统方法的时候,如果系统方法调用的时候发生阻塞,这种情况下,网络轮询器(NetPoller)无法使用,而进行系统调用的 Goroutine 将阻塞当前 M。调度器将 M1 与 P 分离,同时也将 G1 带走。然后调度器引入新的 M2 来服务 P。此时,可以从 LRQ 中选择 G2 并在 M2 上进行上下文切换。阻塞的系统调用完成后,G1 可以移回 LRQ 并再次由 P 执行。如果这种情况再次发生,M1 将被放在旁边以备将来重复使用。
- 如果在 Goroutine 去执行一个 sleep 操作,导致 M 被阻塞了。Go 程序后台有一个监控线程 sysmon,它监控那些长时间运行的 G 任务然后设置可以强占的标识符,别的 Goroutine 就可以抢先进来执行。只要下次这个 Goroutine 进行函数调用,那么就会被强占,同时也会保护现场,然后重新放入 P 的本地队列里面等待下次执行。
3.2、项目中成就感最大或挑战最大的地方
没有有挑战的项目可以考虑项目用到的技术栈有哪些风险,然后针对存在的风险,给出一套完美的解决方案。
有好项目的可以从系统设计的层面上讲述。
比如我的项目中,要设计开发一个局域网内高效的后台服务器程序,最大的成就是设计了一个高效网络传输协议,为集中式并发提供高效应答(或者,最大的挑战是如何设计出一个高效的网络模型和通信协议,实现高并发应答),项目中,客户端只知道服务端开放的端口,第一个版本中为了保证数据的可靠性,主要使用TCP传输数据,但是因为不知道服务器的IP,所以先使用UDP发送广播来探寻服务器,获得服务器IP后转为TCP来传输数据;后来经过验证,传输的数据大部分都比较小,而且在局域网内UDP丢失数据的概率极低,因此转为UDP为主进行应答,因为UDP 具有较好的实时性,工作效率比 TCP 高,应答效率和数据传输效率提高了一倍。
这个过程,不仅仅体现出你排查解决问题的能力,另一方面也突出你的沉淀和自我思考能力。
3.3、项目问题—协议头引入之后,包的大小增加了多少
在我的项目中,引入了这样的协议头:
1 byte 1 byte 6 bytes
+--------+--------+-----------------------------------------------------+
| opcode | pl_len | src_ip |
+-----------------------------------------------------------------------+
| src_ip |
+-----------------+-----------------------------------------------------+
| src_ip | src_mac |
+-----------------+-----------------+-----------------------------------+
| src_mac | src_port | des_ip |
+-----------------------------------------------------------------------+
| des_ip |
+-----------------------------------+-----------------------------------+
| des_ip | des_mac |
+-----------------------------------+-----------------+-----------------+
| des_mac | des_port | preload |
+-----------------------------------------------------------------------+
| ... |
| preload |
| ... |
+-----------------------------------------------------------------------+
7*8-2=54字节,所以最大多出了54字节,最少22字节(只有头、MAC地址以及端口)其中有一个字节包含了可能存在的分片预留位。
3.4、如何建立缓存
采用redis nosql数据库作为Mysql数据库的缓存,在查找的时候,首先查找redis缓存,如果找到则返回结果;如果在redis中没有找到,那么查找Mysql数据库,找到的话则返回结果并且更新redis;如果没有找到则返回空。对于写入的情况,直接写入mysql数据库,mysql数据库通过触发器及UDF机制自动把变更的内容更新到redis中。
3.5、cache中间件更新机制
同步方案可以有:
(1)伪装从数据库。比如阿里开源的canal方案、kafka、go-mysql-transfer等。
(2)MySQL的触发器+udf。udf全称User-defined function,是MySQL提供的一种可扩展代码。UDF不具备事务,不能回滚;而且效率较低。
3.6、redis缓存的写策略
以MySQL为主,保证缓存不可用,整个系统依然要保持正常工作;mysql 不可用的话,系统停摆,停止对外提供服务。
(1)从安全优先方面考虑;先删除缓存,再写 mysql,后面数据同步交由 go-mysql-transfer 等中间件处理。先删除缓存,为了避免其他服务读取旧的数据;也是告知系统这个数据已经不是最新,建议从 mysql 获取数据。
(2)从效率优先方面考虑;先写缓存,并设置过期时间(如 200ms),再写mysql,后面数据同步交由其他中间件处理。这里设置的过期时间是预估时间,大致上是 mysql 到缓存同步的时间。在写的过程中如果 mysql 停止服务,或数据没写入 mysql,则200 ms 内提供了脏数据服务;但仅仅只有 200ms 的数据错乱,即效率优先的写策略也有安全性的问题,但只会影响200ms。
3.7、redis缓存热点数据,在什么场景下会产生脏数据
所谓产生脏数据,就是主数据库与缓存数据库的数据不一致,这种情况一般在效率优先的写策略中会产生,但因为设置了过期时间,所以只会影响一定时间。
3.8、在CRUD中如果操作主数据库和缓存数据库
(1)C,创建一条数据:从安全优先考虑,先写入MySQL,然后通过中间件go-mysql-transfer更新缓存数据库redis;从效率优先考虑,先写入redis并设置过期时间,再写入mysql。
(2)R,查询数据:先查询redis,如果有则直接返回,如果没有再访问mysql查询,mysql中也没有就返回空,mysql中有就返回数据,并通过中间键更新redis缓存。
(3)U,更新数据:先删除redis的数据,再写数据库,然后通过中间件go-mysql-transfer更新缓存数据库redis。
(4)D,删除数据:先删除redis的数据,再删除mysql的数据。
3.9、内存泄漏怎么检测?
debug版本,通过VLD库或CRT库分析内存泄漏,但是服务器有很多问题需要在线上并发压力情况下才出现,因此讨论Debug版调试方法意义不大。
对于release版本:
(1)静态方式检测。使用cppcheck、BEAM等工具检测代码文件是否有内存泄漏隐患。
(2)入侵式检测。实现内存泄漏检测组件,嵌入代码中,比如hook住分配内存的函数、mtrace追踪内存分配、对象计数方式;C++还可以重载内存分配和释放函数 new 和 delete。这种方式的缺点是要修改原代码,而且对于第三方库、STL容器、脚本泄漏等因无法修改代码而无法定位。
(3)已经上线的服务器程序,可以使用Valgrind、AddressSanitizer等工具定位到具体的内存泄漏位置。
3.10、socket句柄比较多,怎么分析和解决?
(1)查看当前socket使用状态。
# 方法一
cat /proc/net/sockstat
# 方法二
ss -s
(2)如果是FIN_WAIT和TIME_WAIT的,可以调整fin超时时间或者其他内核参数来解决。
(3)如果是出现大量CLOSING状态,基本上业务上要处理的逻辑过多,导致一直在CLOSING状态;可以使用异步,将网络层和业务层分离,单独处理。
3.11、什么是零拷贝?
零拷贝技术就是绕过用户态,用户缓存区不参与数据拷贝;避免了内核态和用户态的冗余数据拷贝,减少上下文切换。
linux系统提供两个零拷贝接口:mmap和sendfile:
- mmap通过DMA将磁盘数据拷贝到内核缓冲区,接着操作系统会把这段内核缓冲区与应用程序共享,这样就不用将内核缓冲区的数据拷贝到用户缓冲区,应用程序调用send或者write时,系统直接将内核缓冲区的内容拷贝到socket缓冲区,然后发送出去。使用mmap至少减少了一次数据拷贝,但是仍然会有用户空间和内核空间的上下文切换。
- sendfile的数据传输只发生在内核态,应用程序调用sendfile,系统会将数据拷贝到page cache,然后拷贝到socket buffer,再通过网卡发送出去。这种发送不仅减少了数据拷贝的次数,还减少了上下文切换。如果网卡支持SG-DMA,还可以再去除 Socket 缓冲区的拷贝,这样一共只有 2 次内存拷贝。
此外,还有一个direct io技术,绕过内核缓冲区,在用户空间和磁盘之间传输数据,减少内核缓冲区和用户数据的复制次数。降低了文件读写所带来的CPU负载能力和内存带宽的占用率。
3.12、协程、线程、进程三者的关系和区别
进程:是一个运行程序,有自己独立的内存空间,是系统资源分配的最小单位。进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
线程:是一个轻量级的进程,一个进程至少包含一个线程,同一个进程中的线程组共享内存空间,是操作系统调度执行的最小单位。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相⽐进程不够稳定容易丢失数据。
协程:一个用户态的轻量级线程,协程的调度完全由应用程序控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
3.13、父子进程在资源上有什么区别?
父进程通过fork创建子进程,刚开始时两者都没有对内存作出改动,父子进程共享内存资源。内核fork()时并不复制整个进程地址空间,而是让父子进程共享一个地址空间,只有在需要写入时,数据才会被复制,从而使各个进程拥有各自的拷贝数据。也就是说,只有在需要写入的时候才复制资源,在此之前,以只读方式共享。
3.14、C++中map数据结构,底层为什么不使用高度平衡二叉树?
最常见的两种自平衡树算法是红黑树和AVL树。为了在插入/更新后平衡树,两种算法都使用旋转的概念,其中树的节点被旋转以实现重新平衡。
AVL的左右子树高度差不能超过1,每次进行插入或删除操作时几乎都需要通过旋转操作保持平衡,在频繁插入或删除的场景中,频繁的旋转操作使得AVL的性能大打折扣。
红黑树的红黑规则只需要保证黑色节点高度一样(黑高),通过牺牲严格的平衡,换取插入、删除时少量的旋转操作,整体性能优于AVL。红黑树插入的不平衡,不超过两次旋转就可以解决;删除时的不平衡,不超过三次旋转就能解决。
虽然在这两种算法中,插入/删除操作都是 O(log2n)O(log_2^n)O(log2n),但在红黑树重新平衡旋转的情况下是 O(1) 操作,而在 AVL 的情况下,这是一个 O(log2n)O(log_2^n)O(log2n)操作,这使得红黑树在重新平衡阶段的这一方面更有效,这也是它更常用的可能原因之一。
3.15、消息队列存在的价值
消息队列的优点:
- 解耦:允许独立的扩展或修改队列两边的处理过程。
- 可恢复性:即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
- 缓冲:有助于解决生产消息和消费消息的处理速度不一致的情况。
- 灵活性和峰值处理能力:不会因为突发的超负荷的请求而完全崩溃,消息队列能够使关键组件顶住突发的访问压力。
- 异步通信:消息队列允许用户把消息放入队列但不立即处理它。
3.16、引入消息队列会带来什么问题?
- 消息队列会降低系统的可用性。
- 会提高系统复杂度。
- 需要考虑一致性问题。
四、面向stack overflow编程
五、算法题
给一个数组root[]={6,3,5,3,6,7,8,-1,-1,5,6},构建二叉树,然后中序遍历输出二叉树。
#include <vector>
#include <string>
#include <queue>
#include <iostream>
using namespace std;//二叉树结点结构
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode() :val(0), left(nullptr), right(nullptr) {}TreeNode(int x) :val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode* left, TreeNode* right) :val(x), left(left), right(right) {}
};TreeNode* createBinaryTree(vector<int> nodes) {int len = nodes.size();if (len == 0) {return NULL;}if (nodes[0] == -1) {return nullptr;}TreeNode* root;//建立结点队列并将根节点入队queue<TreeNode*> nodesQue;root = new TreeNode(nodes[0]);nodesQue.push(root);//loc遍历数组,每次取两个结点for (int loc = 1; loc < len; loc = loc + 2) {//获取结点并出队TreeNode* node = nodesQue.front();nodesQue.pop();//获取队头结点的左右结点int left = nodes[loc];int right = nodes[loc + 1];//赋予左右结点if (left == -1) {node->left = nullptr;}else {node->left = new TreeNode(left);nodesQue.push(node->left);}if (right == -1) {node->right = nullptr;}else {node->right = new TreeNode(right);nodesQue.push(node->right);}}return root;
}void dfs(TreeNode* root)
{if(root==nullptr){cout<<"null"<<endl;return;}cout<<root->val<<endl;dfs(root->left);dfs(root->right);
}int main()
{vector<int> root={6,3,5,3,6,7,8,-1,-1,5,6};TreeNode* cur= createBinaryTree(root);dfs(cur);return 0;
}
总结
- 从 Go 调度器架构层面上介绍了 G-P-M 模型,通过该模型怎样实现少量内核线程支撑大量 Goroutine 的并发运行。以及通过 NetPoller、sysmon 等帮助 Go 程序减少线程阻塞,充分利用已有的计算资源,从而最大限度提高 Go 程序的运行效率。
- 消息队列带来的好处:解耦、削峰、异步,提高系统响应速度和稳定性。
参考
- 腾讯技术
- MySQL缓存策略
- Go语言详解
- DMA,Direct IO和零拷贝
- C++ SLT map和unorder_map底层原理
相关文章:
深信服面经---云计算方向(附问题知识点解析)
深信服面经---云计算高级开发一、一面问题概览二、实操相关三、复盘对问题答案进行整理(查漏补缺)3.1、go语言简单了解3.2、项目中成就感最大或挑战最大的地方3.3、项目问题---协议头引入之后,包的大小增加了多少3.4、如何建立缓存3.5、cache…...
MySQL面试题-基础篇
目录 前言 数据库基础 1.什么是关系型数据库和非关系型数据库? 2.什么是 SQL? 3.MySQL 有什么优点? 4.MySQL 的基础架构? 存储引擎 1.MySQL 支持哪些存储引擎?默认使用哪个? 2.MySQL 存储引擎架构了解吗&…...
高通平台开发系列讲解(摄像头篇)QCM6490 上摄像头驱动开发
文章目录 一、Camera 硬件简介二、内核驱动移植2.1、确定设备树2.2、增加 camera 节点2.3、配置相关 GPIO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 qcm6490 摄像头驱动开发。 一、Camera 硬件简介 摄像头连接器一般会包含 Mipi 信号、mclk、供电、re…...
MOV压敏电阻应用推荐及选型要点说明
ESD器件-MOV压敏电阻是一种非线性的电阻元器件产品,具有瞬态电压抑制功能,能够吸收电路中多余的电流,可保护一些敏感电路及其他电子产品设备的电路不受ESD、雷击瞬态浪涌电流的危害。对于它的一些应用范围,优恩小编在这里举例说明…...
Pytorch学习笔记(8):正则化(L1、L2、Dropout)与归一化(BN、LN、IN、GN)
目录 一、正则化之weight_decay(L2正则) 1.1 正则化及相关概念 1.2 正则化策略(L1、L2) (1)L1正则化 (2)L2正则化 1.3 L2正则项——weight_decay 二、正则化之Dropout 2.1 Dr…...
Azure OpenAI 官方指南 01|GPT-3 的原理揭秘与微调技巧
Azure OpenAI 服务在微软全球 Azure 平台正式发布后,迅速成为众多用户最关心的服务之一。 Azure OpenAI 服务允许用户通过 REST API 访问 OpenAI 的强大语言模型,包括 GPT-3、Codex 和 Embeddings 模型系列。本期,我们将为您揭秘 Azure Open…...
神垕古镇景区三方背后的博弈,争夺许昌第一家5A景区主导权
钧 瓷 内 参 第37期(总第368期) 2023年3月2日 神垕古镇景区景域,建业,孔家三方背后的博弈,争夺许昌第一家5A景区主导权 在博弈论(Game Theory)经济学中,“智猪博弈”是一个著名的…...
【C++】vector的模拟实现(SGI版本)
吃不了自律的苦,又接受不了平庸的罪。想让自己变好,但又想舒服些。 你啊你……要么就不要去想,想了又不去做,犹犹豫豫,徘徊不前,患得患失… 文章目录一、四种构造函数1.vector的框架和无参构造2.构造函数调…...
【9】SCI易中期刊推荐——工程技术-计算机:软件工程(中科院4区)
🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…...
SOTA!目标检测开源框架YOLOv6 3.0版本来啦
近日,美团视觉智能部发布了 YOLOv6 3.0 版本,再一次将目标检测的综合性能推向新高。YOLOv6-L6 检测精度和速度超越 YOLOv7-E6E,取得当前实时目标检测榜单 SOTA。本文主要介绍了 YOLOv6 3.0 版本中引入的技术创新和优化,希望能为从…...
svn使用
一、SVN概述 1.1为什么需要SVN版本控制软件 1.2解决之道 SCM:软件配置管理 所谓的软件配置管理实际就是对软件源代码进行控制与管理 CVS:元老级产品 VSS:入门级产品 ClearCase:IBM公司提供技术支持,中坚级产品 1.…...
LeetCode 1487. Making File Names Unique【字符串,哈希表】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
Java——电话号码的字母组合
题目链接 leetcode在线oj题——电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 题目示例…...
LDR6028市面上最具有性价比的Type-C OTG音频协议方案
目前市面上的大部分手机都取消了3.5mm音频耳机接口,仅保留一个Type-C接口,但是追求音质和零延迟的用户仍然会选择3.5mm有线耳机,因为在玩手机游戏的时候,音画不同步真的很影响游戏体验,所以Type-C转3.5mm接口线应运而生…...
SpringMVC-0228
一、SpringMVC简介1、什么是MVCMVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分M:Model,模型层,指工程中的JavaBean,作用是处理数据补充:框架其实就是配置文件jar包JavaBean分为两类ÿ…...
【测试岗】那个准点下班的人,比我先升职了...
前言 陈双喜最近心态很崩。和他同期一道进公司的陈琪又升了一级,可是明明大家在进公司时,陈琪不论是学历还是工作经验,样样都不如自己,眼下不过短短的两年时间便一跃在自己的职级之上,这着实让他有几分不甘心。 程双…...
【C++】适配器模式 -- stack/queue/dqueue
一、适配器模式 设计模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结;Java 语言非常关注设计模式,而 C 并没有太关注,但是一些常见的设计模式我们还是要学习。 迭代器模式 其实我们在前面学习 strin…...
sql server 分页查询
sql server 分页查询[toc]前言SQL server 2012版本。下面都用pageIndex表示页数,pageSize表示一页包含的记录。并且下面涉及到具体例子的,设定查询第2页,每页含10条记录。首先说一下SQL server的分页与MySQL的分页的不同,mysql的分…...
RV1126新增驱动IMX415 SENSOR,实现v4l2抓图
RV1126新增驱动IMX415 SENSOR,实现v4l2抓图。1:内核dts修改&csi_dphy0 {status "okay";ports {#address-cells <1>;#size-cells <0>;port0 {reg <0>;#address-cells <1>;#size-cells <0>;mipi_in_uca…...
Hive 数据倾斜
数据倾斜,即单个节点任务所处理的数据量远大于同类型任务所处理的数据量,导致该节点成为整个作业的瓶颈,这是分布式系统不可能避免的问题。从本质来说,导致数据倾斜有两种原因,一是任务读取大文件,二是任务…...
2月刚上岸字节跳动测试岗面经
这时候发应该还不算太晚,金三银四找工作的小伙伴需要的可以看看。 一、测试工程师的工作是什么? 测试工程师简单点说就是找bug,然后反馈给开发人员,不要小看这个工作。 首先很明显的bug开发人员有时候自己就能找到,测…...
图解KMP算法
子串的定位操作通常称作串的模式匹配。你可以理解为在一篇英语文章中查找某个单词是否存在,或者说在一个主串中寻找某子串是否存在。朴素的模式匹配算法假设我们要从下面的主串S "goodgoogle" 中,找到T "google" 这个子串的位置。…...
Java Map和Set
目录1. 二叉排序树(二叉搜索树)1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除(7种情况)1.4 二叉搜索树和TreeMap、TreeSet的关系2. Map和Set的区别与联系2.1 从接口框架的角度分析2.2 从存储的模型角度分析【2种模型】3. 关于Map3.1 Ma…...
【C/C++ 数据结构】-八大排序之 冒泡排序快速排序
作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【C/C数据结构与算法】 分享:那我便像你一样,永远躲在水面之下,面具之后! ——《画江湖之不良人》 主要内容:八大排序选…...
苹果ipa软件下载网站和软件的汇总
随着时间的流逝,做苹果版软件安装包下载网站和软件的渐渐多了起来。 当然,已经关站、停运、下架、倒闭的苹果软件下载网站和软件我就不说了,也不必多说那些关站停运下架倒闭的网站和软件了。 下面我统计介绍的就是苹果软件安装包下载网站和软…...
深度学习-【语义分割】学习笔记4 膨胀卷积(Dilated convolution)
文章目录膨胀卷积为什么需要膨胀卷积gridding effect连续使用三次膨胀卷积——1连续使用三次膨胀卷积——2连续使用三次膨胀卷积——3Understanding Convolution for Semantic Segmentation膨胀卷积 膨胀卷积,又叫空洞卷积。 左边是普通卷积,右边是膨胀…...
【10】SCI易中期刊推荐——工程技术-计算机:人工智能(中科院2区)
🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…...
模电计算反馈系数,有时候转化为计算电阻分压的问题
模电计算反馈系数,有时候转化为计算电阻分压的问题 如果是电压反馈,F的除数是Uo 如果是电流反馈,F的除数是Io 串联反馈,F的分子是Uf 并联反馈,F的分子是If 点个赞呗,大家一起加油学习!...
专治Java底子差,不要再认为泛型就是一对尖括号了
文章目录一、泛型1.1 泛型概述1.2 集合泛型的使用1.2.1 未使用泛型1.2.2 使用泛型1.3 泛型类1.3.1 泛型类的使用1.2.2 泛型类的继承1.4 泛型方法1.5 泛型通配符1.5.1 通配符的使用1)参数列表带有泛型2)泛型通配符1.5.2 泛型上下边界1.6 泛型的擦除1.6.1 …...
PayPal轮询收款的那些事儿
想必做跨境电商独立站的小伙伴,对于PayPal是再熟悉不过了,PayPal是一个跨国际贸易的支付平台,对于做独立站的朋友来说跨境收款绝大部分都是依赖PayPal以及Stripe条纹了。简单来说PayPal跟国内的支付宝有点类似,但是PayPal它是跨国…...
有哪些网站可以做赌博游戏/seo教程优化
class Node:def __init__(self, val):self.data = valself.left = Noneself.right...
经三路专业做网站/seo网站推广的主要目的不包括
2019独角兽企业重金招聘Python工程师标准>>> 学习别人的例子,是big5编码的,必须得改eclipse的text file encoding,可是设置的下拉框里没有big5,肿么办,看到一篇名为 Eclipse的“Text File Encoding”选项中…...
北京网页模板建站/百度怎么推广网站
今天跟人聊起车子的换挡问题,得到一些技巧,看了觉得挺有道理,特收藏: 自动档车的省油技巧网上有些,可是还是有很多地方不明白,有人能指点一二将万分感谢。 问题1:启动时能从空档或P档直接…...
做微信的网站秀客/简单的个人网页制作html
关于微信小程序request 请求接口的封装,在此记录一下。 封装如下:utils.js 文件 /*** 获取header*/ function getCommonHeader() {let header {Content-type: application/x-www-form-urlencoded};// 如果token有值则带上let token wx.getStorageSyn…...
克隆网站后怎么做/今日头条官方正版
静态代码扫描这个词对很多人来说并不陌生,从字面上理解就是检查项目的源码,从源码中找出代码存在的缺陷:潜在的bug,未使用的代码,复杂的表达式,重复的代码等。 Sonar一个Web系统,展现了静态代…...
成都网站建设开发公司哪家好/营销软文范文200字
引入命名空间 using System.Diagnostics; 具体方法实现 1 class Cmd2 {3 private static string CmdPath "C:\Windows\System32\cmd.exe";4 /// <summary>5 /// 执行cmd命令 返回cmd窗口显示的信息6 /// 多命令请使用批处理命令连接符&#x…...