自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

胡小哲的博客

胡小哲

  • 博客(68)
  • 收藏
  • 关注

原创 TCP状态标识 --- URG,ACK,PSH,RST,SYN,FIN

TCP 首部: 此次我们要讨论的就是其中的状态标识 URG:紧急指针有效。 ACK:确认序号有效。 PSH:接收方应尽快将报文段交给应用层。 RST:复位连接。 SYN:同步序号,用来发起一个连接。 FIN:发送端完成发送任务。URG紧急方式,使连接的一端可以告诉另一端有些具有某种方式的”紧急数据”已经放置在普通的数据流中。 另一端被通知这个紧急数据已被放置在普通的数据...

2018-05-03 20:01:47 2928

原创 TCP --- 拥塞控制

网络发生拥塞的原因: 当数据到达一个较大的管道并向一个较小的管道发送数据时便会发生拥塞。 当多个输入流到达同一个路由器,而路由器的输出流小于输入流时也会发生拥塞。拥塞控制: 避免过多的数据注入到网络中,这样可以减轻网络中路由器或链路的负载。拥塞避免是发送方使用的流量控制,发送方感受到的网络拥塞的估计。 通告窗口是接收方进行的流量控制,接收方在该连接上的可用缓存大小。在讨论拥塞控...

2018-05-02 23:36:41 599

原创 Redis --- SORT 命令

SORT 命令SORT 命令可以根据键里面存储着的数据,对列表,集合以及有序集合进行排序。 参数: SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC|DESC] [ALPHA] [STORE destination]一般排序SORT KEY 返回从小到大排序的结果...

2018-05-02 10:40:12 320

原创 Redis 命令

Redis 命令字符串命令Redis字符串是一个由字节组成的序列。 字符串可以存储三种类型的值: 1. 字节串 2. 整数 3. 浮点数用户可以通过给定一个数值,对存储的整数或浮点数的字符串执行自增或自减操作。在有需要的时候,Redis 还会将整数转换为浮点数。Redis 明确地区分字节串、整数和浮点数的做法,使得Redis 在数据表现方面更具灵活性。数值...

2018-04-27 13:14:20 222

原创 Centos 7 安装 Reids 和 Python的Redis客户端

安装 RedisCentos 使用 yum 安装 Redis 时,会出现无法找到安装源的问题。 这是因为 Redis 在第三方源里,我们添加非官方的 epel 源库。yum install epel-release安装之后查看 yum repolist安装 Redisyum install redis安装成功之后,启动 Redis 服务systemctl ...

2018-04-25 23:32:00 1220

原创 Centos7 下安装 Mysql

Centios7 下安装 Mysql 5.7在删除之前先清空本机上的 Mysql rpm -qa | grep mysqlrpm -e -nodeps + 名称强制卸载再清楚与mysql相关的目录find / -name mysqlrm -rf + 目录名yum list | grep mysql 查看有没有相应的yum源 有的话可以直接安...

2018-04-25 21:27:46 292

原创 Redis 数据结构简介

Redis 数据结构简介概述Redis 下可以存储五种不同数据结构类型之间的映射。 这五种数据类型非别为: 1. STRING 字符串 可以是字符串,整数或浮点数。 2. LIST 列表 一个链表,链表上的每个节点都包含一个字符串。 3. SET 集合 包含字符串的无序收集器,每个字符串都是唯一的。 4. HASH 散列 包含键值的无序散列表 。 5. ZSE...

2018-04-25 15:01:19 227

原创 信号量 --- 哲学家就餐

比如我们有一张桌子,上面坐着五位哲学家 现在他们每个人都有一双筷子,并且都拥有了自己的编号。 桌子上摆满了菜,哲学家们现在开始只做两件事情,吃饭,或者思考。 当他们吃饭的时候就停止思考 ,当他们思考的时候就停止吃饭。 我们假设他们都会用筷子,而当他们要吃饭的时候都必须拿两根筷子。 而且每个哲学家并不互相交流,此时就会出现一个很严重的问题。 如果这些哲学家在准备吃饭的时候,先拿起...

