自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 收藏
  • 关注

原创 FTP协议

1.简单来说 FTP协议属于应用层协议,File Transfer Protocol,文件传输协议,简单来说FTP协议是面向文件传输的协议。2.复杂点来说 (1)FTP和HTTP一样都是在Internet上广泛传输的协议,用来在两台计算机之间互相传输文件。相比于HTTP,FTP协议要复杂许多。因为FTP协议要用两个TCP链接,一个是命令链路,用在FTP客户端与服务...

2019-08-30 13:17:35 365

原创 封装,继承,多态

封装: 定义:就是将抽象得到的数据和行为相结合,形成一个有机整体,也就是将数据和代码进行有机的结合,形成类,其中的数据和函数都是类的成员,目的在于将对象的使用者和设计者分开.以提高软件的维护性和可修改性. 特性: 1.结合性,即就是将属性和代码结合.2.信息隐藏性,利用接口机制隐藏内部的实现细节,只留下接口给外界调用3.实现代码的重用. 继承: ...

2019-08-21 14:32:19 188

原创 GET和POST的区别

1、概括对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)2、区别:1、get参数通过url传递,post放在request body中。2、get请求在url中传递的参数是有长度限制的,...

2019-08-12 11:26:15 173

原创 页面置换算法

比较常见的内存替换算法有:FIFO,LRU,LFU,LRU-K,2Q。1、FIFO(先进先出淘汰算法)思想:最近刚访问的,将来访问的可能性比较大。实现:使用一个队列,新加入的页面放入队尾,每次淘汰队首的页面,即最先进入的数据,最先被淘汰。弊端:无法体现页面冷热信息2、LFU(最不经常访问淘汰算法)思想:如果数据过去被访问多次,那么将来被访问的频率也更高。实现:每个数据块...

2019-08-12 10:14:29 193

原创 vector和list的区别

1、概念:1)Vector连续存储的容器,动态数组,在堆上分配空间底层实现:数组两倍容量增长:vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会...

2019-08-11 18:17:42 125

原创 智能指针

C++里面的四个智能指针:auto_ptr,shared_ptr,weak_ptr,unique_ptr其中后三个式C++11支持,并且第一个已经被11弃用。使用智能指针的原因 智能指针的作用是管理一个指针,因为存在一下情况:申请的空间在函数结束结束的时候忘记了释放,造成内存泄漏,使用智能指针可以很大程度上避免这个问题,因为智能指针就是一个类,当超出类的作用域时,类就会调用析构函数,析构...

2019-08-11 16:59:19 143

原创 static关键字的作用

1.全局静态变量在全局变量之前加static,全局变量就定义为一个全局静态变量。内存中的位置:静态存储区,在整个程序运行间一直存在初始化:未经初始化的全局变量会被自动初始化为0(自动对象的值是任意的,除非它被显示初始化)作用域:全局静态变量在声明它的文件之外不可见,准确的说从定义点开始,到文件结束。2.局部静态变量在局部变量之前加上关键字static,局部变量就成为一...

2019-08-10 11:44:15 118

原创 fork()与vfork()的内核剖析

fork() Linux通过clone()系统调用实现fork().这个调用通过一系列的参数标志来指明父,子进程需要共享的资源。fork(),vfork()和_clone()库函数都根据各自需要的参数标志去调用clone(),然后由clone()去调用do_fork(); do_fork()完成创建中的大部分工作,它在定义的kernel/fork.c文件中。该函数调用c...

2019-08-08 12:43:55 160

原创 gcc和g++的区别

共同点:都可以用来编译后缀名为:.c 和.cpp文件。gcc是鼻祖,后来才出现g++;不同点:1.g++会自动链接c++的编译库:比如algorith,string,vector等。2 .gcc会根据后缀名(.c 和.cpp)自动识别是C文件还是C++ 文件,而g++会均认为是C ++文件。3. gcc编译文件少了许多宏,而g++编译文件多了许多宏,类如#defi...

2019-08-07 12:39:33 142

原创 大小端的判断

1.何为大小端 大端模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中 小端模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在 内存的高地址中。2.为什么会有大小端之分 在计算机系统中,我们以字节为存储单位,每个地址的单元都是对应的一个字节,一个字节为8bit.在C语言中,不仅仅是一个字节来存储数据,除了一个字节...

2019-08-07 11:12:18 421 1

