自定义博客皮肤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)
  • 收藏
  • 关注

原创 导入gitLab私有库

gitLab导入私有库:1.获取gitlab的token进入Gitlab—>Settings—>Access Tokens,然后创建一个personal access token,这里权限最好选择只读(read_repository)。2.git配置添加access token有了access token后,我们还需要在git中进行配置,这样才能go get下了私有仓库的包,需要把刚刚的token添加进git的请求头中,操作如下:git config --global http.ext

2020-11-27 18:07:03 563

原创 LRU页面置换算法的C++模拟实现

#include<iostream>#include<vector>#include<string>#include<map>#include<algorithm>#include<hash_map>#include<list>#include<assert.h>using names...

2019-08-12 13:34:02 1831

原创 排序(二)

#include<iostream>#include<vector>#include<set>#include<algorithm>#include<stack>using namespace std;//快排非递归int Pritation(vector<int>& vec, int left, ...

2019-08-12 13:31:19 195

原创 定时器

1.定时器的作用:服务器程序管理很多的定时事件,有效的组织这些定时事件,使他们可以在预期的时间点被触发且不影响服务器的主要逻辑,有很重要作用。因此将每个定时事件封装成定时器,使用某种数据结构像链表,排序链表之类的东西将所有定时器连接起来,以实现对定时事件的统一管理。2.Linux提供三种定时方法:①socket选项SO_RCVTIMEO和SO_SNDTIMEO一般用setsockopt...

2019-08-02 15:13:36 403

原创 关于信号

1.发送信号:kill函数/命令kill(pid,信号):pid>0 发送给指定进程信号 pid=0发送给本进程组内的其他进程信号pid=-1 信号发送给处init进程外所有的进程,但是发送者需要拥有对所有目标进程发送信号的权限Pid<-1信号发送给组id为-pid的进程组中的所有成员信号的值一般都大于0若信号取值为0 kill不发送任何信号 但是sig=0可以用来检测...

2019-08-02 15:11:41 184

原创 Kmalloc/vmalloc/malloc

kmalloc,vmalloc都基于slab实现区别:1.分配的位置:kmalloc:分配的内存为内核区的ZONE_NORMOL区,该区的大小在3G+16-896区间内,大小有限不适合开辟太大的空间vmalloc:分配的是ZONE_HIGHMEM高端内存区也就是非连续内存区。malloc:分配的是用户空间的堆区数据kmalloc和vmalloc是分配的是内核的内存mal...

2019-08-02 15:10:43 612

原创 信号

1.发送信号:kill函数/命令kill(pid,信号):pid>0 发送给指定进程信号 pid=0发送给本进程组内的其他进程信号pid=-1 信号发送给处init进程外所有的进程,但是发送者需要拥有对所有目标进程发送信号的权限Pid<-1信号发送给组id为-pid的进程组中的所有成员信号的值一般都大于0若信号取值为0 kill不发送任何信号 但是sig=0可以用来检测...

2019-07-26 14:23:06 135

原创 三种IO复用的比较

1.select没有将文件描述符和事件绑定,,仅仅是一个文件描述符的集合,因此select分为三种不同类型参数分别传入不同的事件。这一方面使得select不能处理更多类型的事件,另一方面由于fd_set集合的在线修改,应用程序下次调用select前不得不重置这三个fd_set集合。poll则把文件描述符和事件都定义在一个结构体pollfd中,任何事件都被统一处理并且内核每次修改的是revent...

2019-07-26 14:22:28 333

原创 关于poll与epoll

一:poll1.poll与select相同,都是在指定时间内轮询一定数量的文件描述符,测试是否有就绪事件2.poll的参数int (struct pollfd* fds,nfds_t nfds,int timeout)fds是一个pollfd结构体类型的数组pollfd类型三个参数:fd表示关注的文件描述符;short events是告诉poll监听fd上的那些事件,是一系列事...

2019-07-26 14:21:52 1326

原创 关于Select