2018-04-23 19:34:30 997

原创 线程同步互斥机制

线程同步互斥机制线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。例如 : 出现这种情况是因为操作系统在内核中对线程的调用的来回切换。代码可以并发的切换到其他的线程。互斥锁互斥锁以排他方式防止共享数据被并发访问。 互斥锁是一个二元变量,只有两种状态 开锁 和 上锁。 将某个共享资源与某个...

2018-04-23 17:20:35 2377

原创 Linux 多线程

Linux 多线程线程概念在一个程序里的一个执行路线就叫做线程。 每个进程都至少有一个线程。进程和线程进程是资源分配的基本单位。 线程是调度和执行的基本单位。 线程共享进程的数据:代码段,数据段,bss段和堆段,文件描述符,打开的库,mmap映射的文件以及共享内存空间。 线程也有自己的私有数据:线程 id, PCB,寄存器,栈,errno,信号屏蔽字,调度优先级。 ...

2018-04-21 12:40:34 218

原创 Linux 异步信号处理机制

信号概述信号是软件中断。 信号是linux系统下的异步处理机制。 例如:在终端按写某些按键时,会通过信号机制停止一个程序。首先,每个信号都有一个名字,都以SIG开头,通过 kill -l 可以查看 其中有很多常见信号 SIGINT :当我们在终端按下 CTRL+C 时就会产生一个 SIGINT 信号。 SIGQUIT :CTRL+\ SIGTSTP :CTRL+Z...

2018-04-19 15:29:45 1061

原创 mysql 安装与基础

安装 我们罗列出了mysql的安装包 对应的32位机安装mysqlmysql-servermysql-devel64位机安装mysql.x86_64mysql-server.x86-64mysql-devel.x86-64安装指令都为 yum install + 安装包名基础什么是数据库 由于文件的缺点 : 文件的安全性问题 文件不利于查询和对数...

2018-03-27 22:30:41 199

原创 C++ 网络爬虫 --- 爬取西安链家二手房信息

C++网络爬虫网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 在这里,我们使用 libcurl 库来对某一特定网页的内容进行抓取。libcurl 库安装首先我们需要介绍一下 libcurl 库 libcurl 库的主要功能就是用不同的协议链接和不同的服务器。 libcurl 当前支持http, https, ftp, gopher, telnet,...

2018-03-27 16:19:39 509

原创 进程间通信

进程间通信在前面我们学习了如何创建进程,但是如何让我们创建的这些进程相互联系起来,那么就需要利用进程间通信来完成。概述进程间通信就是在不同进程之间传播或交换信息,但是之前我们学过,每个进程在创建的时候都会分配自己独有的 4G 虚拟地址空间,进程之间都是相互独立的,所以一般而言是不能互相访问的,但是也有例外,那就是共享存储映射区。并且系统空间也是公共的,每个进程都可以访问,所以内核也...

2018-03-16 15:14:55 184

原创 malloc 底层实现

动态存储器分配器malloc 又称显示动态存储器分配器,动态存储器分配器维护着一个进程的虚拟存储器区域,称为堆。 我们假设堆紧接着未初始化.bss段后开始,并向上生长,对于每个进程,由内核维护着堆顶(brk —- break) 分配器将堆视为一组不同大小的块,每个块则是一个连续的虚拟存储器片,要么是已分配的,要么是空闲的。 已分配的块供应用程序使用,空闲块则可以用来分配。 已分配的...

2018-03-13 01:19:48 7012

原创 动态链接库

动态链接库又称共享库,可执行共享库。 在前面我们提到静态库中,静态库和所有软件一样,需要定期维护和更新,如果我们想要使用一个库的最新版本,我们必须显示地将程序与更新的库重新链接。 一个 C 程序通常都会使用标准 I/O 函数,在运行时这些函数的代码会被大量的赋值到每个运行进程的文本段,是对存储器资源的极大的浪费。于是共享库产生了,它解决了静态库的缺陷。 共享库实质上是一个目标模块,在运行...

