自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 Notepad++全选一整列的靠谱办法

Notepad++选取一整列的办法

2022-08-10 16:14:45 9459 3

原创 C++ Matlab混合编程时“函数或变量 ‘matlabrc‘ 无法识别”

在QT中调用Matlab初始化时,出现了“函数或变量 ‘matlabrc’ 无法识别”的情况,接着崩溃。而且比较神奇的是,前一次是可以初始化的,但运行过程中发生了崩溃。直接搜解决办法,发现冰柚子给出了有效的解决办法。具体操作很简单:即删除此文件夹便可,同时,如果你遇到的情况和我类似,即一开始可以初始化,但程序崩溃后无法再次初始化,很有可能是内存不足,在该缓存文件中存在记录并限制了再次运行。请关闭其他程序,或者扩容内存后,删除上述文件夹后重试。...

2022-03-10 15:32:28 2527

原创 CUDA 程序的优化(3) 任务划分

4.3.1任务划分原则首先,需要将要处理的任务划分为几个连续的步骤,并将其划分为CPU端程序和GPU端程序。划分时需要考虑的原则有:列出每个步骤的所有可以选择的算法,并比较不同算法在效率和计算复杂度上的差异。能够并行实现的算法并不一定比串行算法快。在问题规模较小时,计算复杂度阶数更高的算法也有可能比计算复杂度阶数较低的算法耗费更短的时间。根据问题规模,选择适当算法,将任务中耗费时间最多的大规模数据并行、高计算密集度步骤映射到GPU上。在CPU上可以并行实现的算法不一定适用于GPU。CPU程序主要考虑

2020-09-25 11:33:53 602

原创 CUDA 程序的优化(2) 测量程序运行时间

测量程序运行时间本节将介绍如何准确地测量CUDA程序的运行时间。CUDA的内核程序运行时间可以在设备端测量,也可以在主机端测量。而CUDA API的运行时间则只能从主机端测量。无论是主机端测时还是设备端测时,最好都测量内核函数多次运行的时间,然后再除以运行次数以获得更加准确的结果。使用CUDA runtime API时,会在第一次调用runtime API函数时启动CUDA环境。为了避免将这一部分时间计入,最好在正式测时开始前先进行一次包含数据输入输出的计算,这样也可以使GPU从平时的节能模式进入工作状态

2020-09-25 10:21:23 2047

原创 CUDA 程序的优化(1) 概述

CUDA程序优化的最终目的,是以最短的时间,在允许的误差范围内完成给定的计算任务。在这里,“最短的时间”是指整个程序的运行时间,更侧重于计算的吞吐量,而不是单个数据的延迟。在开始考虑使用GPU和CPU协同计算之前,应该先粗略地评估使用CUDA是否能达到预想的效果,包括以下几个方面:1.精度目前,GPU的单精度计算性能要远远超过双精度计算性能,整数乘法、除法、求模等运算的指令吞吐量也较为有限。在科学计算中,由于需要处理的数据量巨大,往往只有在采用双精度或者四精度时才能获得可靠的结果。目前,采用Tesla架

2020-09-24 21:50:18 878

原创 C++ 的Volatile

直接上总结;C/C++ Volatile关键词的第三个特性:”顺序性”,能够保证Volatile变量间的顺序性,编译器不会进行乱序优化。Volatile变量与非Volatile变量的顺序,编译器不保证顺序,可能会进行乱序优化。同时,C/C++ Volatile关键词,并不能用于构建happens-before语义,因此在进行多线程程序设计时,要小心使用volatile,不要掉入volatile变量的使用陷阱之中。详细分析...

2020-09-17 22:29:57 221

原创 DDR问题

ddr的意思是double data rate,全称是ddr-sdram;sdram=Synchronous Dynamic Random Access Memory;sram=Static Random Access Memory;dram=Dynamic Random Access Memory所以,ddr实际上还是sdram,而sdram属于dram,所以ddr属于dram。至于sram,第一个s是static的意思,具体来说,cpu内部的L1,L2高速缓存就是sram,特点是集成度低,同样工

2020-09-17 21:22:42 685

原创 数据库面试

