C 语言:

C语言,内存管理
1.变量:
全局变量(外部变量):出现在代码块{}之外的变量就是全局变量。
局部变量(自动变量):一般情况下,代码块{}内部定义的变量就是自动变量,也可使用auto显示定义。
静态变量:是指内存位置在程序执行期间一直不改变的变量,用关键字static修饰。代码块内部的静态变量只能被这个代码块内部访问,代码块外部的静态变量只能被定义这个变量的文件访问

c语言内存存储空间

c语言代码段,数据段位置
内存管理的目的
如果明确知道数据占用多少内存,那么数据量较小时用栈,较大时用堆;
如果不知道数据量大小(可能需要占用较大内存),最好用堆(因为这样保险些);
如果需要动态创建数组,则用堆。

系统管理内存
操作系统在管理内存时,最小单位不是字节,而是内存页(32位操作系统的内存页一般是4K)。比如,初次申请1K内存,操作系统会分配1个内存页,也就是4K内存。4K是一个折中的选择,因为:内存页越大,内存浪费越多,但操作系统内存调度效率高,不用频繁分配和释放内存;内存页越小,内存浪费越少,但操作系统内存调度效率低,需要频繁分配和释放内存。

IP网络协议

智能指针:
1.unique_ptr
unique_ptr 由 C++11 引入,旨在替代不安全的 auto_ptr
它持有对对象的独有权——两个unique_ptr 不能指向一个对象,即 unique_ptr 不共享它所管理的对象。它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL)算法。只能移动 unique_ptr,即对资源管理权限可以实现转移。这意味着,内存资源所有权可以转移到另一个 unique_ptr,并且原始 unique_ptr 不再拥有此资源。实际使用中,建议将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。因此,当需要智能指针用于存 C++ 对象时,可使用 unique_ptr,构造 unique_ptr 时,可使用 make_unique Helper 函数。

2.auto_ptr
auto_ptr 同样是 STL 智能指针家族的成员之一,由 C++98 引入,定义在头文件。其功能和用法类似于 unique_ptr,由 new expression 获得对象,在 auto_ptr 对象销毁时,他所管理的对象也会自动被 delete 掉。

3.shared_ptr
shared_ptr 是一个标准的共享所有权的智能指针,允许多个指针指向同一个对象,定义在 memory 文件中,命名空间为 std。shared_ptr最初实现于Boost库中,后由 C++11 引入到 C++ STL。shared_ptr 利用引用计数的方式实现了对所管理的对象的所有权的分享,即允许多个 shared_ptr 共同管理同一个对象。像 shared_ptr 这种智能指针,《Effective C++》称之为“引用计数型智能指针”

4.weak_ptr
weak_ptr 被设计为与 shared_ptr 共同工作,可以从一个 shared_ptr 或者另一个 weak_ptr 对象构造而来。weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它更像是 shared_ptr 的一个助手而不是智能指针,因为它不具有普通指针的行为,没有重载 operator* 和 operator-> ,因此取名为 weak,表明其是功能较弱的智能指针。它的最大作用在于协助 shared_ptr 工作,可获得资源的观测权,像旁观者那样观测资源的使用情况。观察者意味着 weak_ptr 只对 shared_ptr 进行引用,而不改变其引用计数,当被观察的 shared_ptr 失效后,相应的 weak_ptr 也相应失效。

TCP/IP协议
在这里插入图片描述
在这里插入图片描述

分布式架构负载均衡
DNS负载均衡,HTTP负载均衡,IP负载均衡,链路层负载均衡

DNS负载均衡:
将DNS作为第一级负载均衡,A记录对应着内部负载均衡的IP地址,通过内部负载均衡将请求分发到真实的Web服务器上。一般用于互联网公司,复杂的业务系统不合适使用
在这里插入图片描述
IP负载均衡
在网络层通过修改请求目标地址进行负载均衡
用户请求数据包,到达负载均衡服务器后,负载均衡服务器在操作系统内核进程获取网络数据包,根据负载均衡算法得到一台真实服务器地址,然后将请求目的地址修改为,获得的真实ip地址,不需要经过用户进程处理。
真实服务器处理完成后,响应数据包回到负载均衡服务器,负载均衡服务器,再将数据包源地址修改为自身的ip地址,发送给用户浏览器
在这里插入图片描述
链路层负载均衡
在通信协议的数据链路层修改mac地址,进行负载均衡
数据分发时,不修改ip地址,只修改目标mac地址,配置真实物理服务器集群所有机器虚拟ip和负载均衡服务器ip地址一致,达到不修改数据包的源地址和目标地址,进行数据分发的目的。
实际处理服务器ip和数据请求目的ip一致,不需要经过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。也称为直接路由模式(DR模式)
在这里插入图片描述
混合型负载均衡
由于多个服务器群内硬件设备、各自的规模、提供的服务等的差异,可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务(即把这多个服务器群当做一个新的服务器群),从而达到最佳的性能。将这种方式称之为混合型负载均衡
以上模式适合有动静分离的场景,反向代理服务器(集群)可以起到缓存和动态请求分发的作用,当时静态资源缓存在代理服务器时,则直接返回到浏览器。如果动态页面则请求后面的应用负载均衡(应用集群)
在这里插入图片描述

