- 博客(96)
- 收藏
- 关注
原创 深入理解Linux内核——内存寻址
Linux内存寻址一、Linux分段逻辑地址,即指定一个操作数或一条指令的地址;线性地址,也称虚拟地址,32位无符号整数,可表示4GB地址;物理地址:内存芯片级内存单元寻址;由内存硬件设备和内存总线相连的引脚决定。内存寻址解决的问题是明晰Linux 逻辑地址如何经过一系列的地址映射至物理地址。1、题段描述符GDT每一个段由8字节段描述符表示,根据不同的段可将段描述符分为不同种类,广泛...
2020-01-09 19:26:13
404
原创 卡特兰数
关于卡特兰数,还是学习这位仁兄的博文比较合适:https://blog.youkuaiyun.com/Hackbuteer1/article/details/7450250
2020-01-06 21:54:32
238
原创 深入理解计算机系统——存储器层次结构
不管怎样,作为程序员我还是强烈建议大家多阅读原理性的书籍,例如《深入理解计算机系统》。。。本节梳理下存储相关的知识点。1、存储分类(1)寄存器(2)随机访问存储器(SRAM & DRAM)(3)非易失性存储器(ROM)需要重点提一下闪存,基于EEPROM,固态硬盘(SSD)就是基于闪存的磁盘驱动器(4)磁盘2、剖析计算机系统存储结构(1)一个存储器层次结构的示意图(...
2020-01-02 22:41:01
2492
原创 深入理解计算机系统——stackoverflow
一、栈帧结构在讲栈帧结构之前需要明确栈帧结构是针对程序设计中的一个过程,过程是对一段指定参数和一个可选的返回值代码的抽象,它提供了一种封装代码的方式,过程的形式在代码的实现过程中具体表现为:函数(function)、方法(method)、子例程(subroutine)、处理函数(handle)等。当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就会在栈上分配空间,这部分空间称为过程...
2019-12-29 16:32:09
591
原创 深入理解计算系统-《计算机系统漫谈》
计算机系统漫谈计算系统分层视图存储————本章介绍深入理解计算系统主要需要了解的内容计算系统分层视图计算机系统包含两部分:软件 & 硬件(1)软件:应用程序、操作系统(2)硬件:I/O设备、缓存(SRAM)、主存(DRAM)、处理器、磁盘、显示器等。进程、虚拟内存、文件是计算机系统运行过程中的一种抽象产物。(1)进程:可以将每个独立运行的程序视作一个进程,现在的多核操作系统...
2019-12-22 20:08:27
351
原创 论多态
多态的实现可以归结于———virtual关键字1、虚基表带有virtual关键字的class都有一个virtual table,该class的对象通常会带有一个vptr(virtual table ptr),该vptr决定了程序运行期间,各个virtual函数的调用情况。下面举一个例子说明base class和derive class的virtual函数的继承关系对应子类对象中的virtua...
2019-11-30 18:21:30
123
原创 老生常谈--C++构造函数类型
C++中老生常谈的基础是构造函数,申明一个空的class Empty,其实编译器会自动产生默认构造函数、析构构造函数、复制构造函数、赋值构造函数如下代码所示:class Empty{};定义上面的类,其实可以编译器会产生如下结构class Empty {public: Empty() ; //默认构造函数 ~Empty() ;//析构构造函数 Empty(cons...
2019-11-30 17:50:12
236
原创 c++面试知识点总结
STL容器篇C++面试基础中不可避免会问到STL容器相关知识点,STL容器包含两大类:序列式容器 & 关联容器序列式容器:元素都可序(ordered),但是未必有序(sorted),通过元素的顺序来访问,包含vector、list、dequeue、stack、queue、priority-queue。关联容器:数据以key-value的形式组成,可通过key值访问元素,包含RB-tr...
2019-10-28 22:21:14
396
原创 浅谈算法
最近在研究算法,本文主要谈一下自己最近刷题的感受及对算法的总结。如果只是为了准备面试,算法主要分为一下几类:1.排序和查找2.动态规划问题可拆解成更小粒度的子问题,要求求最优解,更大问题的解决结果依赖于小粒度的子问题,这种问题一般可用动态规划或者递归,递归的时间成本跟高。利用动态规划的思想自底向上解决问题,并保存子问题的结果,并基于子问题的解计算更大问题的解。3.贪婪算法基于上述动态...
2019-08-31 17:01:25
231
原创 删除链表的倒数第N个节点
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?来源:力扣(LeetCode)链接:https://leetcode-cn....
2019-08-24 18:01:17
232
原创 《系统编程手册》——虚拟内存操作篇
利用mmap分配共享内存后,还可以对其执行一系列的限制:(1)mprotect修改一块虚拟内存的保护信息;mmap分配虚拟内存的时候会指定该内存的保护信息prot,可以理解为进程对该内存的权限,分为如下四种:PROT_NONE\PROT_READ\PROT_WRITE\PROT_EXEC。mprotect接口用于修改该保护信息prot。#include <sys/mman.h>...
2019-08-23 00:17:19
167
原创 《系统编程手册》——管道和FIFO
管道:Unix系统上ipc方法之一,具有如下特征:(1)不存在消息边界,一个管道就是一个字节流;(2)从管道中读取数据时,若管道中没有字节数或者管道写端没有打开默认是会阻塞的,但是针对FIFO可以设置为非阻塞IO,即O_NONBLOCK;(3)管道是单向的;(4)管道的容量是有限的,可以确保写入不超过PIPE_BUF字节的操作是原子的;FIFO:与Windows一样,FIFO可以被理解为...
2019-08-19 19:59:59
160
原创 《系统编程手册》——静态链接库&共享库
静态库:每份可执行程序会包含被链接的目标文件的一份副本;共享库:每份可执行程序会共享被链接的目标文件的一份副本,但是每份可执行程序使用目标文件的变量将各自独立,每个可执行程序会拥有自己库中定义的全局和静态变量副本。比较:1.每份可执行程序链接的静态库均占有虚拟内存空间和磁盘空间;而共享库由多个进程共享,资源只占用一份。2.静态链接库使用不够灵活,静态链接库更新时需要更新多份库文件;而共享库...
2019-08-17 21:36:33
182
原创 《系统编程手册》——登陆记账篇
登陆记账:linux系统中存在两个文件,utmp文件和wtmp文件用于记录用户登陆与登出系统有关的信息的数据文件;utmp文件:位于/var/run/utmp,维护着当前登陆进系统的用户信息,who(1)之类的命令就会使用utmp文件信息,当用户登陆时,会在utmp文件中维护一种结构体utmpx,用于记录用户的user_id等信息,当该用户退出时,该记录会在utmp文件中删除;wtmp文件:位...
2019-08-17 16:47:16
206
原创 快速排序
快速排序:在数组nums随机总选中一个数做对比nums[index];将数组nums中小于nums[index]的元素放在数组的左侧,将数组中大于nums[index]的元素放在数组的右侧;再分别对小于nums[index]序列和大于nums[index]的序列进行排序。代码如下:#include <stdio.h>#include <vector>#include...
2019-08-14 00:36:24
103
原创 插入排序
插入排序和冒泡排序,之前一直特容易混淆。。。。。插入排序:想起小时候的桥牌,即每摸一张牌,就要将牌插入到已经排好序的序列中。假设输入是数组nums,要将数组升序排列,依次从头至尾对数组执行如下操作:比较当前元素nums[i]与nums0~numsi-1;若num[i] 大于其中某一个元素j (j的范围0~i-1),先将j~(i-1)位置上的元素依次后移,然后将nums[i]插入至j位置。对于...
2019-08-10 17:04:49
123
原创 两数之和
简介:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(L...
2019-08-08 13:56:52
128
原创 归并排序
我理解的归并排序--------归并,即小块区域的排序,然后依次将小块组合成大块。排序的原则是比较,只是比较的方式不同罢了,归并排序方式如下:(1)选取一个中间位置mid = low + (high -low)/2;(2) 然后分别从数组第一个元素arr[low](标注为fisrt)和中间位置后第一个元素arr[mid+1](标注为last)进行比较;(3)申请临时备用temp[],用于...
2019-08-02 00:08:40
132
原创 C++实现多线程单例
C++实现多线程单例C++实现多线程单例C++实现多线程单例#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&amp;); \ TypeName&amp; operator=(const TypeName&amp;); #include &lt;mutex&gt;template &lt;t...
2018-11-03 20:05:28
659
原创 《见识》吴军——读后感
今天开始读吴军的见识,计划这周末读完该书,本文将记录阅读过程中印象或体会比较深刻片段,并结合生活浅谈自己的感悟。序言:“命”和“运”决定人的一生撒切尔夫人说过: 注意你的想法,因为它能决定你的言辞和行动。 注意你的言辞和行动,因为它能主导你的行为。 注意你的行为,因为它能变成你的习惯。 注意你的习惯,因为它能塑造...
2018-08-04 23:04:46
13777
原创 图解HTTP读书笔记——第1章:网络TCP/IP基础
第1章:网络TCP/IP基础 HTTP作为TCP/IP协议族的一个子集,在学习HTTP之前有必要理解一下TCP/IP协议族。TCP/IP分层管理(1)应用层:决定了给用户提供服务时通信的活动; (2)传输层:为两台主机上的应用程序提间提供端到端的通信;在传输层(TCP协议)把从应用层收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序列号及端口号后转发给网络层;...
2018-08-01 17:14:17
275
原创 单例设计
template<class T> class Singleton { public: static T& Instance() { static m_instance; return &m_instance; } Singleto...
2018-07-18 18:04:02
228
原创 auto类型
auto的限制auto不能用于函数参数;不支持auto类型非静态成员初始化;auto无法定义数组;auto无法推导出模板类型。void func(auto k = 1); //auto不能用于函数参数struct Foo { auto var1_ = 0; //auto不能用于非静态成员 static const auto var2_ = 0;};te...
2018-07-17 02:59:51
1038
转载 ICMP与IGMP的区别
装载:http://www.cppblog.com/yehao/articles/145652.html ICMP与IGMP的区别 ICMP协议,英文全称(Internet Control Message Protocol),就是网际控制信息协议。主要是用于补充IP传输数据报的过程中,发送主机无法确定数据报是否到达目标主机。ICMP报文分为出错报告报文和查询报文两种。若数据报不能到达目...
2018-06-10 23:43:37
13337
原创 C++基础回顾5——类的拷贝、复制和销毁
拷贝构造函数class Foo{ Foo(); //默认构造函数 Foo(const Foo&); //拷贝构造函数}拷贝构造函数的第一个参数必须是引用类型,在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。同样,当一个函数具有非引用的返回类型时,返回值会被用来初始化调用方法的结果。 因此,如果拷贝构造函数的参数不是引用类型,为了调用拷贝构造函数,我...
2018-06-06 01:41:42
356
原创 C++基础回顾4——动态数组
C++语言库提供两种一次分配一个对象数组的方法: 1.new表达式语法——分配内存和初始化一起 2.allocator类,分配和初始化分离。 int *pia = new int[42]; typedef int arrT[42]; int *p = new arrT; //初始化动态分配对象的数组 int *pia = new int[10]; ...
2018-06-06 00:44:17
468
原创 C++基础回顾4——智能指针shared_ptr
———-引入智能指针的目的,个人;理解有如下两点: 1.自动释放内存:智能指针类能记录多少个shared_ptr指向相同的对象,并在引用计数值为0时自动释放对象所占用的内存。 2.内存共享:让多个对象共享底层数据。C++动态内存(malloc &amp;amp; free, new &amp;amp; delete)程序使用动态内存出于以下三种原因之一:程序不知道自己需要使用多少对象程序不知道...
2018-06-04 23:55:09
214
原创 初识Haphoop
问题:1.Haphoop概述可靠的、可扩展的、分布式的框架(大数据数据体量大,所以采用分布式的多线程方式);The project includes these modules:Hadoop Common: The common utilities that support the other Hadoop modules. Hadoop Distributed File Sys...
2018-05-31 23:28:02
548
原创 大数据概述
面临的挑战 1.对现有数据库管理技术的挑战; 2.经典数据库技术并没有考虑数据多类别; 3.实时性的技术挑战; 4.网络架构、数据中心、运维的挑战; 5.数据隐私; 6.数据源的复杂性;系统瓶颈 存储容量->MapReduce 读写速度->BigTable 计算效率->GFS学好大数据 1.框架官网——Hadhoop(坚持每天看一点) 2.项目实战 ...
2018-05-31 22:14:24
200
原创 记录第一次出差
阶段一:今天是入职以来第一次出差,些许激动,些许困意,一大早和师父来到北研(dongdian)吃早点然后准备给运输服务器的同事搭把手,这一点师父是想得周全的,作为职场老油条的新人,偶尔会有种不操心的情绪带入工作中。然鹅联系上系统部的A,A说他还在地铁上等会他直接去客户公司(dayang)。作罢,我和师父慢悠悠准备闲逛至客户公司(因为我们早到了,距离约定时间还有四五十分钟)。 在闲逛途中,A...
2018-05-30 23:58:29
429
原创 人人都是产品经理——一切从Kick Off开始
毕业不到一年,花了七八个月在公司做个一个产品(vGPU虚拟化项目),因为大部分只涉及应用层,故项目本身难度不大,但是效果出来颇有失人意,具体存在问题如下:1.需求及功能点不明确:作为开发人员,不明了项目具体的需求及需要开发的功能点,也没有全面完善的分析整个项目实现需要采取何种方式实现,例如,抓图是用SharedSurface、DiffMap还是HWEncode?感觉一直跟着领导边学边做。2...
2018-05-26 12:38:17
4099
原创 C++基础回顾3——顺序容器
顺序容器概述vector:可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素可能会变得很慢。deque:双端队列,支持快速访问,在头尾插入\删除速度很快list:双向列表,只支持双向顺序访问,在list中任何位置进行插入\删除操作速度都很快forward_list:单向链表,只支持单向顺序访问。在链表任何位置 进行插入\删除操作速度都很快array:固定大小数组,支持快速...
2018-05-10 23:09:21
233
原创 C++基础回顾2
IO库istream(输入流)类型,提供输入操作; ostream(输出流)类型,提供输出操作; cin:一个istream对象,从标准输入读取数据; cout:一个ostream对象,从标准输出读取数据; cerr:一个ostream对象,通常用于输出程序错误消息,写入到标准错误; “>>”:运算符,用来从一个istream对象读取数据; “<<...
2018-05-08 16:36:20
185
原创 C++基础回顾一
类的易忘特性:近期,翻看基础的《C++ Primer》,温故而知新,希望自己养成好习惯,在某一领域深耕耘,路漫漫而修远,吾将上下而求索。1.类的内联成员函数:在类中常有一些规模较小的函数适合于被声明成内联函数,定义在类内部的成员函数是自动inline的。2.可变数据成员-mutable 可变数据成员永远都不是const,即使它是const对象的成员。 class ...
2018-05-07 21:42:10
162
原创 顶层Const和底层Const——函数重载
顶层Const和底层Const——函数重载Const指针的意义不希望改变指针的指向,这个指针指向的值不希望被改变。不希望改变这个指针所指向的值。int a = 4; int b = 5; int *const ptr = &a; ptr = &b; //错误,顶层指针,表示指针本身是个常量不准许改变const int* ptr = &b; *pt...
2018-05-02 23:40:08
1096
1
原创 C++之值传递和引用传递
值传递和引用传递值传递 当实参的值被拷贝给形参时,实参和形参是两个独立的变量,我们说实参被值传递或者函数被传值调用。- 普通形参 形参与实参独立,对形参的改变不会影响实参。 int i = 0; void change(int z) { z = 43; //i的值仍为0 } change(i);上述代码执行完毕后i的值仍是0;- 指针形...
2018-04-24 09:28:13
1388
转载 C++之RAII(Resource Acquisition Is Initialization)
转载:https://www.jianshu.com/p/b7ffe79498be什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在...
2018-04-12 20:58:03
531
原创 C++之虚析构函数
C++之虚析构函数用法:当且仅当类中包含一个以上的虚函数时才将析构函数设置为虚函数;无故将类的析构函数设置为虚函数会影响性能,因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。当类中包含纯虚函数时,该类为抽象类,具有作为基类的打算,若析构函数未申明为纯虚函数可能会造成内存泄漏。解决的问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象 鸡生蛋蛋生...
2018-04-12 20:19:09
220
原创 Java线程池:ThreadPoolExecutor的使用
Java线程池:ThreadPoolExecutor的使用通过ThreadPoolExecutor构建BIO伪异步I/O通信的例子深入理解Java中线程池的概念。- Thread vs Exector首先,捋清楚ThreadPoolExecutor的来龙去脉!!! Java中创建线程的方法如下:new Thread(new Runnable() { @Override...
2018-04-12 00:50:40
465
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人