自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(169)
  • 资源 (4)
  • 收藏
  • 关注

原创 网络基础-应用层基础知识

网络应用体系结构客户机-服务器结构(C/S) 服务器:7*24小时提供服务。永久性的访问地址/域名 利用大量服务器实现可扩展性 客户机:与服务器通信,使用服务器提供的服务。间隙性接入网络。不会与其他客户机直接通信。 客户与服务器都是指通信中所涉及的两个应用进程。 客户是服务请求方,服务器是服务提供方。点对点结构(P2P) 没有永远的在线的服务器。 任意端系统/

2018-05-03 10:19:25 376

原创 数据结构-二叉树的前序,中序,后序遍历(非递归实现)

之前在实现二叉树的前中后序遍历时,采用了递归版本实现,比较简单。 这次,我采用了非递归版本实现。需要借助到栈的基本操作。前序根据之前学到的,前序实际上就是先访问,再遍历左子树,再遍历右子树。 下面画图解释: void PreOrderByLoop(TreeNode* root){ if(root==NULL) { return; } T

2018-05-02 18:27:14 289

原创 剑指offer-面试题4-二维数组的查找

在一个二维数组中,每一行都按照从左到右依次递增的顺序排序,每一列都按照从上到下依次递增的顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:查找时,先从右上角开始比较。 构造测试用例: 思路主要是:分为查找得到和查找不到两种情况。并且这两种情况中,也要对边界及非边界进行测试。 int key1=15;//测试用例:找得...

2018-05-01 21:09:05 125

原创 网络基础-TCP/IP模型与网络传输基本流程

TCP/IP五层模型 TCP和IP是两个独立且紧密结合的协议,负责管理和引导数据报文在网络上的传输。TCP负责和远程主机的连接,IP负责寻址,使报文被送到其该去的地方。 TCP/IP也分为不同的层次开发,每一层负责不同的通信功能。但TCP/IP协议简化了层次设备。由下而上依次是网络接口层,网络层,传输层,应用层。网络接口层:有时也称为数据链路层,通常包括操作系统中的设备驱动程序和计算机中相

2018-05-01 17:49:02 677

原创 网络基础-网络体系结构与OSI七层模型

网络体系结构计算机网络层次划分的原则时层内功能内聚,层间耦合松散。也就是说,在网络中,功能相似或紧密相关的模块应放在同一层。层与层之间应保持松散的耦合,使信息在层与层之间的流动减少到最小。 优点:各层之间相互独立。高层并不知道底层如何实现,仅需要知道该层通过层间接口所提供的服务。灵活性好。当任何一层发生变化时,只要接口保持不变,则在这层以上或以下各层均不受影响。各层都可以 采用最适合的技术来

2018-05-01 16:05:33 672

原创 网络基础-初识网络

网络的定义在计算机网络的发展过程中,主要对网络从三个角度提出了不同的定义: 1.广义的定义 计算机网络是以实现远程通信为目的,一些互连的,独立自治的计算机的集合。2.资源共享的观点 计算机网络时把地理位置上分散,能够互相共享资源的方式连接起来,并且各自具有独立功能计算机系统的集合。具有如下特征: 1)计算机通信的目的是为共享硬件,软件以及信息资源。 2)各计算机功能独立,地域

2018-05-01 14:52:12 244

原创 操作系统-页面置换算法

置换算法当出现缺页异常时,需调入新页面而内存已满时,置换算法选择被置换的物理页面。要在该过程中,尽可能减少页面的调入调出次数。把可能就需要将未来不再访问或短期内不在访问的页面调出。 评价方法:模拟页面置换算法,记录产生缺页的次数。更少的缺页,更好的 性能。最优页面置换算法基本思路:置换在未来最长时间内不会被访问的页面。 实现:缺页时,计算内存中每个逻辑页面的下一次访问时间。选择未来最长时间不访问

2018-04-30 16:44:52 314

原创 操作系统-虚拟存储

