10 2018 档案
摘要:多态中的虚函数表是在运行时创建的还是编译时创建的? 答:虚函数表在编译的时候就确定了,而类对象的虚函数指针vptr是在运行阶段确定的,这是实现多态的关键 (类的函数的调用并不是在编译时就确定的,而是在运行时才确定的,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以声明为虚函
阅读全文
摘要:类中的静态成员函数: 1.函数的行为对所有派生类都一致时,可以声明为静态。 2.因为静态成员函数只跟类有关跟类的实例无关,因此它不需要this指针 3.静态成员函数由于是不与任何对象相关联的,所以是没有this指针的。从这里也可以知道静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成
阅读全文
摘要:在TCP通信中 client是主动连接的一方,client对server的IP的地址提前已知的。如果是未知则是没办法通信的。 server是在accpet返回的时候知道的,因为数据包中包含客户端的IP地址 在UDP通信中 UDP是没有三次握手建立连接的,那么是如何进行通信的? client是主动连接
阅读全文
摘要:1.类成员中存在常量,如const int a,只能用初始化不能复制 2.类成员中存在引用,同样只能使用初始化不能赋值。 3.提高效率 关于提高效率在《Effective C++》条款12 尽量使用初始化而不要在构造函数里赋值,是这样说的: 前面最初的类模板不包含 const 和引用成员。即使这样,
阅读全文
摘要:《C++应用程序性能优化》《深度探索C++对象模型》笔记 运行结果: 解析:静态数据成员static int count 存储在全局/静态存储区中,并不作为对象占据的内存的一部分,sizeof返回的大小不包括count所占据的内存的大小,而非静态数据成员int value和char c存储在对象占据
阅读全文
摘要:在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求。这个套接字不能用于与客户端之间发送和接收数据。 accept()接受一个客户端的连接请求,并返回一个新的套接字。所谓“新的”就是说这个套接字与socket()返回的用于监听和接受客户端的连接请求的
阅读全文
摘要:注:下面的所有结果都是在小端机器上实现的。 union:多个变量共享一块内存 运行结果: 解释:下面是变量在内存中的存放位置 变量a内存大小是4个字节,所以存放在整个内存中,变量b内存大小是一个字节,所以只是存放在内存的低地址的第一个字节,小端机器上会把低位字节存放在低位地址上,当做aa.a=1;时
阅读全文
摘要:以下均是在VS2017下的结果 结构体内存大小的计算: 用例一: 输出 16 解析:对齐规则是按照成员的声明顺序,依次安排内存,对齐字节数为最大成员变量的字节大小,偏移量为最大成员变量的字节数的整数倍,在这个程序中对齐字节数为4,计算步骤如下: 首先是temp1 四个字节,temp2 一个字节,还剩
阅读全文
摘要:大端:高位字节存放在低位地址,低位字节存放在高位地址 小端:高位字节存放在高位地址,低位字节存放在低位地址 运行结果为: 解析:union是多个变量共享一块内存,此时我们的union中是int 类型的a变量和char 类型的b变量共享一块内存,这块内存的大小是4个字节,而b变量只需要一个字节大小的内
阅读全文
摘要:实例一: 上面这个程序出现的问题是: GetMemory不能动态传递内存,str一直是NULL,strcpy(str,”hello”)会使得程序奔溃 如果要使得GetMemory能够动态传递内存有两种方法可是现实,第一种是用指针的指针来实现,另一种是用指针的引用来实现。 先说第一种,用指针的指针来实
阅读全文
摘要:题目是: 输出结果为: 7 12 解析 先看两个公式&a+i=a+i*sizeof(a); a+i=a+i*sizeof(a[0]); int *ptr=(int*)(&a+1);首先是指向数组a的最后一个元素的下一位,接着是用(int*)进行类型转换,把三维数组转换为一维数组,这是后ptr指针指向
阅读全文
摘要:线程和进程的比较 1.进程是资源分配的基本单位。 2.线程是独立调度的基本单位。 3.在同一个进程中,线程的切换不会引起进程的切换。在不同的进程中进行线程切换,如从一个进程中的线程切换到另一个进程中的线程会引起进程的切换。 4.一个进程至少包含一个线程,线程共享整个进程的资源 5.进程结束后它所拥有
阅读全文
摘要:DNS占用53号端口,同时使用TCP和UDP协议。那么DNS在什么情况下使用这两种协议? DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。 DNS区域传输的时候使用TCP协议: 1.辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传
阅读全文
摘要:一、在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低
阅读全文
摘要:计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小
阅读全文
摘要:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游
阅读全文
摘要:二路归并排序主要运用了“分治算法”,分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题。 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。 二路归并排序主旨是“分解”与“归并” 分解: 1.将一个数组分成两个数组,分别对两个数组进行排序。
阅读全文
摘要:Server 端 第三次的ACK在网络中丢失,那么Server 端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。 而Server重发SYN+ACK包的次数,可以通过设置/proc/sys/
阅读全文
摘要:我们举例,假若从10000万个数里选出前100个最大的数据。 首先我们先分析:既然要选出前100个最大的数据,我们就建立一个大小为100的堆(建堆时就按找最大堆的规则建立,即每一个根节点都大于它的子女节点),然后再将后面的剩余数据若符合要求就插入堆中,不符合就直接丢弃该数据。 那我们现在考虑:确定是
阅读全文
摘要:首先是用两个栈实现队列代码如下: 接下来是用两个队列实现栈 如图所示,我们先往栈内压入一个元素a。由于两个队列现在都是空,我们可以选择把a插入两个队列中的任一个。我们不妨把a插入queue1。接下来继续网栈内压入b,c两个元素。我们把它们都插入queue1。这个时候 queue1包含3个元素a,b,
阅读全文
摘要:1 假设两个链表都没有环 解题思路 a. 直接循环判断第一个链表的每个节点是否在第二个链表中。但,这种方法的时间复杂度为O(Length(h1) * Length(h2))。显然,我们得找到一种更为有效的方法,至少不能是O(N^2)的复杂度。 b. 针对第一个链表直接构造hash表,然后查询hash
阅读全文
摘要:TCP是因特网中的传输层协议,使用三次握手协议建立连接,下面是TCP建立连接的全过程。 TCP断开连接的过程:TCP四次挥手。 TCP/IP 协议簇分层结构 数据链路层主要负责处理传输媒介等众多的物理接口细节; 网络层负责处理数据分组在网络中的活动,包括上层数据报文的分割、选路 等; 传输层则负责为
阅读全文
摘要:本文主要讲述了ARP的作用、ARP分组格式、ARP高速缓存、免费ARP和代理ARP。 1.学习ARP前要了解的内容 建立TCP连接与ARP的关系 应用接受用户提交的数据,触发TCP建立连接,TCP的第一个SYN报文通过connect函数到达IP层,IP层通过查询路由表: 如果目的IP和自己在同一个网
阅读全文
摘要:1、为什么会有COOKIE这种机制 首先一种场景, 在一个网站上面, 我发起一次请求,那服务器怎么知道我是谁?是谁发起的这次请求呢, HTTP协议是无状态的协议, 浏览器的每一次请求,服务器都当做一次新请求, 但是在实际应用中我们需要知道这个请求来自于谁,需要查找哪些信息返回给访问者, 这个时候就引
阅读全文
摘要:k-means 聚类算法原理: 1、从包含多个数据点的数据集 D 中随机取 k 个点,作为 k 个簇的各自的中心。 2、分别计算剩下的点到 k 个簇中心的相异度,将这些元素分别划归到相异度最低的簇。两个点之间的相异度大小采用欧氏距离公式衡量,对于两个点 T0(x1,y2)和 T1(x2,y2),T0
阅读全文
摘要:一,引言 先说个K-means算法很高大上的用处,来开始新的算法学习。我们都知道每一届的美国总统大选,那叫一个竞争激烈。可以说,谁拿到了各个州尽可能多的选票,谁选举获胜的几率就会非常大。有人会说,这跟K-means算法有什么关系?当然,如果哪一届的总统竞选,某一位候选人是绝对的众望所归,那自然能以压
阅读全文
摘要:傅里叶变换 快速傅里叶变换(Fast Fourier Transform,FFT)是一种可在 时间内完成的离散傅里叶变换(Discrete Fourier transform,DFT)算法。 在算法竞赛中的运用主要是用来加速多项式的乘法。 考虑到两个多项式 的乘积 ,假设 的项数为 ,其系数构成的
阅读全文
摘要:题目一: 给定一个非负整数数组,假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。请确认你是否能够跳跃到数组的最后一个下标。 例如:A = [2,3,1,1,4]A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true; A = [3,2,1,0,4]A
阅读全文
摘要:大家都知道,在客户端与服务器数据传输的过程中,HTTP协议的传输是不安全的,也就是一般情况下HTTP是明文传输的。但HTTPS协议的数据传输是安全的,也就是说HTTPS数据的传输是经过加密的。 在客户端与服务器这两个完全没有见过面的陌生人交流中,HTTPS是如何保证数据传输的安全性的呢?下面我将带大
阅读全文
摘要:设置处理信号的功能 指定使用sig指定的信号编号处理信号的方法。 参数func指定程序可以处理信号的三种方式之一: 默认处理(SIG_DFL):信号由该特定信号的默认动作处理。 忽略信号(SIG_IGN):忽略信号,即使没有意义,代码执行仍将继续。 函数处理程序:定义一个特定的函数来处理信号。 或
阅读全文
摘要:socket、TLI、STREAM管道和FIFO为访问局部和全局IPC机制提供广泛的接口。但是,有许多问题与这些不统一的接口有关联。比如类型安全的缺乏和多维度的复杂性会导致成问题的和易错的编程。ACE的IPC SAP类属提供了统一的层次类属,对那些麻烦而易错的接口进行封装。在保持高性能的同时,IPC
阅读全文
摘要:wait系统调用在Linux函数库中的原型是: 进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经 退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就 会一直阻塞在这里,
阅读全文
摘要:在linux编程中,有时候会用到定时功能,常见的是用sleep(time)函数来睡眠time秒;但是这个函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执行该进程的时候,该进程会从sleep函数的下一条语句执行;这样的话就不会睡眠time秒了; 头文件: #incl
阅读全文
摘要:1.引用头文件:#include <unistd.h>; 2.函数标准式:unsigned int alarm(unsigned int seconds); 3.功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如
阅读全文
摘要:Linux提供定时器机制,可以指定在未来的某个时刻发生某个事件,定时器的结构如下: struct timer_list { struct list_head list; unsigned long expires; unsigned long data; void (*function)(unsig
阅读全文
摘要:长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。 比如http的,
阅读全文
摘要:使用golang写一个redis-cli 0. redis通信协议 redis的客户端(redis-cli)和服务端(redis-server)的通信是建立在tcp连接之上, 两者之间数据传输的编码解码方式就是所谓的redis通信协议。所以,只要我们的redis-cli实现了这个协议的解析和编码,那
阅读全文
摘要:1. 前言 编写过C语言程序的肯定知道通过malloc()方法动态申请内存,其中内存分配器使用的是glibc提供的ptmalloc2。除了glibc,业界比较出名的内存分配器有Google的tcmalloc和Facebook的jemalloc。二者在避免内存碎片和性能上均比glic有比较大的优势,在
阅读全文
摘要:运行结果截图如下: 首先说说为什么会这样输出: 1、第一个 “默认构造函数” 是因为vector<Test> vec(1) , 所以事先使用默认构造函数构造了一个Test对象 2、第二个 “默认构造函数” 是因为Test t ,使用默认构造函数构造了一个对象 3、第三个 “移动构造函数” 大多数人会
阅读全文
摘要:首先看拷贝构造函数: 拷贝构造函数中实现了深拷贝处理。再看移动构造函数: 代码构造和拷贝构造函数类似,但是内存的处理不是拷贝而是转移。注意参数类型是右值引用。 移动赋值运算符 赋值运算符的情况和构造函数类似,还是先考察普通的赋值运算符: 再看移动赋值运算符:
阅读全文
摘要:本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数、什么情况下调用赋值运算符。最后,简单的分析了下深拷贝和浅拷贝的问题。 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。但用户可以使用dele
阅读全文
摘要:C++程序有时需要调用其他语言编写的函数,最常见的是调用C语言编写的函数。像所有其他名字一样,其他语言中的函数名字也必须在C++中进行声明,并且该声明必须指定返回类型和形参列表。对于其他语言编写的函数来说,编译器检查其调用的方式与处理普通C++函数的方式相同,但是生成的代码有所区别。C++使用链接指
阅读全文
摘要:备注:volatile的确切含义与机器有关,只能通过阅读编译器文档来理解。要想让使用了volatile的程序在移植到新机器或新编译器后仍然有效,通常需要对该程序进行某些改变。 直接处理硬件的程序常常包含这样的数据元素,它们的值由程序直接控制之外的过程控制。例如,程序可能包含一个由系统时钟定时更新的变
阅读全文
摘要:从4行代码看右值引用 概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的: 这里的int&是对左值进行绑定(但是int&却不能绑定右值),相应的,对右值进行绑定的引用就是右值引用,他的语法是这样的A&&,通过双引号来表
阅读全文
摘要:头文件 #include<list> 声明一个int型的list:list<int> a; 1、list的构造函数 2、begin()和end()通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的end()函数来得到list末端下一位置 3
阅读全文
摘要:C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介
阅读全文
摘要:C++ 11新标准中引入了三个新成员——emplace_front、emplace和emplace_back,这些操作构造而不是拷贝元素。这些操作分别对应push_front、insert和push_back,允许我们将元素放置在容器头部、一个指定位置之前或容器尾部。 当调用push和insert成
阅读全文
摘要:C++中显示转换也成为强制类型转换(cast),有四种:static_cast、dynamic_cast、const_cast、reinterpret_cast。命名的强制类型转换符号一般形式如下: 以下分别介绍 一、static_cast 任何具有明确定义的类型转换,只要不包含底层const都可以
阅读全文
摘要:题目描述 请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error 输入描述: 输入为一行,包含两个字符串,字符串的长度在[1,100]。 输出描述: 输出为一行。合法情况输出相加结果,非法情况输出error 示例1 输入 123 123 abd 123 输出 246
阅读全文
摘要:题目要求是对学生平均成绩进行排序,降序。如果分数相同则按输入的前后顺序输出 输入描述: wu 90 78 66 wang 78 56 li 99 xiaoming 67 89 56 90 输出描述: li 99 wu 78 xiaoming 76 wang 67 解题思路:定义一个Stu类来存放学生
阅读全文
摘要:题目描述 现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵树的高度 输入描述: 输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成, 下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号 输出描述:
阅读全文
摘要:Redis里面使用skiplist是为了实现sorted set这种对外的数据结构。sorted set提供的操作非常丰富,可以满足非常多的应用场景。这也意味着,sorted set相对来说实现比较复杂。同时,skiplist这种数据结构对于很多人来说都比较陌生,因为大部分学校里的算法课都没有对这种
阅读全文
摘要:增加了向前指针的链表叫作跳表。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。 简介 简介 跳表是一个随机化的数据结构,可以被
阅读全文
摘要:strcpy和memcpy主要有以下3方面的区别。 从s1复制字符串到s2 strcpy和memcpy很相似,只不过它在一个终止的空字符处停止。当n>strlen(s1)时,给s2不够数的空间里填充“\0”(n为s2的空间大小);当n<=strlen(s1)时,s2是没有结束符“\0”的,所以使用s
阅读全文
摘要:第一方面:30种mysql优化sql语句查询的方法 第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引。 2.应尽量避免在 where 子句中使用 !=或<> 操作符,否则将引擎放弃使用索引而进
阅读全文
摘要:关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。还是以WordPress来说
阅读全文
摘要:TCP/IP网络协议栈分为四层, 从下至上依次是: 链路层 其实在链路层下面还有物理层, 指的是电信号的传输方式, 比如常见的双绞线网线, 光纤, 以及早期的同轴电缆等, 物理层的设计决定了电信号传输的带宽, 速率, 传输距离, 抗干扰性等等。 在链路层本身, 主要负责将数据跟物理层交互, 常见工作
阅读全文
摘要:ACE是C++库的代表,超重量级的网络通信开发框架。ACE自适配通信环境(Adaptive Communication Environment)是可以自由使用、开放源代码的面向对象框架,在其中实现了许多用于并发通信软件的核心模式。 ACE是C++库的代表,超重量级的网络通信开发框架。ACE自适配通信
阅读全文
摘要:之前写了很多linux下的底层网络API的demo,这些demo可用于了解底层的网络通信过程,但是想做出好的服务器用于实际业务还是非常困难的,需要大量的代码实现,移植性也非常差,想要写出高性能架构的服务器更是需要高深的功力和时间。所以后续关于服务器的内容会使用网络中间件ACE来实现,封装掉底层的复杂
阅读全文
摘要:1、基本知识 poll是Linux中的字符设备驱动中的一个函数。Linux 2.5.44版本后,poll被epoll取代。和select实现的功能差不多,poll的作用是把当前的文件指针挂到等待队列。 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,
阅读全文
摘要:golang主要特性 1、语法简单 舍弃语法糖,严格控制关键字 C++语法糖之多,令人发指,而C又太过于底层,容易出现自己造轮子的情况,如何在两者之间取舍,是每一个转向golang的工程师曾经思考过的问题。 golang的出现,就是在C和C++之间的刚刚好的取舍。 2、垃圾回收 golang支持垃圾
阅读全文
摘要:概览 2xx 成功 2XX 的响应结果表明请求被正常处理了。 200 OK 204 No Content 206 Partial Content 3xx 重定向 3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。 301 Moved Permanently 永久性重定向。 该状态码表示
阅读全文
摘要:String 这应该是应用最广泛的了,简单的 key-value 类型。value 不仅可以是 String,也可以是数字。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。 Set 利用 Redis 提供的 Set 数据结
阅读全文
摘要:外排序问题的出现,主要是因为内存不够。当需要排序的数据量过多,以至于无法一次性把所有的数据都放入内存,这导致了外排序问题的出现。解决大数据量排序的方法是:先分块排序,后进行块合并。 外排序步骤 这就是归并排序在外排序中的应用。 对每块数据进行排序,可以使用各种内排序方法:快速排序、归并排序、堆排序等
阅读全文
摘要:阅读目录 C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开、RAII 异常机制与构造函数 异常机制与析构函数 noexcept修饰符与noexcept操作符 异常处理的性能分析 阅读目录 C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开、RAI
阅读全文
摘要:阅读目录 前言 new与malloc的10点区别 1. 申请的内存所在位置 2.返回类型安全性 3.内存分配失败时的返回值 4.是否需要指定内存大小 5.是否调用构造函数/析构函数 6.对数组的处理 7.new与malloc是否可以相互调用 8.是否可以被重载 9. 能够直观地重新分配内存 10.
阅读全文
摘要:AVL树的介绍 AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1;而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。
阅读全文
摘要:线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。 不过要注意的是线程间需要做好同步,一般用 mutex。 可以参考一些比较新的 UNIX/Linux 编程的书,都会提到 Posix 线程编程,比如《UNIX环境高级编程(第二版)》、《UNIX系统编
阅读全文
摘要:1.什么是共享内存? 共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这
阅读全文
摘要:一、什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。 Linux用宏MSGM
阅读全文
摘要:1.信号量 信号量本质上是一个计数器(不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作),用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。
阅读全文
摘要:不同进程间的通信本质:进程之间可以看到一份公共资源;而提供这份资源的形式或者提供者不同,造成了通信方式不同,而 pipe就是提供这份公共资源的形式的一种。 2.匿名管道 2.1管道的创建 管道是由调用pipe函数来创建 fd参数返回两个文件描述符,fd[0]指向管道的读端,fd[1]指向管道的写端。
阅读全文
摘要:进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享 多个进程之间共享同样的
阅读全文
摘要:更新github上的代码 一、克隆代码 1、先是把自己GitHub上的代码克隆到本地(下载到本地) 步骤1.随便创建一个新文件夹(用来存放下载下来的代码) 步骤2.在文件夹中打开cmd 输入下载指令下载自己在GitHub上的profile 备注:这里的克隆代码有两种方式,一种是上面的方法,另外一种是
阅读全文
摘要:每个进程有自己的地址空间。两个进程中的地址即使值相同,实际指向的位置也不同。进程间通信一般通过操作系统的公共区进行。同一进程中的线程因属同一地址空间,可直接通信。不仅是系统内部独立运行的实体,而且是独立竞争资源的实体。线程也被称为轻权进程,同一进程的线程共享全局变量和内存,使得线程之间共享数据很容易
阅读全文
摘要:1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这时就需要用到非阻塞的编程方式,使用select函数就可以实现非阻塞编程。
阅读全文
摘要:题目有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层??? 每次肯定是由低的楼层往高的楼层尝试,直到在楼层f(k),第一个球已经碎掉了,记录上一个尝试的楼层为f(k-1),在此楼层,玻璃球不会碎,所
阅读全文
摘要:MongoDB属于内存型数据库,在需要读性能要求很高的项目中有着比较不错的表现。可做前段缓存服务器、缓冲数据存储区,同样也可以作为应用系统的存储服务器,例如微博、论坛等应用系统,也可以作为图片存储服务器(分布式);在数据写方面,Mongo也支持比较高的写速率(当然这取决于硬件设备)。这比一般使用硬盘
阅读全文
摘要:简单工厂模式: 常用的场景 例如部署多种数据库的情况,可能在不同的地方要使用不同的数据库,此时只需要在配置文件中设定数据库的类型,每次再根据类型生成实例,这样,不管下面的数据库类型怎么变化,在客户端看来都是只有一个AbstractProduct,使用的时候根本无需修改代码。提供的类型也可以用比较便于
阅读全文
摘要:题目描述把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。输入描述:输入包含多组数据。 每组数据包含两个正整数 m和n(1≤m, n≤20)。输出描述:对应每组数据,输出一个整数k,表示有k种不同的
阅读全文
摘要:最多的比较次数是当两个有序表的数据刚好是插空顺序的时候,比如:第一个序列是1,3,5,第二个序列是2,4,6,把第二个序列插入到第一个序列中,先把第二个序列中的第一个元素2和第一个序列依次比较,需要比较2次(和1,3比较),第二个元素4需要比较2次(和3,5比较,因为4比2大,2之前的元素都不用比较
阅读全文
摘要:示例1: 输出结果为:100 300 500 为什么不是100 500呢? 原因如下: vector erase以后,itor已经指向下一个元素了,不应该执行itor++, 否则会跳过下一个元素,即连续两个300时跳过了第二个300. vector的初始化方式总结: vector<T> v1;//v
阅读全文
摘要:1、平衡二叉树 (1)由来:平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构; (2)特点: 平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则: 非叶子节点只能允
阅读全文
摘要:redis下载地址:https://github.com/MSOpenTech/redis/releases。 解压之后,运行 redis-server.exe 如下图: 不要关闭redis-server.exe窗口,打开redis-cli.exe ,如下图: 接下来就可以实现简单的命令了! 查看所
阅读全文
摘要:分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。 分布式锁是控制分布式系统之间同步访问共
阅读全文
摘要:看了网上很多关于如何在git上创建空文件夹的文章后,发现大家写的都是用指令在本地创建一个空文件夹后再上传指令和步骤都太繁琐且复杂了,对于用git不是很熟练得到人来说太麻烦了,而且在本地于github上的库建立连接的步骤中只要一步出现问题都会出错。 这里我讲解一种最简单的github创建文件夹的方法,
阅读全文
摘要:1. MySQL引擎 区别记忆口诀:“事外行”-“可压空间查询快” 应用场景: 其他引擎: Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。 MySQL的存储引擎为MyISAM 不支持事务是什么意思: 首先要了解数据库里的事务是什么意思。事务在计算
阅读全文
摘要:收录所有数据结构和数据结构相关的简单算法 1. 数组与链表 1.1 数组 定义 所有同类元素存在一块地址连续的区域。 优点 适合随机访问——因为地址连续 缺点 插入和删除效率低——需要移动插入和删除位置之后的元素 不利于扩展——因为需要预先申请空间 1.2 链表 定义 所有元素通过指针连接在一起,彼
阅读全文
摘要:1. 概述 1.1 操作系统基本功能 进程管理 进程控制、进程同步、进程通信、死锁处理、处理机调度等。 内存管理 内存分配、地址映射、内存保护与共享、虚拟内存等。 文件管理 文件存储空间的管理、目录管理、文件读写管理和保护等。 设备管理 完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利
阅读全文
摘要:1. API 2. 建立连接 服务端 服务器端先初始化socket,然后与端口绑定,对端口进行监听,调用accept阻塞,等待客户端连接。 客户端 客户端先初始化socket,然后与服务端连接,服务端监听成功则连接建立完成 3. 示例 服务端 /* File Name: server.c */ #i
阅读全文
摘要:1. 概述 1.1 网络体系结构 1.2 数据在各层之间的传递过程 1.3 TCP/IP 它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。 现在的 TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。 TCP/IP 协议族是一种沙漏形状,
阅读全文
摘要:1. 基础 1.1 事物 ACID Atomicity 原子性,事物不可分 Consistency 一致性,事物执行前后数据一致,即结果正确 Isolation 隔离性,事物之间操作互不干扰 Durability 持久性,一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行
阅读全文
摘要:1.1 什么是Redis? Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 五种类型数据类型为:String, List, Set, Sorted Set, Hash。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩
阅读全文
摘要:本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。 为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delet
阅读全文
摘要:字符串转化为整数可能是实际编程中最常用到的方法了,因为因为string很容易通过下标对每一位的数字进行操作,但是却没办法实现int的加减乘除等,所以在实际编程中经常需要先用string 存下数据,操作完后再转化为int类型 有两种比较实用的方法可以实现 方法一:自己写一个函数来实现 方法二:调用库函
阅读全文
摘要:什么是Nginx? 根据前面的对比,我们可以了解到Nginx是一个http服务器。是一个使用c语言开发的高性能的http服务器及反向代理服务器。Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 Nginx的应用场景 1、 http服务器。Nginx
阅读全文
摘要:一共需要比赛的场次:10场或者11场 8 + 1 + 1 + 1 = 11 场或8+1+1=10场 10场合11场前面的两次比较都是一样的主要区别在于最后两场的比较 解题思路如下: 第一步 全部马分为8组,每组8匹,每组各跑一次,然后淘汰掉每组的后四名,如下图(需要比赛8场) 第二步 取每组第一名进
阅读全文
摘要:一、select函数简介 select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom、connect函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这是就需要用到非阻塞的编程方式,使
阅读全文
摘要:事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。 1 .原子性 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 .一致性 事 务执
阅读全文
摘要:一、主机解析域名的顺序 1、找缓存 2、找本机的hosts文件 3、找DNS服务器 注意: 配置IP和主机名时,要记得修改/etc/hosts文件,因为有些应用程序在主机内的进程之间通信的时候,会本机的主机名,如果主机名不能正确解析到一个正常的IP地址,那么就会导致进程通信有问题。 一、主机解析域名
阅读全文
摘要:处理冲突的方法可以分为两大类:开放地址法和链地址法 开发地址法 开放地址法的基本思想是:把记录都存储在散列表数组中,当某一记录关键字key的初始散列地址H0=H(key)发生冲突时,以H0为基础,采取合适方法计算得到另一个地址H1,如果H1仍然发生冲突 ,以H1为基础再求下一个地址H2,若H2仍然冲
阅读全文
摘要:不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 send函数 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 客户程序一般用send函数向服务器发送请求,而服务器则
阅读全文
摘要:1. 常用命令 2 . 常规用法 2.1 . 初始化本地仓库 创建仓库后可以用于管理文件的版本,包含各种文档和代码 2.2 . 将代码提交到仓库 2.3 . 查看当前状态 用以查看是否有修改还没有提交到git进行管理等等 2.3 . 使用branch 管理不同版本的文件 2.3.1 . 创建分支 2
阅读全文
摘要:阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器端先初始化socket,然后与端口绑定,对端口进行监听,调用accept阻塞,等待客户端连接。 so
阅读全文
摘要:错误如下图所示: 因为thread是C++11新加入的特性,所以我们在用g++编译的时候不能直接用,需要在g++后面加上 -std=c++0x -pthread 如果是gcc编译多线程的话则应该要用 gcc xxx.c -lpthread来编译,因为pthread并不是linux库里面的
阅读全文
摘要:socket函数 为了执行网络I/O,一个进程必须做到第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP、Unix域字节流协议等) 其中family参数指明协议族,它是图4-2中所示的某个常值。该参数也往往被称为协议域。type参数指明套接字类型,
阅读全文
摘要:答案是:accept过程发生在三次握手之后,三次握手完成后,客户端和服务器就建立了tcp连接并可以进行数据交互了。这时可以调用accept函数获得此连接。 TCP Accept总结 TCP Accept 是三次握手以后,Accept正确返回以后TCP Server 可以和Client的连接已建立并可
阅读全文
摘要:首先讲解一种简单容易理解的暴力解法:复杂度为O(n^2) 解题思路是:第一,定义一个pStr指向字符串str,再定义一个p指向pStr,q指向pStr+1; 第二,找出一个字符*p与其下一个字符*q相同位置,比如oo,num++,index = p;然后比较这两个相同字符*p,*q两边的字符是否相等
阅读全文
摘要:任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一
阅读全文
摘要:摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用My
阅读全文
摘要:绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。这里对 Redis 常见问题做一个总结,解决大家的知识盲点。 1、为什么使用 Redis 在项目中使用 Redis,主要考虑两个角度:性能和并发
阅读全文
摘要:1.首先第一步应该是先代码审阅,在审阅多线程代码时,重点要检查与并发相关的错误。 审阅多线程代码需要考虑的问题: 这里,列一下我的清单: 并发访问时,那些数据需要保护?如何确定访问数据受到了保护?是否会有多个线程同时访问这段代码?这个线程获取了哪个互斥量?其他线程可能获取哪些互斥量?两个线程间的操作
阅读全文