原创 用户态切换到内核态(补充)

刚刚看了别的博文,才知道不是只有系统调用才切换到内核态,还有别的操作可以切换到内核; 1.系统调用 这是用户态进程主动要求切换到内核的一种方式,用户态进程通过系统调用申请使用操作系统提供的的服务完成工程的过程,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放了一个中断来实现的,例如Linux的int&a...

2019-08-07 10:12:35 383

原创 从用户态切换到内核态

在Linux系统中,每个系统调用被赋予一个系统调用号。这样通过这个系统调用号就可以关联系统调用。当用户空间执行的进程执行一个系统调用的时候,这个系统调用号就告诉内核需要调用哪个。 内核记录了系统调表中所有已注册过的系统调用的列表,这个表为每一个有效的系统调用指定了唯一的系统调用号。 用户空间程序无法完成的代码。它们不能直接调用内核的中的函数,因为内核驻留在受保...

2019-08-07 09:45:06 1125

原创 二进制中1的个数

思路:对于一个整数,每次与它减一的数做与运算,总会消除它二进制中最右边的1。因此直到它做与运算到0是的次数即为它二进制中1的个数# include<iostream>using namespace std; int fun(int n){ int count = 0; while (n) { count++; n = n &(n - 1); } ...

2019-08-05 20:47:21 209

原创 静态库和动态库

1.何为库 库文件是预先编译好的方法的集合。 在windows系统下,静态库的扩展名为:.lib 动态库的扩展名为:.DLL 在Linu系统下,静态库的扩展名为:.a, 动态库的名称为:.so2.特点 静态库:在链接的过程中,连接器从库文件中取得所需的代码,复制到生成的可执行文件中。因此,静态库在程序的链接阶段被复制到程序中,...

2019-08-05 20:42:10 318

原创 重载,隐藏,覆盖

在C++中同名的函数有三种:1.重载:又称(重定义) 同名 同作用域 不同参数(参数类型,参数个数,参数顺序);#include<iostream>using namespace std;void fun(int a,int b){ cout<<"int int"<<endl;}void fun(double a,do...

2019-08-04 16:36:31 151

原创 原码,反码,补码的计算

一、整数:(1)正数(符号位为0):原码,反码,补码均一致(2)负数(符号位为1):原码:二进制表示反码:符号位不变,其余取反 补码:反码+1 例如-5的原码:1000 0101 反码:1111 1010 补码:1111 1011二、小数(1)正数(符号位为0):原码,反码...

2019-08-04 14:46:25 4897 2

原创 C++的四个强制类型转换

reinterpret_cast:一个指针转化为其他类型的指针时,不做类型检测,操作结果是一个指针指向另一个指针的值的二进制拷贝;static_cast:允许执行隐式转换和相反的转换操作,父类转换为子类是强制转换Son *son=static_cast(father),而子类转换为父类就是隐式转换;dynamic_cast:用于对象的指针和引用,当用于多态类型转换时,允许隐式转换及相反的过...

2019-08-04 14:16:49 191

原创 写时拷贝技术

写时拷贝的主要思想是在复制原来实体的时候,如果复制后的实体不需要进行改变,那么实际上没必要进行实体内容的拷贝,只需建立一个引用指向原来的实体内存,直接应用原来的实体内容即可,只有当需要对复制后的实体进行修改的时候才进行内容的拷贝。写时拷贝技术在很多方面都有应用,典型的有: C++中的写时拷贝技术 ...

2019-08-02 21:03:09 277

原创 长连接与短链接

HTTP1.1版本之前没有长连接,直到HTTP1.1才出现长连接,而且HTTP1.1默认使用长连接。1.什么是长连接和短连接 很多人在这里就会有这样一个误区:http协议分为长连接和短连接 HTTP是应用层的请求/响应协议,HTTP协议只是对客户端发来的请求做出响应,而具体的数据传送以及网络上路由的选择是在传输层和网络层进行的。由此可以得出:建立连接这一过程并不属于应用层...

2019-08-02 20:33:00 198

原创 TCP之流量控制(滑动窗口)和拥塞控制

一,流量控制1.概念 防止发送方发的太快,耗尽接收方的资源,从而使接收方来不及处理。 2.知识点接收端抑制发送端的依据:接受缓冲区的大小 流量控制的目标是接收端,就怕接收端来不及处理。 流量控制的机制是丢包。3.实现流量控制 使用滑动窗口 1.滑动窗口的概念 滑动窗口就类似于一个窗口一般的大小,是用来告诉发...

