自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 不用加减乘除实现两个数相加

剑指offer:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。两个数不能用死则运算,那怎么办呢?首先肯定要想到可以用什么来模拟加法的过程,也就是说对数字进行更加底层操作--位运算我们以4+9为例;首先来看看十进制的加法如何进行:4+9=13(进而可以用二进制来模拟)第一步,计算个位的值,不算进位,个位是3; 第二步,计算进位,得到10,如果这一...

2019-08-07 21:58:33 780

原创 Linux 下git的使用总结(详解)

一、Github---代码托管平台GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。简单来说,Github是一个代码托管的平台,公有库是免费的,所以海量的代码都是开源的,别人都在修改它,但是会给你记录操作日志,大多数公司的大型项目都是在上面运行操作的,因为他支持多用户在上面对一份代码进行版本的更新等;二、git--...

2019-08-06 01:54:47 2308

原创 Linux复习篇(七)--进程控制块pcb详解

进程控制块PCB(tatk_struct结构体)进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。 PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,它使一个在...

2019-08-05 10:23:12 917

原创 linux复习篇(六)--fork()之写时拷贝

首先,这篇博客要解决的几个问题:1.什么是写时拷贝技术?2.fork()在复制进程的时候,共享哪些东西?拷贝了哪些东西?先引入两个概念:逻辑地址(进程地址空间): cpu所生成的地址。cpu产生的逻辑地址分为:p(页号)它包含在每个页在物理内存中的基址,用来做页表的索引;d(页偏移),同基址相结合,用来确定送入内存设备的物理内存地址。物理地址:内存单元所看到的地址。用户程序...

2019-08-04 23:14:24 243

原创 Linux复习篇(五)--僵死进程和孤儿进程

僵死进程概念:一个父进程利用fork创建子进程,如果子进程先于父进程退出,而父进程收到内核发来的SIGCHLD信号,并没有利用wait 或者 waitpid 来发出进行适当处理获取子进程的状态信息(退出码),回收子进程,那么子进程的状态描述符依然保存在系统中,等待父进程收尸。、、危害:在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何...

2019-07-31 23:30:52 116

原创 Linux 复习篇(四) ---- fork()底层实现剖析(有图,超详细)

什么是一个进程?进程的概念,简单来说,进程就是正在运行的程序,是资源分配的最小单位,系统管理进程是依靠对进程控制块(PCB)的管理完成的,PCB的结构体为task_struct.fork 复制进程底层实现原理fork() ,pthread_creat(), vfork()的系统调用分别是sys_fork(),sys_clone(), sys_vfork(),它们的底层都用的是do_f...

2019-07-30 11:09:59 190

原创 数据库复习篇(四)--mysql 锁机制

目录一、什么是锁,为什么要加入锁机制?二、锁的分类及简单使用(一)、按粒度划分的锁1、表级锁(偏向于读)2、行级锁3、页级锁(二)、按锁的级别划分1、共享锁(读锁)2、排他锁(写锁)三、MyISAM存储引擎的锁1、支持表锁(偏向于读) 四、InNoDB存储引擎的锁1、支持行锁(偏向于写)(也支持表锁)2.行锁表锁之间的使...

2019-07-28 23:55:52 158

原创 数据库复习篇(五)-- mysql 索引详解

什么是索引呢?索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项.。索引的语法此处暂且用普通索引的关键字INDEX来说明索引的语法规则;...

2019-07-26 23:21:01 173

原创 数据库复习篇(四)--mysql存储引擎

什么是存取引擎?简单来说,数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎。注意一点,存储引擎是基于表的,一个表对应一个存储引擎,库可能存在多个存储引擎。一般我们mysql默认的存储引擎是InnoDB;mysql> show variables like '%storage_engine%';+------------------------...

2019-07-26 21:31:11 169

原创 Linux复习篇(三)--静态库和共享库(动态库)

什么是库?简单来说,就是预先编译好的方法的集合;常见的库就是运行时库(Runtime Library),如C运行库CRT.linux下,库存放的位置为/lib /user/lib ;头文件 /uesr/include ; 命令 /bin /user/bin库的分类:库一般分为两种:静态库(.a (linux下))动态库(.so (linux下)),所谓静态、动态是指链接过程...

2019-07-26 11:21:22 216

转载 linux动态库的制作和路径安装

动态库*.so在linux下用c和c++编程时经常需要使用。1、动态库的编译下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。------------so_test.h--------------void test_a();void te...

2019-07-26 11:18:53 803

