自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

皓皓松的博客

欢迎来到 皓皓松博客,敢想!敢做!敢当!

原创 【C++】单例模式之C++实现

单例模式的概念只允许一个产生一个对象的类单例模式的实现方法1.单例类保证全局只有唯一一个自行创建的实例对象2.单例类提供获取这个唯一实例的接口单例模式的优缺点优点(1)阻止其他度对象实例化自己的副本,保证所有访问唯一性(2)类控制了实例化的过程,所以可以灵活的更改实例化的过程缺点(1)每次都需要检查是否对象已经生成,造成些微的开销(2)使用单例对象时,开

2017-08-15 11:23:13 830

原创 【网络】TCP三次握手建立连接和四次挥手释放链接

TCP协议TCP报文格式TCP建立连接的过程 (1)Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。(2)Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,

2017-07-01 16:48:03 341

原创 【网络】TCP协议中的四大定时器

前言在TCP连接中,有四大定时器来维持连接的正常运行,这四个定时器分别是超时重传定时器、坚持定时器、保活定时器以及时间等待计时器超时重传定时器所谓超时重传,是TCP之所以可靠的一点。该定时器就是当一个TCP报文发送后,启动该定时器。如果在规定时间内,没有收到该报文的确认序号,便重新传输该报文,并将超时重传定时器重置。如果在规定时间内收到了对应报文的确认,则撤销该对该报文的超时重

2017-07-01 15:47:49 488

原创 【C++】内存管理方式

本篇博文旨在介绍C++的内存管理方式,并和C语言中的内存管理方式作出对比;说明了C语言中的malloc/free和C++中的new/delete的区别C中的内存管理方式堆上创建空间栈上创建空间C语言中常见的几种内存泄漏C++中的内存管理方式全局变量、全局静态变量、局部静态变量、局部变量之间的区别?C语言中的malloc/free和C++中的new/del

2017-03-18 22:44:37 1102

原创 【Git】工作区、暂存区与版本库

本篇博文旨在介绍git的工作区,暂存区和版本库的概念;并说明使用git add、git commit 等指令时,对工作区,暂存区以及版本库分别造成的结果;对于会使用git的人,git add,git commit,git checkout ,git reset这些指令应该很熟悉了我们一般使用git,修改好文件后,会用git add 文件名,git commit -m 备注这两条指令,...

2017-03-17 19:40:26 4688 1

原创 【C++】智能指针

本篇博文旨在介绍C++中的智能指针;从为什么引入它开始,分别实现了auto_ptr,scoped_ptr,unique_ptr,shared_ptr等智能指针;介绍了各个智能指针的优缺点以及适用场景;最后用防函数实现了文件指针的管理智能指针概念智能指针是一个类,用它的对象管理着申请的内存空间,并通过作用域、生命周期来保证申请内存的释放,从而防止出现内存泄漏内存泄漏举例//

2017-03-15 21:51:06 1125

原创 【数据结构】布隆过滤器——位图扩展

本篇博文,旨在介绍一种可以快速检索元素是否存在的数据结构 --- 布隆过滤器;本文从位图和布隆过滤器的对比,讨论了使用这两种数据结构的不同情况;并介绍了布隆过滤器的几种主要使用场景布隆过滤器的引入之前学习了位图,可以快速的判断一个整数是否存在于一个集合中然而,现实生活中我们用的很多是字符串,单用位图处理不了字符串,由此引来了位图布隆过滤器的思想学过了哈希表后我们知道字符

2017-02-28 15:19:16 786

原创 【数据结构】位图BitMap

给40亿个不重复的无符号整数,没拍过序。给定一个无符号整数,如何可以高效的判断是否存在这些数据中。直接的想法是,我们将这些的无符号整数存储到内存中,然后用给定的数进行一一比较。我们分析一下,一个无符号整数是4个字节,40亿* 4个字节,10亿个字节大概就是4个G,40亿个无符号整数就是16G计算机内存一般没这么大,就算有这么大,也要分给操作系统什么的吧,直接存储整形不好实现;再说,

2017-02-24 21:21:48 2134

原创 【数据结构】二叉搜索树

概念及其性质二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除

2017-01-20 09:31:45 795

原创 【数据结构】栈的队列的实现

今天,再次实现一下数据结构中的栈和队列这次我们用的是C++实现栈和队列,用到了C++多态的一种特性:泛型编程--模板关于模板这个知识点,我们之前讲过,这次就不多说了Stack.h#pragma once#includeusing namespace std;#includetemplateclass Stack{public: Stack() :_p(NUL

