- 博客(119)
- 收藏
- 关注
原创 进程和线程的区别,以及应用场景
什么是线程?Linux下线程用进程PCB模拟描述,也叫轻量级进程线程是进程内部的一个执行流,也就是线程在进程的地址空间内运行。一个进程内的所有线程共享进程资源线程是CPU调度的基本单位(CPU调度是按照PCB进行调度的)创建,销毁一个线程相较创建,销毁一个进程成本要低(创建进程要创建PCB,虚拟地址空间,创建页表,维护映射,把硬盘的代码数据加载到内存,文件描述符等等,而创建线程...
2018-09-15 22:39:22 7286
原创 static的用法
1.static修饰普通变量static修饰全局变量:1.作用域:改变链接属性,只在本文件有效,即使extern外部声明也不行,其他文件可定义相同名字的变量2.初始化:只能被初始化一次,如果是整型不初始化就会自动赋值为0,字符型初始化为空3.存储区:静态存储区没变static修饰局部变量:1.作用域:改变链接属性,生命周期在整个文件有效,但是出了其作用域便不可再用,因此作用...
2018-09-15 00:27:09 5799
原创 文件压缩项目源码
Heap.h/堆类#pragma once#include<iostream>using namespace std;#include<vector>#include<assert.h>//仿函数(函数对象)--建小堆template<typename T>struct Less{ bool operator()(const...
2018-09-13 13:30:06 737
原创 日期计算器
一 完成的功能注意:此日历只能用于计算1982年10月15日以及以后的日期1.日期+/-天数=返回日期(处理:1.如果+/-一个负的天数的情况 2.如果加之后,或减之后的日期非法)2.两个日期之间间隔的天数,日期-日期=返回的天数(处理:返回的天数不能为负)3.打印某年某月本月的日历(处理:1982年十月份)二 功能分析三 项目测试点:功能测试:(1)对输入日...
2018-09-13 13:29:32 14124 2
原创 网桥原理分析
网桥工作原理:一 MAC自学习网桥收到一帧后先进行自学习,查找转发表中收到帧的源地址有无相匹配的项目,如果没有,就在转发表中增加一个项目,如果有则把原来的项目进行更新二 帧转发查找转发表中收到帧的目的地址有无相匹配的项目,如果没有通过所有其他接口(进入网桥的接口除外)进行转发,如果有,则按照转发表中给的接口进行转发,但是要注意如果给出的接口是该帧进入网桥的接口,则应丢弃这...
2018-09-01 21:29:56 1842
原创 路由器和交换机的区别?
交换机实际就是多接口的网桥(1)外形上交换机通常端口比较多,路由器端口少体积小,(路由器一般都集成了交换机的功能,LAN口就是作为交换机的端口来使,WAN用于连接外网的端口。(2)工作层次不同交换机在数据链路层(实现数据帧的转发),而路由器在网络层(肩负着网络互连的作用)。(3)数据的转发对象不同交换机是根据MAC地址转发数据帧,而路由器是根据IP地址来转发数据报。IP...
2018-09-01 20:01:17 14298
原创 pthreads提供的锁,你都了解哪些?
互斥锁(也叫互斥量)(不要用在性能敏感的地方使用互斥锁)阻塞互斥锁本质是一个二元变量,其状态为开锁和上锁,常用于多线程访问临界资源时使用,要访问临界资源就要先获取锁访问完之后释放锁,供别人访问。(1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,如果该锁处于锁定状态,则阻塞当前线程。(2)如果不用记得释放锁,这样别的线程,进程才能继续访问。否则造...
2018-08-30 15:14:17 424
原创 谈谈你所了解的封装继承多态?
封装把数据和方法封在一个单元中(称之为类),不想让你看到我就封装成私有的(限制别人去做)提供公共的通道供你访问其实封装本质上就是一种管理,,约束掉自由散漫的访问行为,通过规范的行为做这件事,就像火车站管理一样,你不能随意的进入,如果大家都随意上车,那岂不是乱套了,把火车站封装起来,提供统一通道。封装的意义封装的意义在于保护或者防止代码(数据)被我们无意中破坏,我定义为私有,你没法访问,...
2018-08-30 12:42:03 372
原创 c++四种强制类型的转换
在C语言中我们学习过隐式类型转换(相关类型),以及显示的强制类型转换(不相关类型)void test(){ int i = 1; double d = i;//隐式类型的转换(相关类型) printf("%d,%.f\n", i, d); int *p = &i; int address = (int)p;//显示的强制类型转换(不相关类型) printf("%x,%...
2018-08-28 17:45:06 242
原创 浏览器输入URL后干了什么?
1.URL格式的解析一个URL包括协议,网络地址,资源路径协议:最常用的比如HTTP(超文本传输协议)FTP(文件传输协议)网络地址:可以是域名或者ip地址,包括端口号,如果没有默认为80资源路径:可以是多种多样的2.浏览器将域名解析为ip地址 例如:baidu.com就是域名1.先到各种缓存信息中查找先到浏览器缓存记录中查找------浏览器会缓存DNS一段时间...
2018-08-28 15:30:31 379
原创 C++11新特性
一 auto/decltype:自动推导类型之前的C++标准库里面,必须显示指定变量的类型,然而随着模板类型的出现,某些东西的类型,尤其是函数参数的返回值不是那么容易表示。在这种情况下,将中间结果存储在某个变量中是件很困难的事,要去了解模板的内部结构。c++11提供以下方式两种来缓解上述问题1.定义有显示初始化变量可以用auto来自动确定变量类型2.decltype可以用来在编译期...
2018-08-28 15:23:04 1140
原创 位图与布隆
1K=1024byte1M=1024k=1024*1024byte(约100万个字节)1G=1024M=1024*1024*1024byte(约为10亿个字节)先看一个题,给40亿个不重复无符号整数,给一个无符号整数,快速判断一个数是否在这40亿个数中。判断一个数在或者不在,我们通常有以下方法:1.暴力查找 时间复杂度O(N) 2.排序完,进行二分查找O(N)+O(N...
2018-08-21 17:14:11 277
原创 system V进程间通信-----------共享内存
共享内存:就是指把一段物理内存(共享内存)映射到不同进程的虚拟地址空间,两个进程只要操纵自己的虚拟地址空间便可访问物理内存,从而实现进程间的通信。如下图:要用共享内存进行通信,我们要做到?1.如何让共享内存映射到你进程的虚拟地址空间2.如何创建一个共享内存我们接着往下看创建或打开共享内存创建或打开共享内存函数原型:int shmget(key_t key,si...
2018-08-11 23:03:32 281
原创 system V 进程间通信-------消息队列
进程间通信,顾名思义就是进程和进程通信,也就是进程a和进程b可以访问内核的同一块空间一个放数据,一个取数据,那么这两个进程就完成通信通信了。消息队列也有管道一样的不足:1.每个消息的最大长度是有上限的MSGMAX字节,每个消息队列的总字节数是有上限的MSGMNB,系统中消息队列的总数是有上限的MSGMNI如何查看:cat /proc/sys/kernel/msgmaxcat ...
2018-08-11 21:20:21 190
原创 C++中异常处理
传统的错误处理方法1.终止程序(例如segment error)2.返回错误码3.返回一个合法值,让程序处于非法的状态4.调用一个预先设置的出现错误时掉的函数-------回调函数异常处理异常,当一个函数发现自己无法处理的错误时,抛出异常,让函数的调用者直接或者间接的处理这个问题异常的抛出和捕获1.异常是通过抛出对象引发的,该对象的类型决定了应该激活哪个处理代码...
2018-08-06 16:49:10 298
原创 线程的互斥与同步
什么是互斥?什么是同步?互斥:一个资源一次只能被一个访问者使用(保证访问数据,唯一访问性)举个例子:你去上厕所,门一开,人进去,门锁上,在你上厕所期间别人不能打扰同步:当多个访问者一起工作时并对每个访问者访问的时序有一定限制(保证访问数据,时序访问性)举个例子:你上完厕所,刚出来,本来应该由别人了,但是你此时又进去,你反复的进去出来,导致别人都上不了厕所。因此同步就是保证时序性的,...
2018-08-04 20:52:10 3323
原创 死锁的产生,防止,避免
死锁在多任务系统下,当一个或多个进程等待对方的资源,而在等待对方资源之前不会释放得到的资源,这样造成循环等待的一种现象。产生死锁的原因:竞争系统资源进程的推进顺序不当死锁的四个必要条件:1.资源互斥/资源不共享(每个资源要么已经分配给一个进程,要么是可用的,只有这两种状态,资源不可以被共享使用)2.请求并保持(已经的到资源的进程还可以继续请求新的资源)3.不可剥夺(...
2018-08-04 16:33:08 239
原创 浅析正则表达式
正则表达式:是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述。总结就是:正则表达式就是通过特殊字符+普通字符来匹配特定的字符串。---------是一种模糊匹配grep正则表达式分为三种:1.BREs:指令后不跟任何参数2.EREs:指令后面跟-E参数3.PREs:指令后跟-P参数正则表达式的基本要素:1.字符类2.数量限定...
2018-07-30 11:07:51 204
原创 浅谈传输层
上篇博客讲解了应用层协议,本篇接着讲传输层。一 传输层:负责数据能从发送端到接收端 在TCP/IP协议中用源端口号,源ip,目的端口号,目的ip ,协议号这样一个五元祖来表示一个通信 (用netstat-n查看)二 端口号:标识了一个主机上进行通信的不同的应用程序 端口号划分:0-1023知名端口号 1024-65535操作系统动态分配的端口号 ...
2018-07-23 13:58:09 337
原创 HTTP协议-----------应用层协议
一 引言:协议:就是一种约定,双方为了更好的完成某项活动,而一致遵守的约定。应用层协议:我们程序员自己定义的协议,最常见的应用层协议是http协议二 URL和URI的区别与联系:URI统一资源标识符:用来唯一的标识一个资源 ,但不能定位URL统一资源定位符:是一种具体的URI,即用一个URL可以标识一个资源,而且还指明了如何定位这个资源。三 初识URL以上是一...
2018-07-22 23:31:58 1971
原创 如何实现一个不能被继承的类,如何实现一个只能在堆上生成对象的类,如何实现一个只在栈上生成对象的类
一 如何实现一个不能被继承的类1.类的构造函数给成私有的。2.并且在父类中给一个静态的函数构造对象原因:1.保证了父类的构造函数在子类不可见,但是子类的构造函数是要调用父类的构造函数来合成。 2.但是此时出现了一个问题,把这个类的构造函数弄成私有的,虽然子类不能构造出对象,但是这个类也不能构造出对象了 因此提供一个静态的公有函数来构造对...
2018-07-17 19:50:48 291
原创 求连续子数组最大和
这个问题其实特别简单,但是我就是弄了很久才明白整体思路:定义两个变量cur用来表示当前连续子数组的最大值,sum表示的是最终返回的最大值。cur赋初值为0,然后遍历数组, if(cur+当前数组元素>当前数组元素)那么把这个元素加到cur上去。否则说明最大的连续子数组在当前元素以及当前元素之后所以cur=当前元素。每次都把当前最大cur和max比较,如果大于max则更新max。否则max就...
2018-07-16 11:01:00 239
原创 UDP,TCP报头分析,以及TCP三次握手和四次挥手
*UDP协议* 一 udp协议基本格式 由上图可知udp协议报头信息一共占8字节 1.2字节的目的端口号* 目的端口号保证了准确的将数据报交付应用层 2.2字节的源端口号* 源端口号保证了下一层准确的将信息交给传输层 3.2字节的UDP长度* 用户数据报收发长度确定,因此包含一个UDP长度字段。(udp报头和udp数据长度) 4.2字节的UDP校验和* udp尽管不保...
2018-06-19 00:43:56 689
原创 基础IO----文件描述符,重定向,C库文件操纵函数,系统调用文件操纵函数,软硬链接,inode
一:C语言中的文件IO相关操作fopen函数原型如下:函数参数:1.path为打开文件的相对或者绝对路径 2. mode打开文件的方式常见的文件打开方式: 返回值:如果打开文件成功返回该指向该文件流的指针,失败返回-1...
2018-06-11 13:36:49 463
原创 排序总结,插入排序 选择排序 交换排序 归并排序 计数排序 时间复杂度空间复杂度稳定性详解
排序大体分为两类:比较排序和非比较排序一 各个排序的基本实现1.直接插入排序和希尔排序//整体思路:往一段有序区间插入元素,end标记为有序区间的最后一个元素下标,要插入的元素下标为end+1此处就称tmp,先把他保存起来,(否则可能被覆盖)如果end+1这个元素//比有序区间的小,就把有序区间元素依次向后移动,移动结束条件有两个,1.end变为-1,2.有序区间内找到比tmp小的数。v...
2018-05-25 13:36:34 2065
原创 RUID EUID SUID
在linux系统中每个进程都有两个id: 用户id(uid):你最开始登录的那个用户的id---------------通俗点讲就是你是谁 有效用户id(euid):当你使用su命令,切换了用户。那你的有效用户id就为你su之后的这个用户id-----------------通俗点讲就是你的有效身份是谁uid euid用
2018-05-11 12:08:58 642
原创 简单实现一个日历
思路:1.首先你必须给一个基准年 ,在给出这一年的某一天,是星期几 例如 2000 1 1 星期6 2.那如何求2000 2 1是星期几呢?(1月1号的星期6+一月的天数)%7 要考虑平年闰年 2月天数不一样 3.那如何求2001 1 1是星期几?(2000年的一月一号+2000年的天数)%7 要考虑平年闰年天数不一样 根...
2018-04-27 01:30:50 1913
原创 C++中动态内存管理 new/delete 和new[]/delete[] 和 malloc/free
首先我们先要了解,动态内存是在堆上分配的,内存大小可以变化。动态内存的分配很好的解决了传统静态内存分配不能动态增长的缺陷(静态内存分配是在栈上,由系统自动释放)而且栈来说相对较小(为什么栈较小,假如一个函数递归死循环,会产生栈溢出,如果栈小很快就会栈溢出停下来,而如果栈很大的话,就要很久才会出错)一 C语言中的动态内存管理void *malloc ( size_t n)--------...
2018-04-23 16:44:13 433
原创 "" "\0" '0' '\0' 0 NULL “NULL” 区别与联系
一:字符'0' :char c='0',它的ASCII码为值48,内存中存放00110000字符'\0' :char c='\0',它的ASCII码值为0,表示一个字符串结束的标志(转义字符)数字0 :它的ASCII码值为0,字符表示空字符,数值表示为0,内存中表示00000000二:在数值上NULL ,‘\0' , 0是一样的,都是0.但是'0'就不同了,在ASCII中编码为48. 三:...
2018-04-23 16:34:37 1200
原创 随笔
转眼间又到了四月的尾巴,我也真真的体会到了什么叫时光飞逝,大家也都在为了自己的未来更加的努力着。无论是考研还是就业该有的努力一分都不能少。 也许人都是在一瞬间长大。在以前高中的时候,爸爸会经常打电话问我学习方面的事,也许是觉得那会我还小,怕玩疯了,耽误了学习。而现在爸爸几乎就不再那么频繁的问我关于学习方面的事情,或许是他知道我长大了,或许是怕我有压力,他总是那么的相信我,从不怀疑。也...
2018-04-20 21:10:52 195
原创 浅析红黑树
一 红黑树:首先红黑树是一颗搜索二叉树,树中的每个结点不是红色就是黑色。它的特征如下:1.根节点是黑色2.每个结点不是黑色就是红色3.不能有两个连续的红结点4.每条路径上黑色结点数量相同二为什么要有红黑树?最开始我们学习了搜索二叉树,但是搜索二叉树有可能出现单链的情况,之后我们又引入了AVL树,AVL树是一种高度平衡的二叉搜索树。能够满足增加,删除,查找都是o(lg N)的时间复杂度,为什莫还要引...
2018-04-18 04:39:16 489
原创 栈和队列的相关面试题(详解)
#include<iostream>#include<stack>#include<queue>using namespace std;//实现一个栈,要求实现Push(入栈) Pop(出栈) Min(返回最小值的操作) 时间复杂度为O(1)//方法一:用两个栈实现,先同时往s1,和min里面入第一个元素,接着s1正常入,同时_min入的时候用s1栈顶...
2018-04-09 23:29:32 440
原创 模拟实现栈(静态栈,动态栈)和队列
静态栈:#include<iostream>#include<assert.h>using namespace std;template <class T,size_t N=100>class Stack//栈顶插入,删除 因此适合用顺序表 //静态 {public: void Push(const T&x) { if (_si...
2018-04-09 22:41:52 423
原创 简单迷宫的实现-------------找一条通路
#include<iostream>#include<assert.h>#include<stack>using namespace std;//求解路径的基本思想:1.如果当前路径能够通过,将当前路经进行压栈,为了回退(回溯法),并将走过的路标记成2 不能走1,0可以走//2.如果当前路径上下左右都不能通过,则出栈(回溯)并且将当前路径标为3 即...
2018-04-09 01:58:12 773
原创 模拟实现堆算法,以及堆应用 (Top k问题)
堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构最大堆:每个父节点都大于孩子结点最小堆:每个父节点都小于孩子结点堆的优势:效率高 增加删除的时间复杂度均为O( lg N),不用堆vector插入删除总有一个为O(1),一个为O(N)堆的基本实现:我们先来建个最大堆,首先堆的成员是个数组,而且这个数组不能是固定的大小,因为我们还要实现堆的插入删除,因此我们可以用库中的vector来创建数组。...
2018-04-07 02:43:29 289
原创 会使用STL中的list并且模拟实现list
如何使用list,看如下代码#include<iostream>#include<list>#include<stdlib.h>#include<functional>using namespace std;void PrintList(list<int>& l1){ list<int>::iterato...
2018-04-03 00:29:23 185
原创 AVL树
AVL树全称高度平衡二叉树,它是一种优化了的搜索二叉树。我们知道,由于搜索二叉树存在缺陷,有可能退化成单链,这样的话搜索效率就降低了。为了将二叉搜索树的效率控制在O(logN),所以对二叉搜索树加上一些条件,使得二叉搜索树高度平衡,时间复杂度为O(log N).一 定义: 1.首先AVL树是一个二叉搜索树 2.它的左子树,右子数都是AVL树 ...
2018-03-28 13:13:25 952
原创 二叉搜索树
话不多说,直接上代码。#include<iostream>#include<stdlib.h>using namespace std;template <class K>struct BSTreeNode{ BSTreeNode<K>* _left; BSTreeNode<K>*_right; K _key; BSTre...
2018-03-25 23:54:59 143
原创 二叉树的创建以及递归非递归遍历
#pragma once#include<iostream>#include<stdlib.h>#include<assert.h>#include<stack>#include<queue>using namespace std;template<class T>struct BinTreeNode{ T...
2018-03-25 23:46:54 255
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人