2018-03-05 18:57:21 187

原创 Linux 中 popen 函数与 system 函数的区别

popen 函数函数原型#include <stdio.h> FILE *popen(const char *command, const char *type); command : 一个指向以 NULL 结尾的 shell 命令字符串的指针。这个字符串会使用 -c 标志传到 bin/sh ,shell 将执行这个命令。 type : 指向以 NULL ...

2018-03-04 00:21:58 865

原创 Linux进程概念 ---- 僵尸进程和孤儿进程

Linux 进程概念僵尸进程当子进程退出,并且父进程使用 wait 系统调用,没有读取到子进程退出的返回码时就会产生僵尸进程。 僵尸进程会以终止状态保持在进程表中,并且一直等待父进程读取退出状态代码。现在我们来模拟实现一个僵尸进程 在这里,我们创建一个子进程,等待 2s 后退出,但是父进程不回收子进程的退出码。此时子进程应该为僵尸进程。 僵尸进程的危害在前面我们提...

2018-03-01 11:59:57 245

原创 Linux中文件描述符 fd 与 FILE 结构体

Linux中文件描述符 fd 与 flie 结构体文件描述符文件描述符(file descriptor)是内核为了高效管理已被打开的文件创建的索引。文件描述符的操作返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述表,所有打开的文件都将通过此表中的文件描述符来引用。(在前面的 系统 I/O中有画图解释)文件描述符 fd 与 FILE 结构体fd 是一个非负整数,在调...

2018-02-26 18:54:29 371

原创 简单的自主 shell 编写

当我们打开一个终端的时候,我们可以在上面输入各种命令,从而与终端实现互动。 可以发现,每当一个指令的执行结束后,终端会等待我们的下一条指令的输入。 这就类似于我们写了一个死循环,一直在等待着命令的输入。当有一条指令输入时,创建子进程并将子进程替换为命令,执行子进程并且父进程等待子进程的执行结束,从而实现交互。 我们可以利用之前学的进程创建和进程替换来编写一个简单的自主shell。 ...

2018-02-26 17:03:57 462

原创 进程替换

进程替换替换原理在前面我们在使用 fork 函数创建子进程的时候,往往和父进程执行的是相同的程序。但是实际在我们的期望中,子进程应该是执行和父进程不同的代码。所以此时,子进程往往要调用 exec函数从而执行另一个程序。调用 exec 并不创建新的进程,所以调用 exec 函数并不会改变该进程的 pid。 被替换的用户的代码和数据完全被新的程序替换,并从新的程序的启动例程开始执行。...

2018-02-26 16:29:49 438

原创 可执行目标文件