在这里插入图片描述
三、负载均衡算法
常用的负载均衡算法有,轮询,随机,最少链接,源地址散列,加权等方式;
3.1 轮询
将所有请求,依次分发到每台服务器上,适合服务器硬件同相同的场景。
优点:服务器请求数目相同;
缺点:服务器压力不一样,不适合服务器配置不同的情况;
3.2 随机
请求随机分配到各个服务器。
优点:使用简单;
缺点:不适合机器配置不同的场景;
3.3 最少链接
将请求分配到连接数最少的服务器(目前处理请求最少的服务器)。
优点:根据服务器当前的请求处理情况,动态分配;
缺点:算法实现相对复杂,需要监控服务器请求连接数;
3.4 Hash(源地址散列)
根据IP地址进行Hash计算,得到IP地址。
优点:将来自同一IP地址的请求,同一会话期内,转发到相同的服务器;实现会话粘滞。
缺点:目标服务器宕机后,会话会丢失;
3.5 加权
在轮询,随机,最少链接,Hash’等算法的基础上,通过加权的方式,进行负载服务器分配。
优点:根据权重,调节转发服务器的请求数目;
缺点:使用相对复杂;

四、硬件负载均衡

采用硬件的方式实现负载均衡,一般是单独的负载均衡服务器,价格昂贵,业界领先的有两款,F5和A10。

DNS 解析
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网
DNS解析是分布式存储的,比如根域名服务器ROOT DNS,只存储260个顶级域名的DNS服务器的ip地址。顶级域名服务器如.com的DNS服务器,存储的则是一些一级域名的权威DNS服务器地址(如suning.com,qq.com,163.com的DNS)。而suning.com的权威DNS存储的才是具体的主机记录(如A记录,cname记录,txt记录)
1根域名服务器(ROOT):根服务器主要用来管理互联网的主目录,全世界IPv4根服务器只有13台(这13台IPv4根域名服务器名字分别为“A”至“M”),1个为主根服务器在美国。其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。根服务器中有经美国政府批准的260个左右的互联网后缀(如.com、.net、.cn等)。
**2顶级域名服务器:**负责解析本身顶级域名下一级域名对应的权威DNS服务器地址。
**3localDNS:**本地DNS,一般是运营商的dns,主要作用是代理用户进行迭代解析
**4 本地host记录:**这个优先级最高可以在自己电脑自定义域名的解析记录,如果本机有就不会再往上迭代。PC的host(C:\Windows\System32\drivers\etc\hosts)

(三)DNS解析的过程
1用户在浏览器输入网址www.suning.com
2浏览器先查询本地host是否有记录,有则直接返回ip地址给浏览器。没有则进一步查询。
3向运营商localDNS发起请求,若localDNS的缓存中有记录,则直接返回给用户,若没有则进行迭代查询。
4localDNS首先向根域名服务器发起请求,询问.com的域名服务器地址是什么,ROOT服务器返回.com的域名服务器a到m.gtld-servers.net.这么多台。
5 localDNS收到.com的GTLDDNS地址后,向其中一台a.gtld-servers.net.发起请求,查询suning.com的域名服务器地址是什么,GTLD返回suning.com的权威DNS服务器有这些。
6localDNS收到suning.com的权威DNS后,向其中一台权威DNS发起请求,查询,www.suning.com的解析值是什么,权威dns返回域名有cname,于是从新按照上面步骤查询cname的解析值,直到查询到ip地址为止。

多子域名
因为有很多子系统的时候用不同的子域名对于开发、部署和管理都能方便很多,而且对于用户访问量很大的站点,可能每个子域名都会有很多的服务器来伺服。这是比较符合目前很多站点的模式和需求的。
要求所有站点在同一父域名之下。在同一个域名下不同子域名之间的单点登录