2019-07-31 15:38:36 957

原创 进程之间的通讯

概念 在每次执行一个程序时,对于操作系统来说就是创建一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。 进程的用户空间是相互独立的,一般而言是不能相互访问的。但是多数情况下进程之间需要相互通讯,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信协调他们的行为。应用场景 数据传输:一个进程需要将它的数据发送给另一个进程...

2019-07-30 19:55:53 177

原创 操作系统的内存管理---分区,分段,分页,伙伴系统,交换分区

1.内存管理方法 内存管理主要包括虚拟地址,地址变换,内存分配和回收,内存扩充,内存共享和保护等功能。2.分区存储管理方式 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区存储管理方式,分区内存管理是把内存分为一些大小相等或不等的分区,操作系统占用一部分,其余的分区由应用程序使用,每一个应用程序占用一个或多个分区。分区式内存管理虽然可以支持并发,但...

2019-07-28 17:01:20 1917

原创 高并发模式———领导者/追随者模式和半同步/半异步模式

高并发模式  高并发模式的意义:对于IO密集型的操作,因为IO操作速度远远小于CPU的计算速度,所以,如果程序阻塞于IO操作将大量浪费CPU。但是如果多线程的情况下,被IO阻塞的线程可以放弃CPU(或操作系统调度),将执行权限转移给其他线程。高效率的使用CPU。半同步/半异步模式  这里的同步模式是指程序按照代码序列的顺序执行,异步是指程序执行需要由系统事件来驱动 ...

2019-07-25 14:42:33 323

原创 软链接与硬链接

我们都知道文件都有文件名和数据,这在Liunx中被分为两部分:用户数据与元数据。用户数据即文件数据块,数据块是记录文件的真实内容的地方;而元数据则是文件的附加属性,如文件大小,创建的时间,所有者等信息。在Liunx中,元数据的inode号(inode是文件元数据的一部分但并不包含文件名,inode号即索引节点号)才是文件的唯一表示而非文件名。文件名仅是为了方便人们的记忆和使用,系统...

2019-07-24 19:34:31 115

原创 HTTP协议详解

一,概念 协议是指计算机通讯网络中两台计算机之间进行通信所必须共同遵守的规定或者规则,超文本传输协议(HTTP)是一种通讯协议,它允许超文本标记语言(HTML)文档从web服务器传送到客户端的浏览器 HTTP协议,即超文本传输协议。是一种详细规定了浏览器和万维网服务器之间相互通讯的规则,通过因特网传送万维网文档的数据传送协议。 HTTP协议是用于从www服务器传输超文本到...

2019-07-23 18:42:22 617

原创 浅谈const, 引用(&) ,内联函数(inline)的用法。

const在C语言中,const修饰的变量被称为常变量,编译阶段,不能做左值,其他处理和变量一样。在C++中,const修饰的变量被称为常量,在编译阶段,把用到常量的地方替换成常量初始化的值 注意:1.常量一定要初始化 2.不允许常量做左值 3.不允许间接修改,杜绝间接访问来修改常量风险 。全局变量: 在C语言中,const修饰的全...

2019-07-22 19:47:02 455

原创 进程,线程与协程

一.进程 进程,直观的说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统,分配系统资源(CPU时间片,内存等资源),进程是资源分配的最小单位。进程间的通讯:管道,命名管道,消息队列,信号量,共享内存,到套接字。特征: 动态性:进程的实质是程序在多道程序系统中的一次执行过程,...

2019-06-26 14:50:28 108

原创 详解TCP的三次握手和四次挥手及面试中遇到问题

序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个...

2019-05-21 19:13:10 225

原创 同步,异步与阻塞,非阻塞

1.同步与异步 同步与异步关注的消息通讯机制,针对应用程序与内核的交互而言的。 同步:发出一个调用时,在没有得到结果之前,该调用就不会返回。但是一旦调用返回,就得到了返回值,换句话说就是由调用者主动的等待调用的结果。执行一个操作之后,等待结果,然后才继续执行后续操作 异步:异步过程中进程触发IO操作以后,直接返回,做自己的事情,IO交给内核来处理...

2019-05-07 18:57:17 153

原创 结构体,联合体,类的大小计算