原创 Linux复习篇(二)--makefile文件及make命令

什么是makefile文件?介绍一下make命令,make命令是GNU的工程化编译工具,它用于编译大量互相关联的源代码,使用它可以实现项目的工程化管理,提高开发效率。那么对于一个项目,该如何让它按照我们预想的规则去编译链接执行呢?这就要用到我们要学习的Makefile了。Makefile的作用就是在执行make命令的时候指定编译和链接的规则,包括源代码文件之间的链接关系、依赖关系等。它关系到整...

2019-07-26 09:38:48 281

原创 Linux 复习篇(二)---命令篇

操作文件相关的:cd 更改路径 touch 创建普通文件 rm 删除普通文件 mv 移动文件(重命名)cp 拷贝文件 mkdir 创建目录文件 ...

2019-07-23 21:48:43 96

原创 Linux复习篇(一)--目录结构及文件篇

目录结构/(根)是所有目录的顶点。 目录结构像一颗倒挂的树。 目录和磁盘分区,默认是没有关联的。 /(根)下不同的目录可能会对应不同的分区或磁盘。 所有的目录都是按照一定的类别和规律组成的。文件类型:-:普通文件 d: 目录文件 p:管道文件 l:链接文件 c,b:设备文件 s:套接字文件文...

2019-07-21 22:48:54 98

原创 数据库复习篇(三)--SQL 之 DCL(数据控制语言)

DCL为数据控制语言,主要用来权限管理。谈到数据库权限,首先来说说两个专有名词,目的是了解当今数据库的两大权限形式。 自主访问控制(简单来说,就是有一个超级用户拥有所有权限,其他用户的任何操作需要超级用户分配权限)。 管理的方式不同就形成不同的访问控制方式。一种方式是由客体的属主对自己的客体进行管理,由属主自己决定是否将自己客体的访问权或部分访问权授予其他主体,这种控制方式是自...

2019-07-21 22:06:57 321

原创 数据库复习篇(二)--SQL 之 DML(数据操作语言)

DML称之为数据操作语言,对表的数据进行操作;(简而言之,就是数据的增删改查);插入数据:全部属性插入:代码:insert into 表名 valus(对应的值);部分属性插入:(要注意那些约束条件,如果不为空的约束等未插入数据会报错);代码:insert into 表名(属性) values (填对应前面属性的值);小批量插入:(多列数据同时插入)代码:ins...

2019-07-21 21:33:55 177

原创 数据库复习篇(一)--SQL语言 之 DDL(数据定义语言)

首先,提两个linux下bash终端sql开机命令及一些注意点(首先你要再linux安装mysql,哈哈)1.service mysqld start ,开启数据库服务器端;2.mysql -u root -p ,以root身份+密码登陆数据库;3.mysql 语句 以 “;”或者“\g” 代表语句结束;4.mysql下,默认存放的库:information_schema ...

2019-07-21 17:36:03 242

原创 逆置链表--头插法+就地逆置+辅助栈逆置法

头插法:简单来说;就是依次把头指针指向结点的后面所有结点依次插入头指针指向的位置。以上是不带头结点的单链表形式;第一步:用一个变量p保存头指针指向结点的下一个结点,再将头针指向的结点的next置为NULL,即断开1和后面结点的连接。第二步:只要将p往后跑,依次将p指向的结点插入head指针与第一个结点之间即可;所以这里用p指针不为NULL作为循环条件,q保存p的下一个结点,插入完成...

2019-07-21 15:59:44 323

原创 c++复习篇(三)--函数调用堆栈

首先介绍函数调用堆栈反汇编语言里面几个术语的意思:栈:对栈的理解是,栈是一段存储空间,供系统或者操作系统使用,对程序员来说一般是不可见的,除非从一开始由程序员自己通过汇编等自己构建栈,栈会由系统管理单元自己申请释放。栈是从高地址向低地址生长的,既栈底在高地址,栈顶低地址。 eax,ebx,ecx,edx寄存器:狭义来说将其统归为存放数据的寄存器; ebp:栈底指针,基地址; esp:栈顶...

2019-07-20 00:59:56 213

原创 c++复习篇(二)--虚拟地址空间布局

4G虚拟地址空间布局4G的虚拟内存空间:(因为地址总线为32根,所以为4G)其中1G是属于内核空间,另外的3G属于用户空间所有的进程都拥有属于自己的用户空间,但却共享一个内核空间。用户空间:①:128M大小的不可访问区域(保留区)我们通常将申请的临时指针变量初始化时置为NULL,可以防止后续无意使用这个指针出错,因为NULL == 0x0,将其指针指向...