为什么要虚拟存储我们直到,内存虽然快但是容量小,且价格高。所以我们出于理想化,就会对内存产生更高的需求,比如我们希望有一种容量更大,速度更快,价格更偏移的非易失性的存储器。实际中的存储器的层次结构: 覆盖和交换覆盖技术:在较小的可用内存中允许较大的进程。 方法:依据程序逻辑结构,将程序划分为若干功能相对独立的模块,将不会同时执行的模块共享同一块内存区域。 也就是说,将常用的部分装入内存中,使它

2018-04-29 14:48:54 340

原创 操作系统-段式,页式,段页式存储管理

非连续内存分配在连续内存分配,缺点非常明显:分配给程序的物理内存必须连续。存在内碎片,外碎片。动态修改困难。内存利用率低非连续内存分配的好处是: 提高内存利用效率和管理灵活性段式存储管理进程的段地址空间由多个段组成。主代码段子模块代码段共用库代码段堆栈段堆数据初始化数据段符号表等目的:更细粒度和灵活的分离与共享将逻辑地址空间转换为不连续的段地址空间: 段:段表示访问方式

2018-04-29 13:58:44 1246

原创 操作系统-内存管理与内存分区

内存管理的需求主要是以下几点,做以了解:重定位保护共享逻辑组织物理组织重定位:由于内存是被多进程共享的。那么在在某个程序运行期间,谁也不知道会有其他那些程序驻留在内存中。所以,有时会将那些暂不需要的进程换出内存。恢复时,如果要恢复到切换之前的同一内存地址会非常困难,所以就要将进程进行重定位到内存的不同区域。保护:每个进程都应该收到保护,这是毋庸置疑的,以免被其他进程干扰到自己的正常执行。

2018-04-29 00:03:05 1492

原创 数据结构-二叉树的相关面试题总结

主要操作是以下:创建二叉树 克隆二叉树求二叉树的高度 求二叉树中结点的个数 求二叉树的叶子结点个数求二叉树中第k层结点的个数 判断一个节点是否在一棵二叉树中求结点的左孩子求结点的右孩子求结点的父结点求二叉树的镜像(递归与非递归)判断一棵树是否是完全二叉树创建二叉树树的定义是递归创建的,所以创建树也可以递归地创建一棵树,首先需要一个序列,按什么顺序来创建,我采用了前序的遍历方

2018-04-28 18:50:31 228

原创 数据结构-二叉树的前序,中序,后序,层序遍历(递归版本)