1.结构体的大小 当结构体为空时,其大小为1;#include<iostream>using namespace std;struct s{};int main(){ cout<<sizeof(s)<<endl; return 0;}结构为:选取结构体中类型字节数量最大的为内存对齐。注意:最大的类型数字节。...

2019-04-27 19:56:43 270

原创 系统调用函数与库函数

一.什么是系统调用函数和库函数 系统调用函数是指:通向操作系统本身的接口,是面向底层硬件的。可以使得用户态的进程与硬件设备(如CPU,磁盘,打印机)进行交互的,是操作系统留给应用程序的一个接口。如一下 open: 打开文件或设备 read: 从打开的文件或设备...

2019-04-26 16:19:57 1463

原创 线程同步

一、线程同步和线程互斥 1、线程同步:线程同步指的是多个线程之间协调同步,按照预定的先后次序进行运行,这种先后次序取决于要完成的特定任务,最基本的场景就是:A线程要完成的任务依赖于B线程的数据。 2、线程互斥:线程互斥是指对于线程共享的线程资源,在各个线程访问时具有排它性。当有若干个线程要访问同一共享资源时,任何时刻只允许一个线程进行访问,直到占有资源者放弃使...

2019-04-22 20:23:35 163

原创 I/O复用函数 select poll 和epoll的 区别

函数原型: select: int select(int nfds.fd_set*readfds, fd_set* writefds, fd_set* exceptfds,struct timeval* timeout); 注释:timeout参数用来设置select函数的超时时间,如果timeout的参数都传递为0,则select将立即返回,如果传递为NULL,则sel...

2019-04-22 18:42:27 111

原创 运算符重载时要遵循的原则

1.除了类属关系运算符“ . ”,成员指针运算符“ .* ”,作用域运算符“ :: ”,sizeof运算符和三目运算符“ :?”以外,C++中的所有运算符都可以重载。 2.重载运算符限制C++语言中已有的运算符范围内的允许重载的运算符中,不能创建新的运算符。 3.运算符重载的实质是函数重载,因此编译程序对运算符重载的选择遵循函数的重载的选择原则。 4.重载之后的运算...

2019-04-22 09:48:33 1113

原创 C++ 虚继承(虚基类表指针与虚基类表)

在C++中,我们会遇到virtual这个关键字,但是它有两种含义:虚函数和虚继承,它们两个是完全无相关的两个概念。什么是虚继承        虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的...

2019-01-21 21:07:20 3122

原创 工厂模式和观察者模式

工厂模式工厂模式分为三种:即简单工厂模式、工厂方法模式、抽象工厂模式,其实大同小异,总结下来就是:简单工厂模式:一个工厂,多个产品。产品需要有一个虚基类。通过传入参数,生成具体产品对象,并利用基类指针指向此对象。通过工厂获取此虚基类指针,通过运行时多肽,调用子类实现。#include<iostream>#include<string>using names...

2019-01-18 20:53:48 474

原创 深入了解继承与多态(virtual)

  我们先了解一下下面这段代码:#include&lt;iostream&gt;using namespace std;class Base{public: Base(int a =10):ma(a){} void show() { cout&lt;&lt;"ma="&lt;&lt;ma&lt;&lt;endl; }protected: int ma;};clas...

2019-01-17 20:42:51 177

原创 简单了解继承与多态

   何为继承       继承是不修改已存在的类,而是采取这个已存在类的形式,并将代码加入其中的方法,是面向对象复用的重要手段。继承的语法是:在代码中和原来一样给出该类的名字,但是在左括号的前面加一个冒号和基类的名字(对于多重继承,要给出多个基类名,用逗号隔开)例如:#include&lt;iostream&gt;#include&lt;string&gt;#include&l...

2019-01-16 21:32:37 389

原创 函数模板&&类模板

函数模板:     首先定义模板类型:#include&lt;iostream&gt;template&lt;typename T&gt;T Sum(T a,T b){ std::cout&lt;&lt; typeid(T).name()&lt;&lt;std::endl; return a + b;}int main(){ std::cout &lt;&lt; Sum...

2019-01-16 17:04:24 449 1

原创 C++中运算符的重载(operator)

 一,什么是运算符重载        operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。        C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。        重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现...

2019-01-15 18:43:39 2330 1

空空如也

空空如也

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

TA关注的人

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