2019-07-18 21:57:20 136

原创 c++复习篇(一)--编译链接原理

从.c/.cpp文件到进程中间经过哪些步骤呢?1.预编译(gcc(g++) -o main.i -E main.c 生成.i文件)删除#define,替换宏变量; 处理预处理指令,如#if #endif等; #include,递归展开头文件; 删除注释 添加行号和文件标识,用于调试 #pragma存在2.编译(gcc(g++) -o main.s -S main.i 生...

2019-07-18 21:47:34 105

原创 字符串匹配:BF算法和KMP算法

BF算法:朴素的模式匹配算法,用于在主串中定位字串首次出现的位置。例如:string src="abcnicessa"; string des="nice";一直用子串的首位与主串的各位相比,直到找到相等的位。int BF(string src, string des,int pos){ unsigned int i=pos, j=0; while (i < sr...

2019-04-17 21:03:55 515

原创 二叉树----遍历(先序、中序、后序遍历的递归、非递归+层次遍历)

所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。一、先序遍历递归方式实现:访问根结点(此处的根结点并非特指整棵树的根结点,泛着所有子树的根节点); 递归访问左孩子; 递归访问右孩子;void PreOrder(BtNode *...

2019-03-20 20:04:49 147

原创 二叉树---创建

二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree),二叉树的储存结构typedef char ElemType;typedef struct BtNode { BtNode *leftchild; BtNode *rightchild; ElemType data;}BtNode, *Bina...

2019-03-17 17:26:20 119

原创 数据结构----队列

一、顺序队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列...

2019-03-17 15:00:06 131

原创 数据结构-------栈

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。栈的特性:后进先出。1.顺序栈(1)顺序栈的的存储结构(底层是数组实现的,就涉及到数组的容量问题;)typedef int ElemType;//便于修改要存储的数据类型;typedef struct stack{ ElemType *data; int size; int top;}S...

2019-03-17 14:47:44 79

原创 数据结构----双向链表(循环和非循环)

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,一般分为带头结点双向链表,和不带头结点(带头指针)双向链表(多用做循环双向链表)。1.带头结点的双向链表(有两个指针域,一个指向它的前驱,一个指向它的后继)(1)、双向链表的存储结构双向链表和单链表的区别在于...

2019-03-16 16:15:07 1172

原创 数据结构---单链表(循环和非循环)

单链表是线性表链式存储的一种,其储存不连续。单链表的数据结构中包含两个变量:数据和指向下一结点的指针。一个结点只知道下一个结点的地址。一个单链表必须有一个头指针,指向单链表中的第一个结点。否则链表会在内存中丢失。1.带头结点的单链表(头结点的数据域为空,仅仅只有一个指针指向下一个结点,最后一个结点的指针域指向NULL)(1)定义每个结点的存储结构为数据域(类型可以自己改)和指针域(指向...

2019-03-16 15:51:16 723

转载 c++内联函数(真TM详细)

1. 内联函数在C++中我们通常定义以下函数来求两个整数的最大值:复制代码代码如下:int max(int a, int b){return a &gt; b ? a : b;}为这么一个小的操作定义一个函数的好处有:① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多② 如果需要做任何修改,修改函数要比找出并修改每一处等价表...

2019-03-15 15:37:28 493

原创 const和#define的区别,详细!

区别:(1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用 (2)就起作用的方式而言: #define只是简单的字符替换,没有类型检查,存在边界的错误;const对应数据类型,进行类型检查; ...

2019-03-15 15:14:18 6168

原创 c和c++的区别

 函数参数可以赋默认值(C++)在函数声明或者定义的地方,给参数赋默认值;在同一作用域下(或者说同一文件内,因为在程序只会依据本文件中的默认值生成指令,而不会管另外的文件传的默认值),函数参数赋默认值的顺序为从右至左,不可重复赋值。 在函数调用的时候,可不必穿参数,会默认传默认值;宏函数和inline(内联)函数(C++)宏函数的特点:不存在栈帧的开辟;不存在参数的带入;不存在返回...

2019-01-19 23:23:38 219

原创 编译链接过程原理

首先我们引入4G虚拟地址空间,来进一步阐述编译链接原理。保留区:举个例,我们经常使用NULL初始化指针变量,NULL的地址为0x00,因为NULL == 0x0,将其指针指向0x0这个地址时,因为0x0这个地址属于保留区,没有访问权限的。通常是128M,但也不是固定的。.text段:代码段,这个区域存储的是代码中的指令。指令:一份代码是由数据和指令构成的,除数据外剩下的都叫做指令,另外...

2019-01-18 21:14:00 308

原创 经典例题:判断一个数的二进制中1的个数;

下面分析几种思路1.按照常规的十进制与二进制转换计算来说,例如一个数60;给定一个计数器count,60里包含2的次方最大是2^5=32,count+1;剩下的数为60-32=28,28包含最大的2的次方是2^4=16,count+1;剩下的数为28-16=12,12包含2的次方最大是2^3=8,count+1;剩下的12-8=4,4包含2的次方最大是2^2=4;剩下的为4-4=0,结束。...

2019-01-11 15:16:16 2387 1

原创 ptmalloc的分配机制:mmap ()和sbrk()、brk()

首先,引入4G的虚拟内存空间。其中1G为内核空间,3G为用户空间,用户空间包括堆栈,代码段,数据段,保留区,环境变量,命令行参数存放。栈Stack存的局部变量,而且栈是有界的,由系统自行处理。而Heap堆却不同,所以着重的来讲述一下Heap内存分配策略。   首先我们要知道,我们动态申请内存都是申请虚拟内存,当真正要使用的时候内核再给你划分物理内存。Heap的动态内存分配额主要操作...

2019-01-11 00:37:36 695

原创 关于进程地址空间的段式内存管理(实地址模式和保护模式)及页式内存管理

进程地址空间 实地址模式(段式管理):在X86系列中的8086,要求寻址能力为1M,但是它的数据总线宽度仅为16(即16位),只能产生64k的寻址能力,此时,设置了段寄存器,段寄存器中有20位,内部地址中的高12位与段寄存器中的16位相加,而内部地址中的低4位保留不变。一个进程能连续的访问64k的空间,同时根据段寄存器设置的基地址,可以任意访问内存,此时线性地址就等同于物理地址,缺乏内存保...

2019-01-10 22:41:12 561 1

原创 替换空格经典例题

题目:将字符串中的空格替换成“%20”;要求时间复杂度为O(n);分析:常规暴暴力法可以解决这个问题,思路为定义两个下标,一个首下标p,一个尾下标q;首下标p往后跑,遇到空格,尾下标q往前跑,直至与首下标p相等,依次把 把赋给下第两个单元(arr[q+2]=arr[q2],2为空格及“%20”长度的差),此时空出来三位,就依次赋值“2,0,%”,最后q回到现有字符串的最后位置,循序上步骤。这样...

2019-01-10 13:48:15 121 1

原创 不使用if switch方法判断两个数的大小

例如给定a=2;b=3;判断a,b的大小性。因为不能用判断语句,我们需要借助一些数学思想来间接的获取其中大的或者小的。由此我们引入绝对值的思想,|a-b|的化简是要根据a、b的大小来确定,如果a&gt;b,则|a-b|=a-b;如果a&lt;b,|a-b|=-(a-b)=b-a;由此性质,我们可以设计一个简短语句来间接的判断a,b的大小。代码:int a=2;int b=3...

2019-01-08 21:29:14 2435

原创 epoll的底层实现机制

1 .epoll_create() //创建内核事件表 容纳事件的容器2.epoll_ctl() // 向内核事件表中 添加、修改、移除 事件3.epoll_wait() // 检查获取就绪事件 首先谈一谈epoll_create();sys_epoll_create是创建一个新的内核事件表,分别通过ep_getfd()、ep_file_init()函数分配struct f...

2019-01-03 22:23:25 4756 4

原创 fork()的底层实现机制

fork()底层实现机制fork(),vfork(),_clone()都是通过调用clone(),然后由clone()去调用do_fork()。1.   :代表着进程描述符,即进程控制块PCB。:为子进程分配新的pid参数。最大值默认为32768,short int短整型的最大值,它就是系统中允许同时存在的进程的最大数目。最小值即为pid重置起始点,如图:。 2...

2019-01-02 21:21:19 596

原创 Linux系统调用的分析和实现机制

系统调用(用户空间与内核空间的交互) 系统调用的含义:系统调用是实现系统功能的子程序。系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户自己提供,运行于用户态。。在Linux中,系统调用是用户空间访问内核空间的惟一手段。 系统调用的实现:图示: 用户空间执行一个系统调用,它们不能直接调用内核中的内核函数,因为内核处于受保护的地址控制,不允许...

2019-01-01 15:54:21 335

空空如也

空空如也

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

TA关注的人

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