事务1.什么是事务?事务是对数据库中一系列操作进行统一的回滚或者提交的操作,主要用来保证数据的完整性和一致性。2.事务四大特性(ACID)原子性、一致性、隔离性、持久性?原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。隔离性(Isolat

2020-09-10 23:02:51 107

原创 操作系统 用户态与内核态

1、linux进程有4GB地址空间,如图所示:3G-4G大部分是共享的,是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。2、特权级的概念:对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。inter x86架构的cpu一共有

2020-09-09 14:49:37 657

原创 操作系统 死锁

死锁什么是死锁?产生死锁的原因?竞争资源进程间推进顺序非法死锁产生的4个必要条件解决死锁的基本方法预防死锁:1、以确定的顺序获得锁2、超时放弃避免死锁:银行家算法:检测死锁解除死锁:剥夺资源:撤消进程:死锁检测1、Jstack命令2、JConsole工具3、C++ 的死锁检测什么是死锁?所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。 因此我们举个例子来描述,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时

2020-09-09 14:28:35 180

转载 为什么要使用copy_from_user

作者:海枫链接:https://www.zhihu.com/question/19728793/answer/137768893来源:知乎Q:linux在系统调用进入内核时,为什么要将参数从用户空间拷贝到内核空间?不能直接访问,或是使用memcpy吗?非要使用copy_from_user才行吗?在现代通用操作系统里面,cpu运行指令时,它的运级别分为用户态和内核态这两个态,内核要保护应用程序,不能让用户态的数据对内核进行污染。那用户态要委托内核完成某个服务时(比如打开文件,访问文件内容),必须通过

2020-09-09 11:34:41 898

原创 C++ rand()的使用

被9.8小米笔试恶心到了,题都出不对,都不如直接rand()输出。。。我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统。rand和srand关于#include <> 和 #include ""randsrandrand()和srand(

2020-09-09 10:33:44 1489

原创 C++ lower_bound和upper_bound

二分查找,偷懒技巧lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。在从小到大的排序数组中,lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大

2020-09-08 13:18:46 410

原创 LeetCode 300 最长上升子序列

很经典的题目,可以被用到各种变式题目中。常规DP算法,复杂度较高每次都初始化dp[i] = 1,再比较nums[i] nums[j] (j 要从0到1 遍历,如果nums[i] 大于nums[j],就比较一下nums[j] +1 和 nums[i] ,取其最大值更新nums[i])比较好的做法就是 贪心 + 二分查找了官方这么解释的:如果我们要使上升子序列尽可能的长,则我们需要让序列上升得尽可能慢,因此我们希望每次在上升子序列最后加上的那个数尽可能的小。这种贪心的解法,实际上有一定简化:

2020-09-08 11:37:38 130

原创 9.5滴滴面试——栈实现队列

终面问了一下这个很简单的题,踩坑了。原因就是之前刷题刷的飞快,也没去评论区看大家的思路,甚至当时的力扣的官方解答也不是最优解(现在改过来了)坑:很容易想到要用两个栈模拟——不用思考,很容易想到一种:放元素的时候直接放主栈,删除元素时都移到辅助栈,删除辅助栈顶部元素,再把剩下的搬到主栈。求轻喷,当时我想都没想就写了这个思路,力扣过了,好了下一道。。然后面试时。。。就没有然后了。。。刚才的想法中,一次操作里,一个元素会被移动两次(你可以选择是插入还是删除,无所谓)优化的想法应该是一个元素在一次操作里只

2020-09-07 23:36:21 162

原创 分页内存管理——虚拟地址到物理地址的转换

这里看这篇文章读懂什么时分页内存管理:摘抄一部分:4.1 分页内存管理将虚拟内存空间和物理内存空间皆划分成大小相同的页面,例如4KB、8KB和16KB等。并将页作为内存空间的最小分配单位,一个程序的一个页面(虚拟页面)可以存放在任何一个物理页面中。一个程序发出的虚拟地址由虚拟页面号和页内偏移值两部分组成,组成见下:4.2 分页内存管理是如何解决交换内存管理中的两个问题的?1.空间浪费:通过将内存空间划分成大小一样的页面,并且将其作为内存分配的基本单位,这样就避免了大量外部碎片的积累,让内存空间

2020-09-07 23:04:49 1873

原创 中断与回调

1,回调函数。回调函数的原理是使用函数指针实现类似“软中断”的概念。比如在上层的两个函数A和B,把自己的函数指针传给了C,C通过调用A和B的函数指针达到“当做了什么,通知上层来调用A或者B”的目的。从更底层的角度上,代码之间都是在一段程序里面或者可以理解为一致代码段的跳转。通过标准的call ret就可以实现的。 A C B|–upper layer–|--lower layer–|2,中断处理函数。首先,要了解CPU的底层处理机制

2020-09-07 22:25:40 9533 1

原创 进程切换与线程切换

进程切换分两步:切换页目录以使用新的地址空间切换内核栈和硬件上下文对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。切换的性能消耗:线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制

2020-09-07 21:44:56 2231

原创 深入浅出MFC摘抄(1)Windows进程和线程

2020-09-07 20:59:59 90

原创 计算机网络(8)TCP之拥塞控制

拥塞控制为什么要有拥塞控制呀,不是有流量控制了吗?什么是拥塞窗口?和发送窗口有什么关系呢?怎么知道当前网络是否出现了拥塞呢?拥塞控制有哪些控制算法?慢启动慢启动涨到什么时候是个头呢?拥塞避免拥塞发生超时重传快速重传为什么是3次冗余ACK快速恢复为什么要有拥塞控制呀,不是有流量控制了吗?前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果继续发送大量数

2020-09-07 16:03:13 1216

原创 计算机网络(7)TCP之流量控制

发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。流量控制操作系统缓冲区与滑动窗口的关系操作系统的缓冲区,是如何影响发送窗口和接收窗口的呢?当应用程序没有及时读取缓存时当服务端系统资源非常紧张的时候窗口关闭窗口关闭潜在的危险TCP 是如何解决窗口关闭时,潜在的死锁现象呢?糊

2020-09-07 09:53:15 898

原创 计算机网络(6)TCP之滑动窗口

滑动窗口引入窗口概念的原因窗口大小由哪一方决定?发送方的滑动窗口程序是如何表示发送方的四个部分的呢?接收方的滑动窗口接收窗口和发送窗口的大小是相等的吗?引入窗口概念的原因我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。如果你说完一句话,我在处理其他事情,没有及时回复你,那你不是要干等着我做完其他事情后,我回复你,你才能说下一句话,很显然这不现实。所以,这样的传输

2020-09-06 23:45:40 2668

原创 计算机网络(5)TCP之重传机制

这里写目录标题一级目录二级目录三级目录重传机制超时重传快速重传SACKD-SACK一级目录二级目录三级目录TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。重传机制TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢?所以 TCP 针对数据包丢失的情况,会用重传机.

2020-09-06 23:33:12 6710 2

转载 C++11右值引用

右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。能够更简洁明确地定义泛型函数。左值,右值的定义C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。

2020-09-05 22:49:50 392

原创 如何在UDP的基础上设计可靠的链接

以王者荣耀此类MOBA为例:王者荣耀的通信通信方式1、tcp保证数据可靠性是有代价的2、udp的可靠性—DIY手动组装3、同步方案4、乐观锁&断线重连5、技能同步通信方式说到通信方式,一般会有http和socket 两种方式,但http底层也是采用socket,只是每次通信完成以后都会断开,这种方式对于需要频繁交互的双方来说,显得效率太低了,所以一般实时要求高的游戏都是采用socket方式来通信。可是sokect通信,又分为两种:TCP vs UDP,具体是采用那种socket类型,需要具体

2020-09-04 23:29:58 855

原创 Shared_ptr的引用计数原理

引用计数原理shared_ptr的实现是这样的: shared_ptr模板类有一个__shared_count类型的成员_M_refcount来处理引用计数的问题。__shared_count也是一个模板类,它的内部有一个指向Sp_counted_base_impl类型的指针_M_pi。所有引用同一个对象的shared_ptr都共用一个_M_pi指针。指向相同资源的所有 shared_ptr 共享“引用计数管理区域”,并采用原子操作保证该区域中的引用计数值被互斥地访问。“引用计数管理区域”是指通过 n

2020-09-04 20:02:11 2694

原创 设计模式原则之里氏替换原则

定义Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.所有引用基类的地方必须透明的使用其子类的对象。定义明确的说,只要父类能出现的地方子类也可以出现,而且替换为子类不会产生任何错误或异常,但是反过来就不行,有子类出现的地方,父类未必就能适应。继承优点代码共享,减少创建类的工作量,每个子类都拥有父类的方

2020-09-04 19:32:12 91

原创 操作系统——Select,poll,epoll

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。关于这三种IO多路复用的用法,前面三篇总结写的很清楚,并用服务器回射echo程序进行了测试。连接如下所示

2020-09-04 16:16:43 573

原创 C++手写阻塞队列(纯C++11)

这个图可以解释阻塞队列要做什么,阻塞队列主要用于线程和线程之间的通信。当队列为空时,从队列中获取元素的线程将会被挂起;当队列是满时,往队列里添加元素的线程将会挂起。#pragma once#include <condition_variable>#include <mutex>#include <deque>template<class T>class BlockQueue{public: typedef std::unique_lock&.

2020-09-04 14:01:21 438

原创 9.3百度C++

第一题暴力过。第二题核心是二分法,我想直接调库所以存了很多个辅助数组再保存下标。整体逻辑是,要保证找到心仪角色人数最大,其实就是先给要求最低的人安排刚好不小于他要求的那个角色,再将这个角色erase掉。中间用了小技巧来记录下标。第三题是三维dp,想转移方程想了半天,没写完,贴个java大佬的第二题:#include<iostream>#include<vector>#include<queue>#include<unordered_map>#

2020-09-03 21:57:23 149

原创 计算机网络(4)面试题概要

这几个问题很常见,所以mark一下,往后再详细展开说。在浏览器地址栏键入URL,按下回车之后经历的流程/常见状态码/get请求和post请求的区别/Cookie和Session的区别面试常问一 在浏览器地址栏键入URL,按下回车之后经历的流程:1.DNS解析:浏览器会根据URL逐层查询DNS服务器缓存解析URL中的域名所对应的IP地址(DNS缓存从近到远依次是浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,从哪个缓存查找到对应IP则直接返回不再查找后面的

2020-09-03 16:40:04 193

原创 计算机网络(2)OSI七层模型

漫谈(讲的很细)TCP/IP四层模型TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层(对应OSI的第四层)。TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。传输层:在此层中,它提供了节点间的数

2020-09-03 13:08:51 546

转载 C++面试中STRING类的一种正确写法

C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。具体来说:能像 int 类型那样定义变量,并且支持赋值、复制。能用作函数的参数类型及返回类型。能用作标准库容器的元素类型,即 vector/list/deque 的 value_type。(用作 std::map 的 key_type 是更进一步的要求,本文从略)。换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误。void foo

2020-09-01 23:25:40 129

原创 项目中的STL经验

STL是c++非常重要的一部分,它是很多大神的杰作,高效,稳定,可扩展性好,虽然STL确实存在难以调试,内存碎片的问题(现在机器的内存越来越大,内存碎片的问题基本不太可能成为系统瓶颈,但只要你使用恰当,它能显著提高生产力,并使代码更短,更易维护。而在工程中,如果不养成好的使用习惯,也容易造成一些问题!1.vector, map, set, list, queue, dequeue, stack 等容器存放的对象必须是可拷贝的,尤其注意深拷贝的情况,必须自己重载拷贝构造函数和=号, 最后对象仅仅只有数据成

2020-09-01 23:11:17 219

原创 Effective C++总结

explicit关键字C++中的explicit关键字只能用于修饰只有一个参数或者是其他参数有默认值的类构造函数, 它的作用是表明该构造函数是显式的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).explicit关键字的作用就是防止类构造函数的隐式自动转换,防止隐式调用这个构造函数.上面也已经说过了, explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以

2020-09-01 18:48:56 5570

原创 计算机网络(3)TCP的三次握手四次挥手

不想在每次面试前都搜一遍了,尽量整理地全一些好回顾复习用。TCP UDPTCP与UDP基本区别1.基于连接与无连接2.TCP要求系统资源较多,UDP较少;3.UDP程序结构较简单4.流模式(TCP)与数据报模式(UDP);5.TCP保证数据正确性,UDP可能丢包6.TCP保证数据顺序,UDP不保证  UDP应用场景:1.面向数据报方式2.网络数据大多为短消息3.拥有大量Client4.对数据安全性无特殊要求5.网络负担非常重,但对响应速度要求高TCP报头UDP报头TC

2020-08-30 22:16:30 142

原创 MFC多人在线聊天室

基于MFC的C++的select模型的TCP聊天室采用select网络模型,支持多人同时登陆,功能有上线、下线、群聊、私聊使用CjsonObject进行数据传递,使用了心跳包进行判断下线的情况。

2020-08-30 21:29:23 4157 7

转载 C++11多线程总结(转自简书 StormZhu)

他的博客C++11多线程总结一.多线程的基础知识二.线程类的构造函数三.竞争条件与互斥锁[四.死锁(Dead Lock)](https://www.jianshu.com/p/c01e992a3d9d)五.unique_lock[六.条件变量(Condition Variable)](https://www.jianshu.com/p/c1dfa1d40f53)一.多线程的基础知识一个基本的多线程函数#include <iostream>#include <thread>

2020-08-30 18:16:13 301

原创 C++三个线程交替打印ABC

使用C++11的标准线程语法,用一个int变量控制条件变量的wait()阻塞等待时机,用notify_all()唤醒条件变量。#include <iostream>#include <thread>#include <condition_variable>std::mutex mtx;std::condition_variable cv;int ready = 0;void PrintString_1(){ std::unique_lock

2020-08-30 14:33:54 1642

原创 Leetcode 169 多数元素 Easy

一道easy题,但解法思想还是很有参考意义的。哈希和排序的做法实在浪费资源,这里总结下摩尔投票和分治法。Boyer-Moore 投票算法算法核心:选定一个candidate,向后遍历,遇到等于它的票数+1,反之票数-1,减到0后换下一个人当candidate。可行性证明:1.如果当前候选人不是majority 则 majority会和其他非候选人一起反对 会反对候选人,所以该candidate一定会下台(maj==0时发生换届选举)此时,majority和非候选人阵营都消耗了同样的票数,那么将

2020-08-30 10:08:49 69

ChattingRoom-master.rar

可以查看我的博客了解它地一些基本架构,适合入门。

2021-06-17

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除