2016-11-27 16:49:13 605

原创 【C++】内联函数和宏的区别

内联函数//定义特性//内联函数和宏的异同1、类型检测内联函数是函数,有参数类型的判断。宏是直接的替换2、替换时机内联函数在编译的时候替换宏在预处理阶段进行替换3、替换的成功率宏一旦定义则在预处理阶段一定会替换内联函数仅仅是对编译器的一个建议如果编译器觉得该函数不适合成为内联 函数时,便会忽略前面的[ inline ]关键字、4、避免副作用传

2016-10-13 18:45:06 623

原创 【Linux】周期任务crontab

crond和crontab的区别crond是一个指令,而crontab是一个文件,用于存放指令的文件crond的概念和crontab是不可分割的。crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。而crond正是它的守护进程。简介cron

2017-07-23 10:46:37 1588

原创 【Linux】子进程的异步等待方式

SIGCHLD当子进程退出时,它会向父进程发送SIGCHLD信号,该信号的默认处理方式为忽略,当父进程以阻塞方式等待时,它不能处理自己的工作。我们自定义一个捕捉信号的函数myhandler#include#include#include#include#includevoid myhandler(int sig){ printf("得到一个信号 : %d 进程号

2017-07-22 16:13:05 1261

原创 【网络】CRC校验

基本概念CRC即循环冗余校验码,是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。基本原理在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的

2017-07-22 15:26:31 1367

原创 【Shell】截取字符串

基本概念在进行脚本编程的过程中,总会遇到截取字符串的问题(就比如从字符串中截取出QQ等信息)好在,Shell下给了我们一些截取字符串的方法下面我来依次介绍这几种方法,并用例子进行验证截取字符串的几种方法(1)# 号结果:删除左边字符,保留右边字符(2)## 号截取结果:删除左边字符,保留右边字符。(3)%号截取结果:删除右边字符,保留左边字符

2017-07-15 16:47:18 981

原创 【Shell】命令代换

命令代换基本概念命令代换的基本思想是,先执行指定的内部指令,然后将其结果替换出来,重新组成新的命令行。两种命令代换的格式(1) 反引号 ``#!/bin/bashDATE=`date`echo $DATE(2) $()#!/bin/bashFILE=$(ls)echo $FILE两者的区别和联系1、反引号适用于所有Unix系统,但是$()

2017-07-15 16:16:37 232

原创 【网络】Select服务器的实现

五种I/O模型Unix下共有五种I/O模型,分别是(1)阻塞式I/O;(2)非阻塞I/O;(3)I/O复用(select和(e)poll);(4)信号驱动I/O(SIGIO);(5)异步I/O(Posix.1的aio_系列函数);阻塞I/O模型应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,一直等待。数据准备好了,从内核拷贝到

2017-07-14 18:44:59 1218

原创 【Shell】Shell语法总结以及简易内存条的实现

基本语法Shell文件的开头Shell的开头需要写成 #!/bin/bash#!这个符号是表示,让系统去调用后面的的参数来解释执行该文本的程序除此之外,还有下列可以用的解释器/bin/sh/usr/bin/es/usr/bin/ksh/bin/ksh/usr/bin/rc/usr/bin/tcsh/bin/tcsh/usr/bin/esh/bin/dash

2017-07-14 17:52:35 298

原创 【网络】UDP服务器的实现

UDP服务器实现的基本步骤(1)利用socket函数创建套接字(2)服务器用bind进行IP和端口号的绑定(3)不需要设置监听状态(4)绑定后直接读写相关函数recvfrom作用用来数据的接收头文件#include#include函数原型int recvfrom(int sockfd, void* buf, ssize_t len, int fl

2017-07-11 17:17:48 1262

原创 【网络】TCP服务器的实现

socket编程基本概念在TCP/IP协议中,IP地址+端口号标识个唯一的一个进程,“IP地址+端口号”就是socket在TCP协议中,建立连接需要两个进程各自有一个socket标识符,这两个socket组成的socket pair就标识着唯一的连接相关概念介绍网络字节序首先呢,我们都知道内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件的偏移也

2017-07-11 11:32:31 261

原创 【网络】TCP报文中的PSH和URG字段的介绍

