xy913741894的博客

私信 关注
xy913741894
码龄6年
  • 251,866
    被访问量
  • 96
    原创文章
  • 27,548
    作者排名
  • 141
    粉丝数量
  • 于 2015-05-30 加入CSDN
获得成就
  • 获得172次点赞
  • 内容获得37次评论
  • 获得450次收藏
荣誉勋章
TA的专栏
  • C
    18篇
  • C++
    20篇
  • 数据结构
    13篇
  • 剑指Offer
    8篇
  • Linux/操作系统
    32篇
  • 计算机网络
    7篇
  • 深入理解计算机系统
    6篇
  • Qt
    1篇
  • 机器学习
  • python
    1篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

Python踩坑笔记

Python现在是一门非常流行的语言,可用于后台开发,也可以用来写一些脚本快速实现,验证功能,现在很火的机器学习,数据分析等等也热衷于使用python,因此,学习python的用途还是很广泛的。一般来说,很多人在学python这种脚本语言之前都应该学习过C/C++/Java等语言,因此上手python是一件比较简单的事情,我也是这样,科班出生,主要使用的C++/C语言,虽然没学过python,但是给
原创
394阅读
0评论
2点赞
发布博客于 4 年前

关于2Sum,3Sum的题解

这几天在刷题,遇到几道有趣的概率题,需要设计算法,编程实现,整理一下: 给定N张扑克牌和一个随机函数,设计一个洗牌算法 如何等概率地从n个数中随机抽出m个数? 给定一个能够生成0,1两个数的等概率随机数生成器”,如何生成⼀个产生0,1,2,3的等概率随机数生成器? 和上题类似,如何用rand7生成rand9? 有一枚硬币,以p的概率产生正面,以1-p的概率产生
原创
415阅读
0评论
1点赞
发布博客于 4 年前

几道有趣的概率题

这几天在刷题,遇到几道有趣的概率题,需要设计算法,编程实现,整理一下: 给定N张扑克牌和一个随机函数,设计一个洗牌算法void fun(vectorint>& v)
转载
1491阅读
0评论
1点赞
发布博客于 4 年前

linux下端口扫描的实现(TCP connect、TCP SYN、TCP FIN、UDP四种方式)

一、TCP常用的端口扫描方式有以下三种:1.connect扫描我们知道,常见的TCP的socket实现过程为更本质的连接和结束的过程是如下这个样子的:从上面两个图我们可以看出来目标主机的一个端口如果是监听状态(LISTENING或者LINSTEN),那么当我connect目标主机时就能成功,否则说明端口是关闭的。优点:  编程简单,是需要
转载
4960阅读
0评论
1点赞
发布博客于 4 年前

Linux指令ps,top

主要整理下一些Linux下自己平时很少用到但是应该了解的命令,目前整理了以下命令: ps top artop每天一个linux命令(44):top命令pspsarar命令ld
原创
432阅读
0评论
0点赞
发布博客于 4 年前

回调函数,函数指针

如何获取到类中函数指针//A类与B类的定义class A{public: void Test() { cout << "A::Test()" << endl; }};class B : public A{public: void Test() { cout << "B::Test()" << endl; }
原创
282阅读
0评论
0点赞
发布博客于 4 年前

C++四种类型转换

const_cast主要用于删除变量的const属性,便于赋值const int a = 2;int* p = const_cast<int*>(&a );*p = 3;reinterpret_cast仅仅是重新解释类型,没有二进制的转化,主要用于:指针,整数之间的互相转化在指针类型(尤其是函数指针)之间进行转换int *ip;char *pc = reinterpret_cast<ch
原创
263阅读
0评论
0点赞
发布博客于 4 年前

Qt删除layout的控件

基于某些原因,我们可能希望往一个布局内动态删除和添加新的元素,添加我们都能很清楚得看到addWidget这个接口.删除的话官方也有示例: QLayoutItem *child; while(child=this->ui->centralWidget->layout()->takeAt(0)) { delete child; }
转载
5035阅读
0评论
0点赞
发布博客于 4 年前

hash原理

通过hash函数将数据映射为索引(下标),便于查找,在hash冲突做得好且数据较少的情况下可达到O(1)。 常用的hash函数有除留余数法,线性探测,二次探测,开链法,在大部分情况下基本就是用开链法:hash的负载因子:元素个数/hash表长度 一般控制在0.7 -0. 8如何提高hash查找的效率设置好的hash函数,冲突尽量少空间换时间,增大表长STL使用素数表hash桶挂
原创
359阅读
0评论
1点赞
发布博客于 4 年前

单链表含环的各种面试题

判断链表是否带环?若带环求环的长度?若带环求环的入口点?用快慢指针求是否带环?快慢指针相遇则带环设相遇点为meet,求环长度,只需要设置p指针指向meet,设置count,循环的时候++count,直到p指向meet得出环长度如下图:
原创
247阅读
0评论
0点赞
发布博客于 4 年前

只能生成栈上对象,堆上对象,不能继承,单例模式

1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象 4.单例模式之所以把这4道题放在一起,是因为他们有着相似之处。 在C++中,类的对象建立分为两种,一种是静态建立,如A a; 另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直
原创
500阅读
0评论
0点赞
发布博客于 4 年前

实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字