有状态、无状态应用服务
状态化服务器: 服务器端要保存请求的相关信息,后续的每个请求可以默认地使用以前的请求信息。
无状态服务器: 服务器端所能够处理的过程必须全部来自于请求所携带的信息,以及其他服务器端自身所保存的、并且可以被所有请求所使用的公共信息。eg:WEB服务器,每次HTTP请求跟以前都没有任何关系。一次完整的web请求,获取到相关的url信息后,就把连接杀死,不会留下任何痕迹。

数据库分区、分表、分库、分片

分区
就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的

分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。

分库
一旦分表,一个库中的表会越来越多

服务容错模式
舱壁隔离
隔离了每个工作负载或服务的关键资源,如连接池、内存和 CPU。使用舱壁避免了单个工作负载(或服务)消耗掉所有资源,从而导致其他服务出现故障的场景。这种模式主要是通过防止由一个服务引起的级联故障来增加系统的弹性

故障处理恢复机制

恢复机制恢复的实施有预置重路由与动态重路由两种方法,预置重路由就是在故障发生之前预先为工作连接计算好恢复路由,当故障发生时,激活该连接取代故障连接;动态重路由就是在故障发生时,实时地为工作连接计算恢复路由、选择备用资源、建立新连接以代替故障连接。

Paxos 算法
节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)

Map/Reduce 操作
MapReduce是一种需要在Hadoop集群上执行的分析程序,也就是说它可以分析的就是在HDFS上所保存的相关数据,在之前见到过一个单词统计程序,实际上现在也可以自己利用MapReduce来实现这样的单词统计程序

容器:
数组:array: begin,rbegin,size,empty,at,front,back,data,swap

双端队列:deque: begin,end,rbegin,rend,size,max_size,resize,at,front,back,push_back,pop_back,insert,erase,swap,clear.

单向链表:forward_list begin,end,rbegin,rend,empty,max_size,front,push_front_pop_front,insert_after,remove,remove_if,sort,reverse
1.forward_list是一个单向链表,只支持单向顺序访问,在链表的任何位置进行插入/删除操作都非常快
2.forward_list只提供钱箱迭代器,因此不支持反向迭代器,比如rbegin()等成员函数。
3.forward_list不提供size()成员函数。
4.forward_list没有指向最末元素的锚点,因此不提供back()、push_back()和pop_back()。
5.forward_list不提供随机访问,这一点跟list相同。
插入和删除元素不会造成“指向至其他元素”的指针,引用和迭代器失效

双向链表:list list是双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块、一个前驱指针和一个后驱指针
1.不支持随机访问;
2.在任何位置插入或删除非常迅速;

图:map
map,其内部数据结构为红黑树,因此所有元素插入到map里面都会排好序,而且搜索过程为平衡二叉树搜索,因此时间复杂度为O(logN)

先进先出队列:queue front()、back()、push_back()、pop_front()、empty() 和 size()
只能访问 queue 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素

集合:set set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。Set中元素的值不能直接被改变。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树。
begin(),end(),rbegin(),crend(),insert(),erase(),key_comp();

堆栈:stack empty,size,top,push,emplace,pop,swap,swap,uses_allocator

unordered_map 利用哈希函数,通过哈希值能快速的查找到所需元素。unordered_map便是采用这种数据结构实现,其为无序映射,unordered _map与map的使用基本一样,都是key/value之间的映射,只是他们内部采用的数据结构不一样,由于unordered_map内部是用散列表来实现快速查找,因此其内部元素完全是一种无序状态。哈希表利用哈希函数,将关键字的哈希值放都一个桶(bucket)里面,具有相同哈希值的放入到同一个桶。

unordered_set: 实现基于hashtable,它的结构图仍然可以用下图表示,这时的空白格不在是单个value,而是set中的key与value的数据包
begin,cbegin,find,count,equal_range,emplace,insert,erase,clear,swap,bucket_count,max_bucket_count,bucket_size,bucket

vector begin,rbegin,cbegin,crbegin,size,max_size,resize,capacity,empty,reserve,shrink_to_fit

(1)、按关键字有序保存元素:map(关联数组:保存关键字----值对);set(关键字即值,即只保存关键字的容器);multimap(关键字可重复出现的map);multiset(关键字可重复出现的set);
(2)、无序集合:unordered_map(用哈希函数组织的map);unordered_set(用哈希函数组织的set);unordered_multimap(哈希组织的map,关键字可以重复出现);unordered_multiset(哈希组织的sest,关键字可以重复出现)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值