TCP协议TCP报文格式源端口和目的端口各自占用两个字节,用来表示主机中的通信进程。端口号和IP组合即为套接字序号也叫发送序号,TCP将发送的每一个数据流都进行了编号,整个数据的起始序号在开始连接的时候设置确认序号指接受主机期望收到的下一个报文序号是多少数据内容又称为首部长度,标明TCP首部数据包的长度,单位是四个字节六个控制字符URG紧急指

2017-07-01 11:37:00 672

原创 【网络】端口相关概念介绍

端口基本概念"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口的分类硬件端口硬件方面的端口,又称为接口。代表的有USB端口以及串行端口等。软件端口软件领域的端口主要指的是面向连接的服务以及面向无连接的服务的通信协议的端口,他们是一种抽象的软件结构。主要包含一些数据结构以及缓冲区等网络端口集线器、交换机和路由器的端口指的是链接其他设备的

2017-07-01 10:22:25 561

原创 【Linux】模拟实现sleep函数

本次用到的相关函数介绍alarm函数头文件#includeunsigned int alarm(unsigned int seconds);作用调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。 返回值这个函数的返回值是0或者是以前设定的闹钟时间还余下的秒数。pause函

2017-06-30 17:55:03 432

原创 【网络】arp协议介绍以及Shell脚本进行arp的编写

ARP协议基本概念地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议

2017-06-30 11:31:04 797

原创 【Linux】NAT技术介绍以及代理服务器

NAT基本概念NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法

2017-06-30 10:46:07 325

原创 【Linux】进程间的关系以及终端的概念

进程间关系进程组每个进程都有自己的进程ID,除此之外,每个进程也都属于一个进程组。进程组是一个进程或者多个进程的集合。通常他们和同一个作业有联系,可以接受来自同一个终端的信号。每一个进程组都有一个组ID,这个ID就是该进程组组长的进程ID组长进程可以创建一个进程组,并创建该组中的进程。当一个进程组中的所有进程死亡时,该进程组才会终止。当一个进程组的组长死亡时,只要有

2017-06-28 17:16:41 418

原创 【Linux】守护进程

守护进程基本概念守护进程,又成为精灵进程。它是在后台运行的一种特殊的进程。它独立于控制终端而完成某种独立的任务或等待处理某些发生的事件。守护进程的特点普通进程是由用户进行创建,在运行结束或者用户注销后便会终止;而守护进程不受用户登录注销的影响,是时时刻刻都在跑的进程。Linux下,用户和系统进行交流的界面称之为终端。每一个终端开始运行的进行都会依附这个终端,这个终端就会被这些进

2017-06-28 16:11:12 217

原创 【Linux】线程安全和可重入函数

线程安全所谓线程安全,就是当多个线程访问同一个数据时,不会造成数据出错。其实它是采用了加锁的机制来保证在一个线程访问该数据时,其他的线程不可以访问,直到等到那个线程访问结束才可以访问。而线程不安全,就是没有采用加锁的机制来保证这一点。测试代码#include#includeint g_count = 0;void* threadCount(void* arg){ int

2017-06-28 08:27:42 356

原创 【Linux】信号的阻塞和递达

几个基本概念信号未决:从信号的产生到信号递达的这段时间中的状态,称为信号未决信号递达:收到信号,进行信号的处理信号阻塞:阻塞一种信号后,这种信号将永不递达;只有解除阻塞才可以递达易错点:信号阻塞和信号忽略的概念信号忽略指的是收到了信号,但是不进行任何处理。而信号阻塞是根本收不到信号。信号阻塞表、信号未决表、以及自定义函数表如何处理在解除阻塞前产生的多次信号

2017-06-27 09:54:55 397

原创 【Linux】信号的基本概念

什么是信号生活中有各类的信号,就拿简单的例子来说吧,上下课的铃声,它可以提示我们哪个时间该上课或者下课。但是当我们收到上课铃声的信号后,到底是去上课,还是去玩,这就是看自己的决定方式了。这就表明我们可以忽略该信号,但是我们是知道该信号的意义的,虽然我们没有遵守,是去玩耍了。或者是墨迹一会再去上课,这就表明生活中的信号是可以不立即处理的。而计算机中的信号也是类似,进程可以发送信号,也可以接受

2017-06-25 10:18:36 319

原创 【网络】OSPF协议

OSPF协议基本概念OSPF是一种内部网关协议,它的全称是开放最短路径优先协议。工作原理OSPF协议是让路由器通过发送Hello包来建立邻接关系的每台路由器向各自的相邻路由器发送LSP---链路状态通告信息,这些路由器在收到LSP报文后,会向除了来源的路由器以外的其他相邻路由器发送LSP报文,这种方式叫做范洪更新。每台路由器要在各自的数据库中,保存其收到的LSP报文信息