一:注意1.socket上接收到普通数据和外带数据都将使select返回但是socket处于的是不同的状态。前者处于可读状态,后者处于异常状态。对于接受到普通数据时:int connfd=accept(listenfd,(struct sockaddr*)&client_address,&client_addrlength);If(FD_ISSET(connfd,&am...

2019-07-26 14:19:51 224

原创 堆栈区

一:堆栈区1. 一个由C/C++编译的程序占用的内存分为以下几个部分(1)栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 (2)堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,...

2019-04-29 19:37:16 3181

原创 链接时的重定位与符号解析

一:符号解析1.符号表:由汇编器构造,使用编译器输出到汇编语言.s文件中的符号(1)Local符号与global符号任何带有static属性声明的全局变量或者函数的模块都是私有的,即都是local属性的(local属性符号链接器看不到,链接器只关注global符号)(2)伪节每个符号都被分配到目标文件的某个节。但是有三个特殊的伪节,它们在节头部表中是没有条目的的:ABS代表...

2019-04-29 19:32:39 1937

原创 静态库与动态库

(静态库相当于是提前写好的库并且编译好(即为.o文件)等调用时与源文件的.o问价一同链接生成一个完全连接的可执行目标文件,而动态库只是预先加载了动态库中的符号表)1.静态库(.a):将所有的相关的目标文件打包成一个单独的文件称为静态库,当连接器构造一个输出的可执行文件时,只复制静态库中被应用程序引用的目标模块(1)静态库的优点:方便程序移植,因为可执行程序与库函数再无关系,...

2019-04-29 19:27:49 239

原创 目标文件

1.目标文件有三种形式:可重定位目标文件(二进制码和数据组成,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件)可执行目标文件(二进制码和数据组成,可以直接被复制到内存并执行)共享目标文件(特殊的可重定位目标文件,在加载或运行时被动态加载到内存并进行链接)编译器和汇编器生成可重定位目标文件包括共享目标文件链接器生成可执行目标文件2.当前PC平台...

2019-04-29 19:25:59 1065

原创 程序的加载

一:程序执行过程:1. .c/.cpp+.h文件预编译:(1)将所有的”#define”删除,并展开所有的宏定义(2)处理所有条件预编译指令,比如”#if” “#endif” “elif” “else” “#endif”(3)处理“#include“预编译指令,将被包含的文件插入到该预编译指令的位置(4)删除所有的注释(5)添加行号和文件标识名,以便于编译时编...

2019-04-29 19:23:35 265

原创 互斥锁与自旋锁

一:互斥锁:当锁时可用的,调用上锁的API会成功,并且将锁设置为不再可用。当一个进程尝试获取不可用的锁的时候它会阻塞,直到锁被释放。进入临界区时获得锁,退出临界区时释放锁。二:自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。与互斥锁类似,都是为了保护共享资源。互斥锁是当资源被占用,申请者...

2019-04-29 19:21:35 755

原创 关于多进程与多线程

1.多进程与多线程的优缺点以及适用情况:(1)进程:从调度执行角度来说进程时一个正在运行的程序进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意的是,程序并不是进程,实际上两个或者多个进程不仅有可能执行同一程序,而且还有可能共享地址空间。(2)线程:进程内部的一条执行路径,Linux内核并没有现成的概念,线程是通过一个与其他进程...

2019-04-29 19:17:32 215

原创 进程与线程间通讯

进程间通信:相同主机下:管道、信号量、共享内存、消息队列不同主机下:套接字用ipcs查看消息队列,共享内存,信号量管道:半双工,数据只能向一个方向流动(1)有名管道:任意两个进程使用(2)无名管道:父子间使用信号量:加一:v操作 代表释放资源 (原子操作)减一:p操作 代表获取资源 值为0 阻塞 (原子操作)Ipcs 查看信号量Ipcr...

2019-04-23 17:40:33 150

原创 单例模式

一:单例模式:只能生成一个对象的类首先需要将生成对象的接口析构函数和拷贝构造函数的接口屏蔽起来,其次在类中提供一个接口来生成唯一的对象为了防止临时对象的生成需要将该接口的返回值设置为类对象的引用或指针而且这个接口应该是静态的,因为如果不是该接口需要依赖函数对象调用而函数对象又要依赖该接口生成最后 静态接口只能访问静态成员变量,所以还需要定义一个静态对象的指针,并在类外初始化...

2019-04-22 15:13:36 136

原创 TCP粘包问题

TCP粘包:(1)原因:TCP是字节流是无边界的,而udp是消息、数据报,是有边界的。TCP协议流式传输的特点就是:发送者调用发送函数进行数据发送时,发送者并不清楚数据真实的发送情况,协议栈中的TCP的实现根据当时的网络状态决定以多少字节为单位组装数据,并决定什么时候发送这些数据,因此接收者在读取TCP数据数据时并不知道给定的接收函数调用将会返回多少字节从而当流式套接字发送数据...

2019-04-22 14:43:57 211

原创 三次握手与四次挥手

一:三次握手和四次挥手ACK确认序号 SYN请求连接序号 FIN发送端完成发送任务序号(1)为什么三次握手:两次的话,被动发起连接方不能了解到主动发起连接方是否准备好 三次握手过程:发起连接端发送SYN请求连接 另一方回复ACK,以及自身被动请求连接的SYN,并分配资源, 然后主动发起连接方回复确认序号并分配资源 相当于,主动发起连接方将...

2019-04-22 14:39:38 139

原创 TCP与UDP基础

一:UDP协议:允许发送0字节UDP头部:8字节 包括:源端口号、目的端口号、长度、校验和 都为2字节UDP数据:变长理论上,一个IPV4数据报的最大长度是65535字节,这由IPV4头部的16位总长度字段决定除去20字节的IPV4头部和UDP头部8字节 数据最大长度就是65507字节实际上:UDP属于传输层,由下至上来看:以太网(Ethernet)数据帧的长度...

2019-04-22 14:35:55 219

原创 关于网络分层

一:网络OSI七层模型:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层二:五层模型:应用层(http) 传输层(TCP/UDP) 网络层(IP/ICMP) 数据链路层(ARP(通过IP地址获取物理地址)/RARP) 物理层三:TCP/IP四层协议栈:从上到下:应用层、传输层、网络层、网络接口层(1)网络接口层:实际上仅时一个提供接口的作用,用于...

2019-04-22 14:34:35 246

原创 二分查找变形练习

一:x的平方根在C++库中有sqrt函数可以使用,自己实现 int mySqrt(int x) { if (x <= 1) return x; int left = 0, right = x; while (left < right) { int mid = left + (ri...

2019-04-22 14:33:19 125

原创 关于二分查找

一:/*关于二分查找:1.查找目标值:当right=nums.size()-1时,判定条件应该为left<=right right赋值时也应该是mid-1;当right=nums.size()时,判定条件应该为left<right right赋值时也应该是mid;*//*2. 查找第一个不小于(>=)目标值的数*/int search(vect...

2019-04-22 14:30:11 145

原创 调用约定

一:调用约定的影响:(1)影响符号的生成规则(2)影响形参的入栈顺序 我们常用的四种都是从右向左入栈(3)影响形参的开辟和清理方式二:四种调用约定1._cdecl: 开辟:调用方 清理:调用方2._stdcall: 开辟:调用方 清理:调用方3._fastcall:形参字节小于等于四字节:前两个不开辟内存,寄存器带入被调用方,第三个参数开始与_stdca...

2019-04-22 14:24:28 112

原创 new、malloc与delete、free

Malloc与new:1.图解2.详解new和malloc的区别(1)申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念凡是通过new操作符进行内存申请,该内存即为自由存储区。堆、栈、数据段中用new开辟的都可以称为自由存储区堆是操作...

2019-04-22 14:23:26 197

原创 C++常见关键字

一:constC和C++中的区别1.在C语言中。Const int a=10; 不可以做左值但是 int* p=&a;是正确的 a是常变量2.在C++中const修饰的是常量,其值不允许改变 int* p=&a;是错误的,C++中编译期将使用该常量的地方替换成了常量的值,普通指针不可指向3.int arr[a] 在c中 Const int a=10; int...

2019-04-22 14:22:08 5756

原创 静多态与动多态

一:如何判断静多态和动多态1.动多态底层call的是寄存器,而静多态底层call的是函数入口地址二:成为虚函数的条件1.可以取地址,即inline内联函数不可以2.必须依赖对象调用,因为虚函数表是通过对象内存布局的vfptr指向的,即static,构造函数不可以成为虚函数3.析构就可以成为虚函数三:动多态1.对象调用虚函数发生的并不是动多态,只有指针调用时才会发生动多态...

2019-03-11 20:58:58 500

原创 指针与引用

一:指针与引用定义和性质上的差别1.指针:是一个变量存储一个地址,指向内存的一个存储单元 引用:是原变量的一个别名,本质上仍然是同一个2.可以有const的指针,没有const的引用引用可以指向常量,也可以指向变量。例如int &amp;a=b,使引用a指向变量b。而为了让引用指向常量,必须使用常量引用,如const int &amp;a=1; 它代表的是引用a指向一个const...

2019-03-05 20:10:25 214

原创 网络编程三TC三次握手和四次挥手

1.TCP数据被封装在一个IP数据包中,该IP数据包包括IP首部、TCP首部、TCP数据三部分。而在TCP首部中包含了各种信息。此次主要关注其中的标志位,TCP首部的编制位中包含6个标志位。他们中的多个可被同时设置为1,含义分别为(1)URG:紧急指针有效(2)ACK:确认序号有效(3)PSH:接收方应该尽快将这个报文交给应用层(4)RST:重置连接(5)SYN:同步序号用来发起一个连接(...

2019-03-05 19:32:39 491

原创 继承:代码复用

类与类的关系:有三种(1)组合:一个对象是另外一个对象的一部分 是一种 has_a的关系(2)继承:一个对象是另外一个对象的一种 是一种is_a的关系 私有继承是has_a的关系(3)代理:容器适配器的实现一:同名函数的关系1.重载:同作用域同名,参数列表不同2.隐藏:被隐藏的函数任然存在只是看不见3.覆盖:不存在二:基类和派生类的构造顺序:先调用基...

2019-03-05 19:32:28 480

原创 引用和类的初始化列表

一:引用1.引用相当于变量的别名2.引用的底层是一个指针,在使用的地方替换成了指针的解引用(在编译期间,指令生成的时候)3.引用必须初始化4.不许泄露常量的引用给非常量的引用5.引用一个不可寻址的常量时,会产生一个临时量6.标准类型产生的临时量是常量自定义类型产生的非常量7.引用单独使用不参与类型,const单独使用不参与类型,const&amp;结合可参与类型。可以形...

2019-03-05 19:32:05 509

原创 const

1.在C语言中:const int a=10; 此时a不可作为左值 但是int*p=&amp;a;是正确的,在C语言中const修饰的称为常变量2.在C++中上述int*p=&amp;a;表达式即为错误的,因为在C++中const修饰的称为常量,常量的值不允许改变在C++中编译期间会将使用该常量值的地方替换成了常量的值,会使普通指针不可指向3.int arr[]中括号中的数...

2019-03-05 19:31:55 155

原创 进程地址空间

一:进程地址空间1.内核使用内存描述符结构体表示进程的地址空间,该结构体包含了和进程地址空间有关的全部信息。内存描述符由mm_struct()结构体表示。在struct task_struct()中有一个struct mm_struct()*的指针指向该结构体。2.Mm_struct()结构体中包括的域有(1)struct vm_area_struct *mmap指向一个链表,虚拟内存...

2019-03-05 19:31:47 151

原创 排序 (一)

1.排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:选择排序、冒泡排序、插入排序、快速排序、希尔排序、归并排序、堆排序、基数排序等2.各类排序的稳定性:可以通过观察数据是否有跳跃性移动来判断稳定的排序算法:冒泡排序,插入排序,归并排序和基数排序不稳定的排...

2019-03-05 19:31:38 190

原创 进程调度(三上下文切换)

1.抢占和上下文切换上下文切换(也就是切换进程),在schedul()函数中通过context_switch()函数处理进行两个基本工作。context_switch()函数就是执行下一个进程,并返回指向前一个进程的进程结构的指针。context_switch()中的两个主要函数一个是切换虚拟内存映射,另外一个是切换进程/线程的结构。 第一个是由函数switch_mm()完成,该函数使用了许...

2019-03-05 19:31:17 1538

原创 进程调度(一)

一:多任务多任务操作系统就是能同时并发的交互执行多个进程的操作系统 多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行 多任务系统分类:(1)抢占式多任务(2)非抢占式多任务 Linux提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候通知一个进程的运行,以便其他进程能够得到执行的机会。这个强制的挂起动作叫做抢占。进程被抢占之前能够运行的时间是预先设置好的,叫进程...

2019-03-05 17:28:36 516

原创 进程调度(二CFS调度算法)

1.Linux调度的实现CFS调度算法的实现由四部分组成:(1)时间记账:所有的调度器都必须对进程运行时间做记账 CFS使用调度器实体机结构来追踪进程运行记账(定义在sched。好的struct sched_entity)调度器实体结构作为一个名为se的成员变量,嵌入在进程描述符struct task_struct内。 CFS使用vruntime变量来记录一个程序到底运行了多长时间...

2019-03-05 17:28:20 528

原创 fork注意事项

1.Linux中进程的创建方式(系统调用: fork、clone、vfork)(1)fork()(不带参数)和clone()(带参数): 这两者的区别在于fork()是全部复制而clone()则可以将资源有选择的复制给子进程,而没有复制的数据结构则是通过指针的复制让子进程共享,极端情况下一个进程可以clone()出一个线程。所以系统调用fork()无参数,而clone()则带有参数(2)v...

2019-03-05 17:25:25 364

空空如也

空空如也

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

TA关注的人

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