可执行目标文件我们已经知道连接器是如何将多个目标模块合并成一个可执行目标文件的。 此时,我们的 C 程序已经从一组 ASCII 文件文本,转化为一个二进制文件,而且这个二进制文件中包含加载程序到存储器并运行它所需的所有信息。ELF 可执行目标文件格式 我们可以发现,可执行目标文件类似于可重定位目标文件的格式。 在 ELF 头部描述文件的总体格式,包括程序的入口点(程序运行时要...

2018-02-23 00:03:45 2090

原创 task_struct 结构剖析

在之前我们提到的,每个进程都有一个特殊的数据结构 PCB(进程控制块)来对进程进行管理。 在 linux 中,task_struct 就是我们所说的 PCB。 PCB 是控制进程的唯一手段。task_struct 内容大致可分为 - 标示符 :描述被进程的唯一标识符,用来区别其他进程。 - 状态 :任务状态,退出代码,退出信号等。 - 优先级 :相对于其他进程的优先级。 - 程序...

2018-02-20 22:39:00 314

原创 Linux 进程概念

进程概念进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 每个进程都有自己的状态,和自己独立运行的空间。 进程需要由相关的结构体来进行管理,而在 linux 中进程是由内核中的 PCB(进程控制块) 来进行管理。OS 通过 PCB 来感知一个进程的存在。进程与程序的区别程序由 代码块+数据块 组成...

2018-02-20 00:19:33 157

原创 Linux 下常见的进程调度算法

在操作系统中资源是有限的,当有多个进程或线程要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程来使用资源。 所以调度算法就是 :根据系统的资源分配策略所规定的资源分配算法。 调度算法要求 :高资源利用率,高吞吐量,用户满意等原则。 调度算法设计目标: 1. 批处理系统 增加系统吞吐量和提高系统资源利用率。 2. 分时系统 保证每个分时用户能容忍的响应时间。 3. 实时系...

2018-02-18 15:47:53 322

原创 Linux 基础 I/O

Linux 基础 I/O概念在 Linux 操作系统中,实现了两类对文件 I/O 的管理,一类遵循 POSIX 标准,Linux 操作系统自身提供的 IO 系统调用函数,直接进行 IO 系统调用,我们在这里对这些函数进行简单的介绍。特性系统调用的 I/O 函数是不带缓冲的 I/O。每个 read 和 write 都调用内核中的一个系统调用。所有打开的文件都通过文件描述符...

2018-02-13 00:05:20 217

原创 重定位

在前面,我们了解了可重定位目标文件的文件格式以及符号链接的过程。 一旦完成了符号解析,它就把代码中的每个符号引用和确定的一个符号定义联系起来。此时,链接器就知道它的输入目标模块中的代码节和数据节的大小。现在就可以开始重定位了。 在重定位的过程中,将合并输入模块,并为每个符号分配运行时地址。 重定位由两步组成重定位段和符号定义 链接器将所有相同类型的段合并为同一类型的新的聚合段。 然...

2018-02-09 22:11:15 1066

原创 静态库

静态库: 实际上所有的编译器都提供一种机制,将所有的相关的目标模块打包成为一个单独的文件。这个文件称为静态库。 静态库可以用作链接器的输入,当链接器构造一个输出的可执行文件时,它只拷贝静态库到被应用程序引用的目标模块。 在编译完成之后,静态库可以被抛弃掉。优点: 可以对文件进行打包。 运行速度较快。 较相对安全。 将编译器的实现与标准函数的实现分离开来,并且仍然对程序员保持适度的...

2018-02-08 22:59:22 1053

原创 可重定位目标文件

目标文件有三种形式: 1. 可重定位目标文件 2. 可执行目标文件 3. 共享目标文件 编译器和汇编器生成可重定位目标文件/共享目标文件,连接器生成可执行目标文件。在这里我们首先介绍可重定位目标文件。 可重定位目标文件:包含二进制代码和数据,可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。可重定目标文件格式: 注意: bss段 在目标文件中不占实...

2018-02-06 00:38:19 1149

原创 AVL 树

由于之前的搜索二叉树在单支树的情况下,时间复杂度依然为 O(N),所以我们应该对其进行调整,此时遍出现了 AVL 树,AVL 树是最先发明的自平衡二叉搜索树。在AVL树中,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是 O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。特点 : 1. AVL树本身依然

2018-02-05 17:19:42 148

原创 模拟实现 tree 指令

linux下的 tree 指令: 打印所有文件和目录,默认不打印隐藏文件 在这里,我只实现默认方式,并且文件只区分出需要进行遍历的目录文件,其他文件统一直接进行输出。要实现这个指令 首先要清楚 Linux 下的文件系统,以及如何对目录文件进行读取。文件表结构: 首先 我们要对输入的文件进行判断,判断其是否是目录文件。 如果输入的文件是普通文件,则直接输出,如果是目录文件则

2018-02-02 14:58:16 1531

原创 二叉搜索树

概念:二叉查找树(Binary Search Tree) (又:二叉搜索树,二叉排序树) 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 当我们对二叉搜索树进行中序遍历时,可以得到一个关键字的有序序列。插

2018-01-30 20:08:11 165

原创 常见排序算法

排序概念将一组杂乱无章的数据按照一定的规律组织起来。排序分内部排序和外部排序。 如果整个排序过程不需要访问外存便能完成,则称此类排序为内部排序。若参加排序的记录数量很大。 整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。常见的排序算法插入排序直接插入排序原理: 每一次将一个待排序的元素,按其关键字的大小插入到已经排好序的一组元素的适当位置上,直到所有待排序元素全部插入为止。

2018-01-16 20:23:52 247

原创 Liunx 模拟实现 ls -l

模拟实现 linux 的命令 ls -l 首先要直到所输出的内容都代表着什么。 分别对应 文件类型及权限 硬链接数 拥有者 拥有者所在组 文件大小 月 日 时间 文件名我们可以从前向后一步一步进行处理。在 linux 中,我们可以利用 stat()函数来获取一个文件的状态。#include <sys/stat.h>#include <unistd.h>int stat(co

2018-01-13 13:00:52 749 1

原创 huffman树

概念 给定 n 个权值作为 n 个页子节点,构造一颗二叉树,若带权路径长度达到最小,称这样的二叉树为哈夫曼树。huffman树是带权路径长度最短的树,权值较大的节点离根节点较近。构造 huffman 树 1、由给定的n个权值{w1,w2,w3,…,wn}构造n棵只有根节点的二叉树森林F= {T1,T2,T3,…,Tn},每棵二叉树Ti只有一个带权值wi的根节点,左右孩子均为空。 2、重复以下步

2018-01-03 13:50:41 332

原创

堆是一类特殊的 数据结构的统称,堆通常是一个可以被看作一棵树的数组对象。 堆满足的性质: 1.任一节点的值总是不大于或不小于其父节点的值。 2.堆总是一棵完全二叉树。 3.大堆/小堆。先将数组用完全二叉树的形式表现出来 此时可以发现,这棵树并不满足堆的性质。所以我们需要对这棵树进行调整,调整为大堆 / 小堆。 我们发现,在这里可以将问题分化为,可以先处理根节的左子树和右子树,最后再处

2018-01-03 13:34:46 293

原创 二叉树线索化

首先提出一个问题 为什么要线索化二叉树?二叉树遍历的本质上是将一个复杂的非线性结构转换为线性结构,使每个节点都有了唯一前驱和后继(第一个节点无前驱,最后一个节点无后继)。对于一个节点,查找其左右子树是方便的,但是查找其前驱和后继只能在遍历中找到。 线索化二叉树解决了无法直接找到该节点在某种遍历序列中的前驱和后继节点的问题。可以在节点结构中增加前驱和后继的指针,但是增加了存储开销。另一种方法是利用

2017-12-05 19:16:46 962

原创 Linux 环境开发工具

Linux开发工具1 vim编辑器vim编辑器是Uinx/Linux操作系统下标准的编译器。vim编辑器的基本模式命令模式 控制屏幕光标的移动,进行文本删除,复制等编辑工作。以及进入插入模式和底行模式。 插入模式 只有在插入模式下才可以输入文字。 按esc退回到命令模式,刚打开的vim编辑器处于命令模式末行模式 保存文件或退出,以及设置编译环境等工作。 在命令行模式下输入冒号进入底行

2017-12-02 17:17:24 354

原创 二叉树面试题

1.求二叉树节点个数 可以使用递归解决。将问题分解为求根节点+左子树的节点数+右节点的节点数。 实现 :public: size_t _Size() { //封装调用 return Size(_root); }private: size_t Size(Node *root){ //二叉树中节点个数 if (ro

2017-12-02 11:23:29 235

原创 矩阵(Matrix)

特殊矩阵的存储对称矩阵在这里给出一组对称矩阵 因为其对称性,我们不需要存储其全部内容,只需要存储其下三角矩阵或者上三角矩阵。 在这里我选择存储下三角矩阵。 设矩阵的行数为M. 则需要存储的元素个数为 M(M+1)/2,以行优先进行存储。当对此矩阵进行访问时,我们在内存中存储的数据应该是 当我们要访问第3行第2列(即i>=j)的元素时,便可以通过对其在存储的数据中的偏移量进行读取

2017-11-24 19:24:38 1359

空空如也

空空如也

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

TA关注的人

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