实现1+2+3…+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字class Test{public: Test() { x++; sum += x; } static int GetSum() { return sum; }private: static int x; st
原创
500阅读
0评论
0点赞
发布博客于 4 年前

gcc中(-I -l -L)参数的意义

关于编译连接的常识helloworld背后发生了什么?(CSAPP笔记2)gcc -o hello hello.c -I/home/hello/include -L/home/hello/lib -lworld//有时候还需设置环境变量 LD_LIBRARY_PATH前面的编译选项,一般来说大家都熟悉,关键是后面几个,我们逐一解释: -I/home/hello/include我们知道
原创
666阅读
0评论
1点赞
发布博客于 4 年前

shell字符串匹配

一、简介      Bash Shell提供了很多字符串和文件处理的命令。如awk、expr、grep、sed等命令,还有文件的排序、合并和分割等一系列的操作命令。grep、sed和awk内容比较多故单独列出,本文只涉及字符串的处理和部分文本处理命令。二、字符串处理1、expr命令expr引出通用求值表达式,可以实现算术操作、比较操作、字符串操作和逻辑操作等
转载
39415阅读
0评论
2点赞
发布博客于 4 年前

TCP小型服务器(poll)

我们之前写过多线程,多进程,select机制的TCP服务器,作为IO复用的另一种机制poll,我们也有必要去学习一下,下面就是基于poll机制的服务器。makefile.PHONY:allall:client serverclient:client.c gcc -o $@ $^server:server.c gcc -o $@ $^server/***************
原创
376阅读
0评论
0点赞
发布博客于 4 年前

sed,awk工具学习

sed工具 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才
原创
375阅读
0评论
0点赞
发布博客于 4 年前

正则表达式以及grep,cut等命令学习

所谓正则表达式,简单来说就是一种处理(复杂)字符串的方法,它以行为单位,通过添加一些特殊符号来达到增删查改字符串的目的。正则表达式可分为以下三个内容:比如我们要匹配以123开头中间有3个x字符的字符串:其中^表示开头,也就是位置限定符,.* 表示没有字符,任意一个字符或者任意 多个字符,其中.表示字符类,而 * 表示数量限定符。下面我们来详细讲一讲这三者。关于标准正则和扩展正则表达式的区别:其实它们
原创
514阅读
0评论
0点赞
发布博客于 4 年前

小型tcp服务器--select

在前面的博客中,我用多线程,多进程编写了一个小型服务器,之所以会使用多进程/多线程是因为服务器往往需要服务多个客户端,提高并发性和效率是十分重要的,然而缺点是系统开销较大,系统需要创建多个进程/线程。然而,现实生活中,一个程序,或者一个网络服务器的真正的性能瓶颈往往在IO,事实上,网络IO进行读写数据之时,往往因为就绪条件不满足而出于等待的状态,这大大就降低了我们性能。对于网络IO,可分为两步:
原创
341阅读
0评论
0点赞
发布博客于 4 年前

shell脚本编程实例--进度条,求和&平均值,斐波那契,改变字符串大小顺序

利用求1+2+3+…+100的和,要求打印出1+2+3+…+100=5050我想了两种方法:字符串拼接依次打印两种思路代码如下://依次打印sum=0for ((i=1; i<=100; i++))do if [ $i -eq 100 ];then echo -n "$i=" break fi echo -n "$i+"
原创
742阅读
1评论
0点赞
发布博客于 4 年前

shell脚本运行的原理(source命令等)

Shell英文意思是外壳, 用户可以通过Shell和操作系统交互,通俗的讲Shell就是一个解释器,当我们输入命令Shell就解释执行,Shell有很多版本,我们一般使用的都是bash,在Linux输入一条命令可以查看当前正在使用的Shell:echo $SHELL屏幕会出现:/bin/bashShell有两种方式:因此,我们主要来学习Shell脚本编程。在理解Shell脚本运行的原理之前,我们必须
原创
7194阅读
0评论
5点赞
发布博客于 4 年前

TCP协议报文格式和三次握手,四次挥手

源端口和目的端口: 用来表示发送主机的进程和接收主机的进程,实现TCP复用和分用序号: TCP是面向字节流的,TCP连接中的每个字节都按序编号,序号字段又叫报文段序号,指的是当前报文段的第一个字节的序号,比如一报文段的序号字段为301,数据有100字节,则序号为301,下一个报文段应该从401开始,序号为401确认号:期望收到下一个报文段的第一个字节序号,比如A发送一个报文段序号为501,数据长度为
原创
1081阅读
0评论
0点赞
发布博客于 4 年前

UDP协议以及与TCP区别

UDP和TCP协议都属于传输层协议,负责完成网络中端到端之间的通信,其中UDP协议相对比较简单,但是有些琐碎的点还是值得总结的,另外一个UDP/TCP的区别也算是一个高频考点了,因此,本文主要会总结下UDP协议的注意点,以及和TCP的区别,而TCP内容涉及太多了,会另外再开一篇博客总结的。谈协议,我们直接先看UDP报文是怎么样的,根据图来学习理解UDP。UDP的首部一共是8个字节,分别是源端口,目的
原创
419阅读
0评论
0点赞
发布博客于 4 年前

了解网络通信中的端口

熟悉TCP/UDP协议的同学可能都知道端口这一词,无论是TCP还是UDP报文都有源端口和目的端口字段,为什么会需要这些字段呢?这是因为,对于网络之间的通信,本质而言就是应用进程之间的通信,而IP协议只提供主机与主机之间的通信,可是一个主机有那么多进程,如何区别是哪个进程通信呢?端口就起着标识的作用。通过IP:port这一对套接字就能保证不同主机上进程之间的通信,我们后面所学的套接字编程就要使用到端口
原创
1246阅读
0评论
1点赞
发布博客于 4 年前

基于tcp的小型服务器(多线程多进程)

在深入理解计算机系统第11章中,讲到一个echo服务器,基于tcp字节流的小型服务器,利用socket套接字接口,完成了一个简易的服务器。具体细节可参考网络编程(编写一个小型服务器)–csapp11章。不过这个小型服务器有一个难以接受的缺点在于:它是单进程的服务器,也就是它只能服务一个客户,我们先不去讨论这个功能强弱,我们知道在现实生活中,一个网站,一个服务器必须要能够服务多个用户,如果只能服务一个
原创
678阅读
0评论
0点赞
发布博客于 4 年前

CRC校验

网上关于CRC校验的文章已经有不少了,但是我总觉得有些繁琐,其实对于大部分人只需要了解CRC是做什么的,原理是什么即可。因此,我想用尽量简短的篇幅来向大家介绍CRC。关于CRC,我只介绍以下几点:用来做什么的基本的原理给出实例来帮助大家理解,毕竟光讲一堆原理太抽象。CRC是用来做什么的?最常见的用途就是差错检测。一般在计算机网络的书籍都会讲述CRC,其实说白了就是现实的网络十分复杂,从一个主
原创
494阅读
0评论
1点赞
发布博客于 4 年前

shell脚本中倒引号,$(), eval的区别

在Shell脚本中,当我们vim test.sh输入以下文本:echo dateecho `date`
原创
443阅读
0评论
0点赞
发布博客于 4 年前

网络编程(编写一个小型服务器)--csapp11章

网络应用随处可见,表现的形式也各不相同,有趣的是,在不同的表现形式之下都是基于相同的编程模型,依赖于相同的编程接口,因此学习网络还是比较保值的,因为这么多基础设备还在运行着,基本机制也在短时间内很难改变。网络编程的知识很多,包括进程,线程,信号等等,同时需要读者了解TCP/IP协议,本文假定读者已经了解熟悉这些相关知识,如果没有可能需要学习APUE,计算机网络这些基础知识了。本文的最终目标就是编写一
原创
815阅读
0评论
1点赞
发布博客于 4 年前

理解unix 系统I/O --csapp读书笔记

昨天,面百度,其中有一个问题是:open的返回值是什么?从你调用open函数到Linux下出现了一个文件,这中间发生了什么?第二个问题,当时就懵逼了,后来仔细想想,发现自己其实看过,其实讲文件描述符相关~为此,自己又重新看了APUE第二章,同时对应看了CSAPP第10章,因此做一个总结~IO是什么?i/o是input,output的缩写,也就是输入输出的意思。在计算机中,I/O就是在主存和外部设备(
原创
775阅读
2评论
0点赞
发布博客于 4 年前

理解重定向之dup,dup2

Linux下当使用 ls > file 命令,可以将原本输出在屏幕上的文字重定向到file文件中(如果没有file文件则创建之)我们可以利用dup,dup2函数也实现一下重定向。它们的接口如下:#include <unistd.h>int dup(int oldfd);int dup2(int oldfd, int newfd);dup(fd)是对fd进行一份拷贝,将当前最小未被使用的文件描述符
原创
684阅读
0评论
0点赞
发布博客于 4 年前

计算机网络基础知识和体系结构

现代社会,网络已经和水,电一样成为我们的不可或缺的日常需求了,可以说网络无处不在。作为一名用户,只需要学会如何使用网络即可,而作为一名计算机专业的学生,一名程序员有必要去深入了解其中原理。因此,本章主要会介绍一些计算机网络的基本定义,网络的体系结构等,旨在学习计算机网络的基本概念,为接下来的网络编程打下良好的基础。之前在大二在学过计算机网络,但是时间太久了很多已经都忘了,因此这篇博客也是对我自己知识
原创
13883阅读
0评论
6点赞
发布博客于 4 年前

gdb调试多线程多进程程序

gdb的简介和功能:gdb是GNU开发的一个在Unix,Linux上使用的C/C++和汇编语言程序的调试工具,它主要帮助用户在调试程序时完成以下工作:启动程序,按照用户要求影响程序的运行设置断点,在指定位置停止当程序停止,检查它出现什么问题动态改变程序的执行环境,可以先纠正一个错误,然后再纠正其他错误使用gdb为了发挥gdb的功能,需要在编译源程序时加上-g选项,这样才能够在目标代码加入调
原创
490阅读
0评论
0点赞
发布博客于 4 年前

多线程编程2--线程的同步和互斥

当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图。 如果每个线程内部的变量其他线程都不会访问到,那么就不存在一致性问题; 如果变量是只读的,那么多个线程同时访问它也不存在不一致性问题; 但是,一旦一个变量是可写,当一个线程对它进行修改的时候,其他有可能对它进行读取或者写入操作从而导致数据不一致的问题。此时就需要同步机制来保证。APUE上给出一个例子:由于递增操作不是原
原创
344阅读
0评论
0点赞
发布博客于 4 年前

多线程编程1 --线程创建,退出,等待,分离

线程的基本概念线程是在进程内部运行的一个执行分支,它是运行在进程的地址空间中。和进程之间的独立性不同,线程之间更强调共享性,它共享进程的地址空间,比如数据段,代码段,堆。。。以及文件描述符表。因此,无论是线程的创建,终止,切换的代价都要比进程小很多,线程之间可以直接通信而不需要向进程通信那么麻烦(共享内存,消息队列,信号量等机制),当然有优点就有缺点,由于线程强调共享性,一个进程内的所有线程是互相影
原创
1014阅读
0评论
0点赞
发布博客于 4 年前

反转字符串

反转字符串s = "123456"打印出654321这里面有2种想法:改变字符串s = “654321”,直接打印逆序打印字符串,不改变字符串这里我都简单实现了一下:void reverse_c(char* str) //c语言实现{ if (*str == '\0') return; reverse_c(str+1); putchar(*str);
原创
288阅读
0评论
0点赞
发布博客于 4 年前

CopyOnWrite(COW)的优缺点

http://blog.jobbole.com/104707/
转载
891阅读
0评论
0点赞
发布博客于 4 年前

常用的C++11特性(面试易考)

大二的时候看过《C++Primer》,了解过C++11,因此就在简历上写上了解C++11,结果就是频频被问到有关C++11。。。发现自己答的并不算太好~因此,简单总结一下,我在找实习的过程被问到的C++11特性。1. nullptr注意在C++中NULL仅仅是define NULL 0的一个宏定义,因此,有时候会产生歧义比如f(char*)和f(int),参数传NULL的话到底该调用哪个?事实上,在
原创
5432阅读
0评论
4点赞
发布博客于 4 年前

逆时针填充正方形(递归 循环)

如果所示,逆时针填充正方形,从1,2,3…到16,输入一个正方形的大小,填充。 比如输入4,正方形如上图,如果输入5,则是1,2,3…到25。这道题,可以按照如图所示的方法,先构造最外一圈的数,123一组,456一组,789一组,101112一组,只需要注意到下标的变化,数字的更新即可。对于里面矩阵可以采用递归的写法。void FillTheRectangle_1(vector<vector<in
原创
469阅读
0评论
1点赞
发布博客于 4 年前

利用可变参数模拟实现简易printf

printf一般是这么使用的, printf (“Characters: %c %c
”, ‘a’, 65); 它是可变参数,遇到%s,%c,%d就格式化输出 因为我们重点是了解学习可变参数,因此,我们简化一下,遇到c,s,d就格式化输出 当然也许你会说那么想输出c字符咋办?其实不难,只要扫描的时候向printf学习用%c输出,c直接输出,只不过我们重点不在这个扫描字符串分析,
原创
258阅读
0评论
0点赞
发布博客于 4 年前

C++中文件读取处理(按行或者单词)

前段时间参加蓝桥杯,遇到一些题目,题目本身不难,按照常规思路写代码即可,但是我忘了如何读取文件了。。。面对一堆数据楞是写不出。还有几天是蓝桥杯的决赛,所以为了避免踩同样的坑,我打算通过实例复习下文件读写。文件读写需要引fstream,如果对fstream不了解的话,可以查一查官方的文档cplusplus这个网站。一般常用的函数就是open,close,getline…具体的函数不会了直接查一下,学会
原创
9605阅读
0评论
12点赞
发布博客于 4 年前

进程通信--总结

关于进程通信,我整理了一下自己所总结的几篇文章以供以后复习查阅。进程通信的一些基本概念:进程通信概念和进程通信方式进程通信的几种方式:信号量:信号量(生产者和消费者模型) 和 信号量(进程通信)共享内存: 共享内存(进程通信)消息队列: 进程通信之消息队列管道:进程通信之管道(PIPE)
原创
927阅读
0评论
5点赞
发布博客于 4 年前

共享内存(进程通信)

前面介绍了进程通信的几种方式,信号量,管道,消息队列,今天主要总结下共享内存的知识点。什么是共享内存我们一张图来解释什么叫共享内存。我们知道,每个进程都有一个叫PCB(Linux下一般为task _ struct)的数据结构,用于保存进程的相关信息。我们可以通过PCB找到进程地址空间,进程地址空间一般包括栈,堆,数据段,代码段等等,需要明确的一点就是用户访问的都是虚拟内存,操作系统是通过页表+MMU
原创
4307阅读
3评论
8点赞
发布博客于 4 年前

信号量(进程通信)

关于进程通信方式,我之前整理如上图。今天,我们主要通过实例(代码编写)来深入了解信号量。关于信号的概念,基础知识等我在信号量(生产者和消费者模型)以及进程通信概念和进程通信方式这两篇文章都有总结,不再赘述。我们通过了解Linux下关于信号量函数接口,以及代码编写复习,熟悉信号量。PS:代码均在Ubuntu16.04下测试。什么是信号量在前面,我们提过,信号量主要用于互斥或者同步机制。信号量本质上是一
原创
647阅读
0评论
1点赞
发布博客于 4 年前

进程通信之消息队列

在前面,我们了解进程通信的概念以及常见的进程通信方式,我做个整理如下图:我们继续通过实例来学习进程通信,今天主要是讲消息队列是如何实现进程通信的,代码均在Ubuntu16.04下测试。如上图所示,消息队列是一种间接的通信方式,它提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同
原创
543阅读
0评论
0点赞
发布博客于 4 年前

进程通信之管道(PIPE)

在前面进程通信概念和进程通信方式,我们了解了进程通信的简单概念以及4种进程通信的方式,今天我们将要通过具体实例来学习,理解进程通信方式中的管道(PIPE)。本文所有代码都在Ubuntu16.04测试。我们在前面已经了解了常用的进程间通信方式,它们大致可以以如下方式分类:A. 传统的进程间通信方式 无名管道(pipe)、有名管道(fifo)和信号(signal)B. System v IPC对象
原创
1748阅读
0评论
3点赞
发布博客于 4 年前

LCS,最长公共子序列

一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。暴力解法寻找LCS的一种方法是枚举X所有的子序列,然后注意检查是否是Y
原创
264阅读
0评论
0点赞
发布博客于 4 年前

动态规划 钢条切割

这是算法导论动态规划的一个例子,自己实现了一下~给定一个长度为n英寸的钢条和一个价格表Pi(i=1,2…n),求切割钢条方案,使得销售收益Rn最大。注意,如果长度为n的钢条价格Pn足够大,则最优解可能就不需要切割。分析:代码如下:#include<iostream>#include<vector>#include<algorithm>using namespace std;//recursio
原创
271阅读
0评论
0点赞
发布博客于 4 年前

实现一个简单shell(支持重定向)

5.16更新:支持重定向我们知道对于Linux,shell就是个命令行解释器,当我们输入相关的命令,会去执行相关的操作。比如当我们输入ls -a -l命令,shell就会打印出当前目录的内容,这是如何实现的?shell自己就是一个进程,当我们输入ls之类的命令,它会通过fork,exec函数去创建一个新的子进程去执行相关操作。因此我们也可以利用这个来实现一个简单的shell。当然,这个shell足够
原创
5779阅读
1评论
2点赞
发布博客于 4 年前

了解栈帧

一、 什么是栈帧?    什么是栈帧,相信很多从事C编程的童鞋还是没有搞明白,首先引用百度百科的经典解释:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。”。    实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。也许这样感觉更复杂了,好吧,让我们从栈开始来理解什么是栈帧...二、 栈(用户
转载
228阅读
0评论
0点赞
发布博客于 4 年前

进程通信概念和进程通信方式

进程通信(IPC,Inter-Porcess Communcation)是进程进行通信和同步的机制。IPC提供两个基本操作:发送(send message)接收(receive message)进程通信流程:在通信进程之间建立通信链路通过send/receive交换信息进程通信方式: 直接通信: 进程必须正确命名对方,比如send(p,message)向p发送信息,receiv
原创
10011阅读
2评论
9点赞
发布博客于 4 年前

死锁,银行家算法

死锁:由于竞争资源和通信关系,两个或者更多线程在执行中出现,永远相互等待只能由其他进程引发的事件我们知道操作系统中很多种资源,如CPU,内存,IO设备等,每种资源又有很多实例,对于这些资源,进程该如何访问?请求/获取:申请空闲资源使用/占用:进程占用资源释放:资源状态由占用变为空闲为了更好的了解死锁,我们将资源分类:造成死锁必须要满足以下条件: 如果在系统中已经出现死锁后,应该及时检测到死锁
原创
707阅读
0评论
0点赞
发布博客于 4 年前

仿函数(functors)使用

我们都知道C++有一个标准库STL,熟练使用STL可以提高我们开发的效率。可能很多人都熟悉诸如vector,list,map等容器,但是作为STL六大组件的仿函数则不太了解,或许有人说,这是个什么东西?学了有什么好处?仿函数,它行为类似函数,可以作为算法的某种策略,帮助我们更好的使用算法。我们简单看一个例子://排序一组数据#include <iostream>#include <vector>
原创
645阅读
0评论
0点赞
发布博客于 4 年前

C语言的存储空间布局

正文段:CPU执行的机器指令部分,通常,正文段可共享,而且是只读的,以防止程序由于意外而修改其自身的指令。初始化数据段:通常将此段称为数据段,它包含了程序中需要明确赋初值的变量,比如,C语言在函数外的声明:int max = 100;也就是全局变量,静态全局变量带初值存放在初始化数据段非初始化数据段:通常将此段成为bss段,bss来自早期的汇编运算符,意思是“block started by sym
原创
418阅读
0评论
0点赞
发布博客于 4 年前

管程

在信号量(生产者和消费者模型)中,我们了解了信号量用于同步,互斥的用法,然而,在生产者和消费者模型中,为了实现同步,我们需要将PV操作放在不同进程(线程)中去实现,这大大增加了我们编程的难度以及出错的概率,因此能否将PV操作集中在一个模块中实现?当然有!这就是我们接下来需要讲的管程。mooc课对于管程的介绍如下:通俗一点讲,管程就是将共享变量和对它们的操作集中在一个模块中,这就像我们在写C++类时,
原创
488阅读
0评论
0点赞
发布博客于 4 年前

信号量(生产者和消费者模型)

信号量和管程都是操作系统用于同步提供的两种方法,我们将结合生产者与消费者模型对此进行学习。什么是信号量?为了提高系统的并发性,我们引入了多进程,多线程,但是这样子带来了资源竞争,也就是多个程序同时访问一个共享资源而引发的一系列问题,因此我们需要协调多线程对与共享资源的访问,在任意时刻保证只能有一个线程执行临界区代码。为了实现同步,我们可以利用底层硬件支持,也可以利用高层次的编程抽象,信号量和管程属于
原创
8229阅读
0评论
3点赞
发布博客于 4 年前

进程切换,创建,加载,等待与退出

进程切换进程状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命状态。在操作系统中,常见的进程状态是三状态模型,也就是就绪,运行,阻塞(等待),它们的关系如下图:当然,对于一个实际的系统,进程的状态及其转换更为复杂。为此我们引入了新建态和终止态构成了进程的五态模型:关于更详细的进程状态点击此处查看。在这里,我们聊一聊进程之间的切换。进程切换,又叫上下文切换
原创
684阅读
1评论
0点赞
发布博客于 4 年前

构建乘积数组--剑指Offer

题目描述 : 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]* A[1]… A[i-1]* A[i+1]… A[n-1]。不能使用除法这道题如果没有最后一个要求,直观想法就是将数组A中每个数相乘得出结果sum,每次求B[i]只需要sum / A[i]。但是题目不能使用除法,所以这种方法行不通,还有一点就是,如果存在某个A[i]
原创
523阅读
0评论
0点赞
发布博客于 4 年前

helloworld背后发生了什么?(CSAPP笔记2)

任何一个学过C语言的同学,第一个程序应该都是写一个“hello world“。我们编辑好一个hello world,一般来说,只需要轻轻一点编译器的“编译”“运行”,屏幕上就会出现一句hello world,然而在这背后都发生了什么?CSAPP在第一章给出了解释:计算机需要将源文件转为可执行目标文件,一般在Linux下,需要执行gcc hello.c -o hello从而生成一个hello可执行文件
原创
533阅读
0评论
0点赞
发布博客于 4 年前

计算机系统的基本组成(CSAPP笔记1)

这是在计算机组成原理会讲到的部分内容,计算机的基本组件以及对应的功能如下:为了便于理解,我们做个类比,计算机可以看作是一个工厂,运算器,控制器相当于车间,存储器相当于仓库,输入相当于原料,输出相当于成品,这样子是不是好理解了一点了?hhh
原创
589阅读
0评论
0点赞
发布博客于 4 年前

CSAPP笔记(概括)

截取一段书评 这本书的书名叫”Computer Systems: A Programmer’s Perspective”,从程序员的角度去理解计算机系统,也暗示了书中讲的任何内容都会和程序员所做的事情联系起来。就这点看来,书的中文名取的不好。第二章回顾了整数浮点数的二进制表示,以前学过,但是恐怕很多也忘得差不多了。这章感觉最深的是无符号和有符号数,在代码中尤其要注意两种数据计算时上溢下溢的问题。
原创
725阅读
0评论
0点赞
发布博客于 4 年前

树中两结点的最低公共祖先(C++实现)

题目是,输入两个树结点,求它们的最低公共祖先首先,要说明的是,这是一组题目,根据剑指Offer上所讲的,这道题可能会分好几种情况,因此,如果在面试时候遇到,我们需要和面试官沟通,而不是一上来就写代码。1. 如果给定树是二叉搜索树二叉搜索树(又叫二叉排序树),中序遍历是可以得到有序序列的,因此,我们可以利用这个性质来解题。假设给定的两个树结点为4,1,根据图示,显然3为最低公共祖先; 假设给定的两
原创
1247阅读
0评论
1点赞
发布博客于 4 年前

Linux下task_struct

进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。 在Linux 中每一个进程都由task_ struct 数据结构来定义. task_ struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork()
原创
293阅读
0评论
0点赞
发布博客于 4 年前

了解程序,进程和线程

进程是OS处于执行状态程序的抽象1.程序 = 文件(静态可执行文件)2.进程 = 执行中的程序 = 程序 + 执行状态3.同一个程序多次执行对应为不同的进程进程执行需要的资源内存:保存代码和数据CPU:执行指令线程线程是进程的一部分,用来描述指令执行流状态,它是进程中指令执行流的最小单元,是CPU调度的基本单位。
原创
316阅读
0评论
0点赞
发布博客于 4 年前

RAII和智能指针的实现

RAII在C++effective一书中讲到,RAII是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。它是基于这样的原理,栈的变量会自动销毁,(自定义类型对象会调用析构函数)。它是将管理资源变为管理对象,将资源封装成类,利用构造函数来获取并初始化资源,析构函数来释放资源,从而保证资源的正确获取,初始化以及释放。从而避免了因此异常等其他
原创
1263阅读
0评论
0点赞
发布博客于 4 年前

linux下vim配置

我的vim配置主要有以下优点:1.按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试2.自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改3.映射“Ctrl + A”为全选并复制快捷键,方便复制代码4.按“F2”可以直接消除代码
转载
204阅读
0评论
0点赞
发布博客于 4 年前

Unicode和UTF-8关系

1. 基础1.1 ASCII码我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这被称为一个字节(byte). 也就是说, 一个字节一共可以用来表示256种不同的状态, 每一个状态对应一个符号, 就是256个符号, 从 0000000到11111111.
转载
286阅读
0评论
0点赞
发布博客于 4 年前

Linux之find命令使用 ---Linux学习笔记(4)

Linux下find命令用于搜索文件,并执行相关操作。它是一个很强大的查找命令,缺点是查找速度比较慢,因为它不同于whereis,locate这些直接从数据库中查找,而是从硬盘上查找,因此耗费时间较多。find命令很强大,同时它的选项也很复杂,因此需要我们仔细去学习。find格式大概如下:find [pathname] [option] [action]pathname: find命令所查找的目
原创
310阅读
0评论
0点赞
发布博客于 4 年前

文件的特殊权限:SUID,SGID,SBIT---linux学习笔记(3)

我们都知道文件权限有rwx这三种,但是我们如果试着这么做:好像还有其他权限(s,t)?这就是我们要说的文件特殊权限。SetUID定义:当s标志出现文件所有者(user)的x权限上时,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限,如上述passwd的rwsr-xr-x,我们称为SetUID,简称SUID的特殊权限。它有以下几点限制和功能:1. SUID只对二进制文件有效 2.
原创
261阅读
0评论
0点赞
发布博客于 4 年前

STL空间配置器allocator详解

stl六大组件简介我们知道,stl有容器,空间配置器,适配器,迭代器,仿函数以及算法这6个组件,它们六者关系大概如下:容器通过配置器取得数据存储空间,算法通过迭代器获取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套界仿函数。侯捷在《STL源码剖析》一书讲到:因此我们需要先去学习空间配置器。预备知识一般来说,我们习惯的C++内存配置和释放操作是这样的:class A {};A*
原创
8774阅读
6评论
21点赞
发布博客于 4 年前

实现一个C语言版的JSON库(1)

JSON
原创
3491阅读
0评论
0点赞
发布博客于 4 年前

最小生成树(prim和krustal)

mark一下我觉得不错的博客,尤其是图片那块,留下来以后复习用,嘿嘿最小生成树(prim和krustal)代码我按照自己的思路写的,可以见我的github
转载
876阅读
0评论
0点赞
发布博客于 4 年前

理解stat命令下3个时间概念---Linux学习笔记(2)

当我们使用stat命令去查看文件/文件系统的详细信息,会出现这样的界面:我们注意到红线圈出来的地方:会出现3个类型的时间,分别是Access,Modify,Change。这三个时间分别代表了什么?Access time:表示最后一次访问(仅仅是访问,没有改动)文件的时间。如果现在我对这个文件进行了访问,比如cat text注意到只有Access time改变了,其他两个不变。Modify time:
原创
254阅读
0评论
0点赞
发布博客于 4 年前

Linux学习笔记(1)---文件/目录权限

文件权限与目录权限的意义以及区别
原创
323阅读
0评论
0点赞
发布博客于 4 年前

剑指Offer之C++实现

代码可见我的github
原创
1642阅读
0评论
0点赞
发布博客于 4 年前

理解快速排序

作为排序算法中效率最高的快速排序有着O(N*logN)的时间复杂度,同时它其中涉及的思想:分治也是十分的有用,因此无论是各种考试还是IT公司的面试一般都少不了它。更重要的是,快速排序被称为20世纪十大算法之一,所以我们有什么理由不好好去学习理解快排呢?目录这篇博客将会根据我自己的理解,尽量写完整有关快排常见的要点(包括
原创
1188阅读
0评论
0点赞
发布博客于 4 年前

布隆过滤器(BloomFilter)的实现

布隆过滤器 – 空间效率很高的数据结构上面这个链接对布隆过滤器进行了比较详细的介绍,可以仔细看一看。在这里,我自己主要写一写自己的理解,并用代码实现一个简单的版本。BloomFilter往往用于数据量太大内存一下子存不了的情况,其实本质有点类似bit-map 的扩展,它的原理: 当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把
原创
907阅读
0评论
0点赞
发布博客于 4 年前

海量数据处理

最近看到一些海量处理的博客,大赞!!!地址复制在此方便自己查找。教你如何迅速秒杀掉:99%的海量数据处理面试题http://blog.csdn.net/v_july_v/article/details/7382693海量数据处理:十道面试题与十个海量数据处理方法总结http://blog.csdn.net/v_JULY_v/article/details/6279498十七道海量数据处理面试题与Bi
转载
293阅读
0评论
0点赞
发布博客于 4 年前

BitMap的C++实现

BitMap算法的实现 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。我们知道,一般可以直接操控的最小的单位是字节,比如在C/C++中,定义一个类型char,对它进行各种操作。然后很多时候,面对一个很大数据量,且我们仅仅希望知道某个数是否存在,我们不妨可以(有时候是必须)使用Bit
原创
4324阅读
1评论
0点赞
发布博客于 4 年前

map和set的使用和原理

我们学习过顺序容器如vecor,list等,它们中的元素是按照在容器中的位置来顺序保存和访问的。而接下来要学习的关联容器则有根本的不同,它们中的元素是按关键字来保存和访问的。 在《C++Primer》中列举了标准库中的8个关联容器,如下:关联容器支持高效的关键字查找和访问,我们在这里介绍两个主要的关联容器set和map。mapmap里面存的是一些key-value对,其中key起到索引的作用, 而
原创
6483阅读
1评论
1点赞
发布博客于 4 年前

二叉树的线索化(C++实现)

关于四种遍历方式的递归和非递归实现可点击 我的github 里面的BInaryTree.h查看。我们希望很快找到某的结点的前序或者后继,又不想遍历一遍,这就需要我们记录下每个结点的前驱和后继,因此为了做到这一点,我们引入了二叉树的线索化。
原创
490阅读
0评论
0点赞
发布博客于 4 年前

根据中序和前序遍历重建二叉树

重建二叉树前序遍历是先访问root,再依次访问左子树和右子树,而中序遍历则是先访问左子树,再依次访问root和右子树。在前序遍历中,第一个总为当前树的根节点root,因此我们可以根据root值在中序遍历序列中划分左右子树。然后再在划分的左右序列中,重复该操作,最终可以得到我们想要的结果。 我们以上面的前序和中序序列为例:第一次: 在前序遍历,得到1为根节点,根据中序序列,得到4,7,2
原创
296阅读
0评论
1点赞
发布博客于 4 年前

逆置链表以及逆序打印链表

这是剑指Offer第五道题,逆序打印链表。这道题不算难,算是我看这本书前几十页中,少数一眼能够直接写出代码的题。我最初的思路就是用个FILO栈实现,把链表中的元素压入栈中,然后再取出来实现逆序打印的功能。在这里,需要注意的点就是为了效率,stack中存入的元素最好是指向ListNode的指针,而非ListNode本身,或者其中ListNode中的数据(在这里尽管int类型和指向结点的指针大小一样(
原创
328阅读
0评论
0点赞
发布博客于 4 年前

二维数组中的查找 剑指Offer面试题

二维数组中的查找在一个二维数组中,每一行数字都按照从左到右的顺序递增,每一列数字都按照从上到下的顺序递增,请完成一个函数,判断该数组是否含有某个数字? 例如在下面的数组查找7返回true,查找5返回false。
原创
262阅读
0评论
0点赞
发布博客于 4 年前

剑指Offer之赋值运算符函数解析

1.赋值运算符函数AssignmentOperator题目:如下是类型CMyString的声明,请为该类型添加赋值运算符函数class CMyString{public: CMyString(char *p = nullptr); CMyString(const CMyString& str); ~CMyString();private: char *m_pDa
原创
683阅读
0评论
0点赞
发布博客于 4 年前

解析虚函数表和虚继承

之前大二在学C++的时候一直对虚函数和虚继承有些晕(其实好像就是对virtual这个关键字不太熟悉)现在又学习到了一些,对虚函数表和虚继承的机制有了一点更深入的了解。 关于虚函数以及虚继承的基础知识,我自己也总结了一下,点击浅谈C++多态和C++继承可查看,在继承的总结的时候,我没有总结关于虚继承的知识,而且在多态总结也没有设计到太多的虚函数的知识,我是想把这两块集中在一起讲下,也算是自己对vir
原创
3565阅读
2评论
8点赞
发布博客于 5 年前

浅谈C++多态

最近复习到了C++的多态性,我想把多态性的一些知识点进行下梳理总结。本文所有代码均在windows10的VS2013平台上测试什么是多态?多态性(polymorphism)据说最早源自希腊语,从字面上理解就是多种形态,多种形式。具体到C++这种面向对象(OOP)的语言中,其实就是“一种接口,多种实现(方法)”。 多态可分为静态多态和动态多态,具体的分类情况如下:静态多态和动态多态
原创
10390阅读
2评论
27点赞
发布博客于 5 年前

C++继承

众所周知,C++有几大特性:抽象,封装,继承,多态,最近刚刚复习到了继承(inheritance),做一个小总结。首先为什么要有继承?继承又是用来干什么的?根据百度百科所写,继承机制,就是利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。上
原创
519阅读
0评论
0点赞
发布博客于 5 年前

c++顺序表动态版本

在C语言中,我们实现了顺序表的动态版本,即可以改变大小的顺序表。具体代码可见http://blog.csdn.net/xy913741894/article/details/52504016而在C++中,我们也可以用类来封装实现一个顺序表,其思想和C语言基本类似,不再赘述。class SeqList{public: SeqList() : _pData(new DataType[IN
原创
489阅读
0评论
0点赞
发布博客于 5 年前

C++中String类模拟实现以及深拷贝浅拷贝

在C语言中/C++中,字符串是一个应用很广泛的类型,也是很基础的类型,C语言并没有直接处理字符串的操作而是采用字符指针和字符串数组进行操作,而在C++中标准库为我们封装了一个字符串的类供我们使用,使用需要#inlcude 头文件。我们也可以自己模拟实现一个简单的String类。在模拟实现String类的过程中,不可避免的会遇到深拷贝浅拷贝的问题,下面就深拷贝浅拷贝做一个简介。所谓深拷贝浅拷贝,
原创
985阅读
0评论
0点赞
发布博客于 5 年前

C++日期类Date的实现

在学C++类的时候,日期类是一个很基础也很重要的类,所以有必要实现一下。常规日期类的本身并不复杂,实现的过程主要涉及到了一些构造函数,拷贝构造函数,以及各种运算符的重载等,而难点主要在于如何保证日期的有效性,比如我们知道年必须为正数,月都是1-12之间的整数,各个月的天数不同以及闰年2月天数的变化等等,如何将这些体现在我们对于一个日期类对象进行自增,自减以及加减多少天得出正确的日期等运算中。
原创
7017阅读
0评论
4点赞
发布博客于 5 年前

C/C++中##和#宏

在c语言/c++中,宏(Macro)是属于编译时期(而非运行时期)的概念,采用关键字define进行定义。它只是一种简单的字符串替换,根据是否带参数分为无参和带参。它的作用还是很大的,比如提高可移植性,可读性,方便性等等,常见就是替换变量,防止重复包含头文件等#define MAX 10#ifndef __HEAD_H__#define __HEAD_H__
原创
255阅读
0评论
0点赞
发布博客于 5 年前

memcpy,memset,memmove的使用与实现

void *memcpy( void *dest, const void *src, size_t count);返回值:memcpy returns the value ofdest.参数:destNew buffersrcBuffer to copy fromcountNumber of characters to copyRemarks
原创
612阅读
0评论
0点赞
发布博客于 5 年前

构造函数和this指针浅谈

什么是构造函数类通过一个或者多个特殊的成员函数来控制其对象的初始化过程,其任务是初始化类对象的数据成员。构造函数的一些特性:1.      无论何时只要类的对象被创建,编译器就自动调用构造函数,而且在对象的生命周期内只且只调用一次。2.      构造函数名字与类名相同,且没有返回值。3.      构造函数可以重载,不同的构造函数之间必须在参数数量或者类型上有所区别4.
原创
2334阅读
0评论
2点赞
发布博客于 5 年前

C++中struct和class的区别

一、 C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。    struct能包含成员函数吗?   能!    struct能继承吗?          能!!    struct能实现多态吗?       能!!!      最本质的一个区别就是默认的访问控制,体现在两个方
转载
371阅读
1评论
0点赞
发布博客于 5 年前

简单通讯录(以数组的方式实现增删改查)

实现一个简单的通讯录增删改查简单一点可以采用数组的方式来存储元素首先给出结构体的定义:typedef struct PeopleInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char phone[MAX_PHONE]; char addr[MAX_ADDR];}PeopleInfo;typ
原创
923阅读
0评论
0点赞
发布博客于 5 年前

C语言 单链表的实现

上篇博客给出了顺序表的实现,顺序表的优点就是支持随机访问,但是除了在尾部删除插入,在其他位置进行插入删除都要移动大量元素,导致效率低下,因此为了提高插入删除的效率,有了链表这样结构。链表的定义,不再赘述,下面给出单链表的常规操作(增删改查等)的具体实现。首先定义单链表的结构typedef int DataType;typedef struct Node { DataType data
原创
432阅读
0评论
0点赞
发布博客于 5 年前

C语言 顺序表的实现 (动态)

上一篇博客写了顺序表的静态实现,即指定大小的顺序表,这篇则给出动态实现的顺序表,即可以改变大小的顺序表。给出顺序表的定义:typedef int DataType;typedef struct SeqListD { DataType *array; int size;// 记录有效元素的个数 int capacity;// 空间总大小}SeqListD, *PSeqListD;
原创
1053阅读
0评论
1点赞
发布博客于 5 年前

C语言 顺序表的实现(静态)

最近复习到C语言的顺序表,把它实现一遍。给出顺序表的定义#define MAX_SIZE 100typedef int DataType;typedef struct SeqList{ DataType array[MAX_SIZE]; int size; // 记录有效元素的个数}SeqList, *PSeqList;void InitSeqList(PSeqLi
原创
755阅读
0评论
1点赞
发布博客于 5 年前

原码反码补码以及移位按位与或异或等位操作的实例

实例全部来自C和指针课后习题,英文版p123 - 124可见主要是看到bitwise以及shift运算,在做习题的过程中顺便复习了原码反码以及补码的运算,也清除了很多知识的盲点,比如一个二进制负数如何变成十进制等。在32位的机器下,已知int a = 10, b = -25;求下列位运算。a是正数,原码,反码,补码都一样00000000 00000000 00000000 00
原创
1075阅读
0评论
0点赞
发布博客于 5 年前

C语言中的extern,static和register的一些用法

在谈extern和static用法之前,我们首先要清楚了解一些基础概念。linkage链接属性有三种:external, internal, none。C和指针给出的介绍如下:Identifiers that  have no linkage are always individuals, that is, multiple declarations of the identifier 
原创
2187阅读
0评论
0点赞
发布博客于 5 年前

字符串空格替换或删除

1.将一个字符串里面的空格替换成%20,不考虑字符数组大小溢出,不得使用库函数2.将一个字符串里面的一个或多个空格替换成一个空格这两道题都是关于字符串替换,不同的是第一道题是将一个空格替换为3个字符%20,当然这里任意3个字符都可以,而且只要保证数组大小足够大,一个空格替换成多个也无所谓,本质上是将一个字符替换成多个字符从而增加原字符的长度。而第二个的话则是将多个字符(只不过是
原创
506阅读
0评论
0点赞
发布博客于 5 年前