说到二叉树,最基本的操作就是遍历。四种遍历方式:前序,种序,后序,层序。本篇博客主要叙述如何用递归解决以上操作,非递归方式会另外记录。二叉树的定义我在这了采用了孩子表示法,主要是为了实现二叉树的操作,用孩子表示法便于我们找到两个孩子结点。typedef char TreeNodeType;typedef struct TreeNode{ TreeNodeType d...

2018-04-27 18:12:00 322

原创 Linux-守护进程

认识守护进程 守护进程也成为精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待某些发生地事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程所实现的。 Linux系统启动时会启动很多系统服务进程。这些服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登陆或运行程序时创建,在运行结束或用户注销时终止,但守护进程不受用户登陆注销的

2018-04-22 19:27:59 183

原创 Linux-进程间关系:进程组/作业/会话

本篇文章主要讲述进程间关系的几个基本概念。从以下几个方面叙述:进程组作业会话进程组 一个进程除了有一个进程id之外,他还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一个作业相关联,可以接受来自同一终端的各种信号。每个进程组有一个唯一的进程组id。每个进程组都可以有一个组长i进程。组长进程的标识是,其进程组id等于其进程id。组长进程可以创建一个进程组,创建该组中进程,然后

2018-04-22 13:25:09 401

原创 Linux-gdb调试多线程

之前我们叙述过如何用gdb调试多进程,现在来讲讲如何用gdb调试多线程。 首先先要了解gdb调试多线程的基本命令: Tables Are info threads 显示当前可调试的所有线程,GDB会给每一个线程都分配一个ID。 前面有*的线程是当前正在调试的线程。 thread ID 切换当前调试的线程为指定ID的线程。 thread apply all com

2018-04-22 12:20:17 212

原创 Linux-线程:posix信号量实现生产者消费者模型

与sustem v的区别之前我们学到过system v版本的进程间通信中也有syetem v版本的信号量,那么它与posix的信号量有什么区别呢? 一般来说System V版本的进程间通信用于进程,而POSIX版 本的进程间通信用于线程。他们的区别主要在于信号量和共享内存。 信号量的区别: system v版本的信号量一般是随内核的,无论有无竞争都要执行系统调用,所以性...

2018-04-22 11:16:29 1365

原创 Linux-线程的同步与互斥:互斥量,条件变量,读写锁,屏障

同步与互斥先来说说为什么线程需要同步与互斥机制。 如果每个线程使用的变量都是其他线程不会读取和修改的,那么就不存在一致性问题。同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题。但是,当一个线程可以修改的变量,其他线程也可以读取和修改的时候,我们就需要对这些线程进行同步,确保他们再访问变量的存储内容时不会访问到无效的值。 假设两个线程读写相同变量时,线程A读取变量然后给这个变

2018-04-21 21:24:33 411

原创 操作系统-死锁产生,预防,避免,检测

从以下几个方面总结了死锁的相关概念:死锁产生的条件死锁的预防策略死锁避免的方法死锁检测死锁条件说死锁条件之前先要谈一个问题:可重用资源和可消耗资源 可重用资源 资源通常分为两类:可重用资源和可消耗资源。可重用资源是指一次仅供一个进程安全使用且不因使用而耗尽的资源。进程得到资源单元并使用后,会释放这些单元供其他进程继续使用。可重用资源的例子包括:处理器,i/o通道,内存...

2018-04-20 17:44:28 1255

原创 剑指offer:面试题3-数组中重复的数字

题目1:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字时重复的,但不知道有几个数字重复了,也不知道每个数字重复了记此。请找出数组中任意一个重复的数字。例如:如果输入长度为7的数字{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或3。思路是:将下标为i的元素与下标为a[i]的元素比较,相等就说明有重复数字返回1,不相等就交换,直到交换到a

2018-04-19 23:14:12 209

原创 数据结构-求解迷宫问题带环最短路径问题

带环最短路径问题首先,构造地图: 首先构造一个多通路并且带环的迷宫。思路与之前的求多通路的最短路径一样,需要先遍历完所有的可落脚点,将最短路径保存在最小路径栈中,与之不同的是,标记方式发生了变化,这次不能是简单标记为2,而是应该标记为它的路径长度(大致),然后比较时,就可以直接比较数值,如果当前路径走到该点的路径步数比之前的值小,我就可以走这条路,继续走。 辅助函数:由于一些判断条件和以前的问题

2018-04-19 15:05:30 639

原创 Linux-线程理解,线程创建,终止,等待与分离

Linux下线程在Linux下,线程被称为轻量级进程。也就是说,Linux下是用进程模拟线程的。每一个用户态线程,在内核中都对应一个调度实体,也拥有自己的进程描述符。 在认识线程之前,一个进程对于内核中的一个进程描述符,对于一个进程id。但是现在引入线程的概念之后,情况发生了变化,一个用户进程下管辖了N个用户态线程,每个线程作为一个独立的调度实体在内核态都有自己的进程描述符,进程和内核的描述符就变

2018-04-19 10:34:11 471

原创 数据结构-求解迷宫多通路最短路径问题

上一次解决了迷宫问题的简单求解,如果迷宫中存在多通路,我们想要找寻一条最短的路径该如何解决。最短路径求解首先构造一个多通路迷宫:void MazeInitShortPath(Maze* m){ int map[ROW][COL]={ {0,1,0,0,0,0}, {0,1,1,1,0,0}, {0,1,0,1,1,1},...

2018-04-18 14:56:15 1718

原创 操作系统-理解线程概念

在学习了进程的相关概念之后,这次引入了线程的概念。 从以下几点来讨论线程:什么是线程线程与进程(区别与联系)线程的分类线程的优缺点什么是线程首先要来看一张图,这张图在前面进程时画过很多次,就不再赘述了。 常规而言:一个pcb对应着一个虚拟地址空间,通过页表映射到物理内存中。 然后我们又知道,vfork出的子进程是共享地址空间的。 所以:假设我今天vfork出三个进程出

2018-04-17 23:15:56 954

原创 数据结构-回溯法解决迷宫问题

回溯法:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或者搜索完了全部可搜索分支没有解存在为止。...

2018-04-15 20:35:59 1116

原创 Linux-core dump详解

core dump首先解释什么是core dump。 当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做core dump-核心转储。进程异常终止时因为有BUG,比如非法访问内存导致段错误。事后可以用调试器检查core文件以查清错误原因,这叫做事后调试。 一个进程允许产生多大的core文件,取决于进程的Resource Limit。默认是

2018-04-13 14:11:33 3482

原创 数据结构-栈和队列面试题

实现一个栈,要求实现push,pop,min的时间复杂度最低。 思路是:入栈时一次入两个元素,第一个元素是要入栈的元素,第二个元素是min,min为当前栈的最小元素与插入元素的较小的那个元素。出栈时每次出两个,保证栈的结构仍然是先进后出。取栈顶元素时,也能保证每次取到的都是栈里最小的元素。//实现一个栈要求,出栈入栈,返回最小值的时间复杂度是O(1)typedef struct min_stac

2018-04-12 14:53:03 312

原创 Linux-如何用gdb调试多进程

之前学习安装工具时,简单的学习使用了gdb调试器,但是还是很不熟悉,这次学习了如何用gdb调试多进程做一总结,并且复习一下之前的gdb调试。gdbgdb的功能? 主要功能 1、启动程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、动态的改变你程序

2018-04-11 14:16:24 337

原创 Linux-浅析可重入函数与不可重入函数

背景首先函数我们都不陌生,学过任何一门编程语言的都知道函数。那么什么是可重入函数?我们都知道,函数是一段被加载到内存中的代码。函数的代码可短可长,执行的长度也不能确定。在多线程中,线程之间是可以切换的。函数是一段写好的既定的代码,属于程序共有的代码段。一个进程中有多个线程,每一个线程都有可能调用这段函数去执行。然而,多线程环境中,你也不知道下一秒是那个线程在运行,随时随地都是在变化的。所以,既然我们

2018-04-10 17:08:02 559

原创 Linux-竞态条件-用信号机制实现sleep函数

相关接口函数 pause:使进程挂起直到有信号递达。 如果信号的处理动作是终止进程,则进程终止,pause没有机会返回;若信号的处理动作是忽略,则进程继续处于挂起状态,pause不返回;若信号的处理动作是捕捉,则调用信号处理函数之后pause返回-1,所以pause只有出错的返回值。my_sleep思路:main函数调用my_sleep函数,后者调用sigaction函数注册了SIGA

2018-04-10 13:10:41 274

原创 Linux-浅识信号机制

信号的基本概念首先需要区分信号机制与通信机制不是一回事,通信机制是为了传输数据,信号机制是一种通知机制,通知事件的发生。信号量是进程间通信的一种方式,与信号没有关系,信号是一种通知机制。 我们可以先抽象的描述一下信号,就像我们过马路时,遇到的红绿灯一样,我们记录下该信号,由于我们知道如何处理不同颜色的信号,所以我可以做出所对应正确的行为。信号也是如此,进程由于认识并记录下了该信号,然后再处理...

2018-04-09 17:37:19 266

原创 数据结构-基于链表实现队列

使用链表实现队列有以下操作:队列的初始化队列的入队列队列的出队列取队列首元素队列的销毁定义结构typedef char LinkQueType;typedef struct LinkQueNode{ LinkQueType data; struct LinkQueNode* next;}LinkQueNode;初始化void LinkQueInit(LinkQue

2018-04-08 17:31:43 278 3

原创 数据结构-基于顺序表实现顺序队列

首先了解队列这种结构: 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表 进行插入操作的一端称为队尾(入队列) 进行删除操作的一端称为对头(出队列) 队列具有先进先出的的特性基于顺序表实现的队列有以下操作:初始化队列入队列出队列取队首元素销毁队列定义结构定义了一个最大长度为100的队列,一个size用来记录当前顺序队列的大小,一个head一个ta

2018-04-08 11:46:17 710

原创 数据结构-基于链表实现链式栈

链式栈基于链表实现链式栈,对栈做以下操作:出栈入栈取栈顶元素初始化销毁基于栈后进先出的结构,入栈可以用头插来实现,出栈用头删来实现即可。初始化void LinkStackInit(LinkStack** phead){ if(phead==NULL) { return;//非法输入 } *phead=NULL;}销毁void Link

2018-04-07 21:08:18 506

原创 数据结构-基于顺序表实现栈

首先:要了解栈这样一种结构。 栈:一种特殊的线性结构,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素地栈称为空栈,栈又称为后进先出的线性表。 基于动态顺序表实现的栈,实现以下操作:入栈操作出栈操作取栈顶元素为了更好地实现以上操作,需要对栈进行初始化与销毁,容量不够时自动扩容的操作。顺序栈声明如下:#pragma o

2018-04-07 14:06:11 276

原创 操作系统-生产者/消费者模型

生产者/消费者问题这是一个著名的进程同步问题。描述为: 有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区取走产品去消费。所有的生产者进程和消费者都要互斥地访问公共缓冲区。即仓库一次只允许一个人进入。 不允许消费者进程到一个空缓冲

2018-04-06 23:31:10 577

原创 c语言-模拟实现atoi

这是一道被我遗漏了好久的一道题,最近被考到了,才发现好像被自己遗漏了,再次记录一下,就算查漏补缺吧。atoiatoi函数功能:用来将一个字符串转换为整形。 该函数会从第一个字符开始跳过前面的空格,直到遇到正负号才开始转换,遇到非数字或‘\0’结束转换。如果不能转换或是空字符串就返回0。首先我们先考虑需要用到的测试用例: 比如 正负数:“+1234”“-1234” 非数字:“abcd” 数字

2018-04-06 15:18:28 231

原创 操作系统-理解信号量

信号量信号量是一种常用的并发机制。基本原理: 两个或多个进程可以通过简单的信号合作,可以强迫一个进程在某个位置停止,直到它接收到一个特定的信号。任何复杂的合作都可以通过适当的信号结构得到满足。为了发信号,需要使用到一个信号量的特殊变量。要通过信号量s传送信号,进程必须执行semSignal(s)(V操作),要通过信号量s接收信号,进程必须执行原语semWait(s)(P操作);若相应的...

2018-04-05 23:01:23 2648 2

原创 Linux-进程间通信:实现信号量

信号量UNXI system v中的信号量系统调用是对PV原语的推广,在这些原语之上可同时进行多个操作,且增量和减量可大于1,内核自动完成所有操作,在完成操作前,任何进程都不能访问该信号量信号量由如下元素组成:信号量的当前值信号量上最后一个操作的pid等待该信号量的值大于当前值的进程数等待该信号量的值为0的进程数信号量实际是以集合的形式创建的,一个信号量集合中有一个或多个...

2018-04-05 10:46:09 261 1

原创 Linux-进程通信:共享内存

共享内存共享内存是Linux中最快的ipc形式。不论是管道还是消息队列,要传递的数据都要通过内核,而共享内存只需要在内存中开辟一部分空间,将该空间映射到共享它的进程的地址空间。以后这些进程间通信就不再涉及到内核,也就是说进程不在执行进入内核的系统调用来传递彼此的数据。 可以在/usr/include/linux/shm.h中查看到该数据结构 相关函数这里的函数都可以类比之前的消息队列函数学习

2018-04-05 09:11:59 264 2

原创 Github学习记录-零基础远程提交代码

学习github之前,需要了解github是什么? gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。 gitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过3

2018-04-04 13:59:33 204

秋招复习必备~

自己找工作时整理的一些资料~ 主要内容包含: C/C++ 计算机操作系统 计算机网络 软件测试等

2018-10-21

2019秋招面经

2019年秋招面经: 360 喜玛拉雅 欢聚时代 美团 腾讯 仅供参考~

2018-10-21

软件测试的艺术笔记+思维导图+常见面试题

针对阅读软件测试的艺术的笔记,详细的思维导图,以及常见的软件测试面试题。

2018-06-23

shell脚本知识点思维导图

详细的shell脚本编程的知识思维导图,适合初学者共同学习~

2018-06-23

空空如也

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

TA关注的人

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