2017-06-23 10:33:12 598

原创 【Linux】GDB调试多线程和多进程以及Core文件

GDB调试器基本概念GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。主要功能    1、启动程序,可以按照你的自定义的要求随心所欲的运行程序。

2017-06-21 16:07:47 2735

原创 【Linux】生产者消费者模型介绍

基本概念利用单链表进行模型模拟原理代码实现#include#include#include#include#includepthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;//定义节点的结构体typedef st

2017-06-15 16:09:10 306

原创 【Linux】死锁概念总结

什么是死锁如果一组进程(或者线程)中的所有进程(或者线程)都在等待该组中其他进程(或者线程)才能引发的事件,那么这组进程(或者线程)就是死锁的死锁出现的情况举例(1)线程自锁,自己将自己锁住当进程(线程)第一次访问一个资源时,对该资源进行加锁;如果该进程(线程)又对该资源试图使用而进行加锁时,由于锁之前已被自己加上,便会等待锁的释放。这就永远处于挂起状态了,便产生了死锁。(2)

2017-06-14 16:00:31 288

原创 【Linux】线程

线程的基本概念线程,有时候被称作是轻量级线程(LWP),是程序流的最小执行单元。一个标准的线程,是由线程ID,指令指针,寄存器集合和堆栈组成。线程也具有阻塞,就绪和运行三种基本状态。Linux下线程的特点1、线程是进程的一个实体,是被系统独立调度和分配的基本单位。2、线程不拥有自己的资源,只有一点运行中比不可少的资源。3、线程与和它同属于一个进程的所有其他线程共享进

2017-06-13 15:49:33 247

原创 【Linux】IPC通信之共享内存

共享内存概念共享内存指的是,在多处理器的计算机系统中,可以被不同的CPU访问大量内存。由于多个CPU需要快速访问存储器,所以必须对存储器进行缓存。在缓存中的数据被更新后,其他处理器也可能要进行读取,共享内存就需要立即更新,否则不同的处理器将读取到不同的数据。共享内存是Unix、Linux下多进程通信的一种方式之一,这种方法通常用于一个程序的多进程间通信。实际上多个进程可以通过共享内存来进行通信

2017-06-12 14:45:04 248

原创 【Linux】IPC通信之信号量

什么是信号量信号量本质是一个数据操作锁,本身并不可以进行数据的通信。而是通过其他资源进行进程间的通信,本身是一种外部标识符。信号量在此操作中负责数据的同步、互斥等功能为什么需要信号量信号量的工作原理Linux下的信号量机制(1)获得信号量(2)销毁信号量(3)PV操作

2017-06-05 19:12:45 387

原创 【Linux】IPC通信之消息队列

消息队列概念消息队列提供了一个进程将一个数据块发送到另一个进程的方法。相比于管道的同步与阻塞,消息队列很好的解决了这个问题管道通信是基于字节流的,然而消息队列发送的是一个数据结构,即IPC对象消息队列的总字节数是有上限的,消息队列的总数也是有一定上限的IPC对象的内容(消息队列,信号量和共享内存共同的IPC对象)消息队列的结构与消息队列有关的函数消息

2017-05-27 16:07:29 260

原创 【Linux】shell的简单模拟

Shell的概念Shell俗称壳,是Linux操作系统的外壳Shell又称为命令行解释器,它接受用户输入的命令,然后调用相关的程序模拟实现Shell步骤1、打印Shell提示符,给用户输入的提示2、定义一块空间接受用户的输入字符,以便对用户输入的内容进行处理3、定义一块指针数组,将用户输入的内容按照空格依次存储4、创建子进程进行程序替换如何模拟实现重定向的功能1

2017-05-25 15:00:33 345

原创 【Linux】PCB中的task_struct结构体

task_struct结构体task_struct是进程控制块PCB中的一个结构体,用来存储进程的各种属性信息这里面有进程状态,进程调度,进程标识符,进程通信,进程链接,时间和定时器,文件系统,虚拟内存信息以及页面管理信息,对称多处理机信息,上下文信息等结构体内部信息介绍1、进程状态linux中的进程有多种状态,在进程的运行过程中,进程会随着调度在多种状态进行转换进程的状态

2017-05-21 16:12:48 430

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