![](https://img-blog.csdnimg.cn/20181206165825269.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
系统性学习
文章平均质量分 77
此专栏包含编程语言,以及系统等专业领域知识点的系统学习博客。
MisakiFx
个人博客:https://misakifx.github.io/
展开
-
【操作系统原理】第二章-进程和线程
进程和线程进程什么是进程 在操作系统中,操作系统需要对各种资源进行管理,大概可以分为以下几类:内存,文件,磁盘,进程。所谓进程就是操作系统有序管理应用程序的执行的方式,来保证以下几点: 1、所有资源对多个应用程序是可用的。 2、物理处理器在多个应用程序中切换,保证所有程序都在执行中。 3、处理器和I/O设备都能得到充分的利用。 因此所有现代操作系统都依赖于一个模型,在该模型...原创 2020-02-20 21:37:12 · 628 阅读 · 0 评论 -
【操作系统原理】第一章-操作系统概述
操作系统概述操作系统设计的目标和功能 在最早期的计算机中,并没有能够称得上是操作系统的服务管理程序,例如早期的串行处理计算机,就是人们把程序一个一个输入进计算机,设定好预计时间,然后让操作系统进行执行。这样的串行处理存在着调度不合理,准备时间长的问题,并不便于使用。 于是人们想方设法希望可以设计出便于使用的操作系统,而到现代,计算机已经普及,大众对于操作系统的要求更加严格,企业和实验室对...原创 2020-02-09 00:59:40 · 877 阅读 · 0 评论 -
【DS】第五章-排序
排序基本概念 本章会介绍并且实现,常用的几种排序算法及其思想,但是关于排序除了时间复杂度和空间复杂度这两个衡量算法的基本标准外,还引入了稳定的概念。稳定 如果一个排序算法排序结束后,表中相同大小的元素依然可用保持和排序前一样的相对顺序则称该排序是稳定的,反之是不稳定的。 举个例子,以下这个序列中,出现了相同的元素3,为了便于区分,我将其中一个用红色标记出来。 如果我们进行了某...原创 2020-01-10 00:08:47 · 220 阅读 · 0 评论 -
【DS】第四章-二叉树
树的概念及结构什么是树 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多 个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结 点可以分为多个不相交的子树。 下图就是一棵常见的树。树的常用名词...原创 2020-01-06 17:47:17 · 197 阅读 · 0 评论 -
【DS】第三章-栈和队列
第三章 栈和队列栈栈的特性 栈是一种线性结构,这种特殊的线性结构有着最大的特点——后进先出(Last In First Out)。最后压入栈的元素会最先被弹出。 由于栈只用在同一端进行插入和删除,因此我们优先选择使用顺序表,因为在顺序表的末尾插入和删除的时间复杂度都是O(1),并且操作简单实现 栈的实现可以基于顺序表、链表和双端队列,这里使用最简单方法基于顺序表来实现栈。#in...原创 2019-12-14 21:01:36 · 167 阅读 · 0 评论 -
【Cpp】第十九章-Cpp11新特性
Cpp11新特性 Cpp11中新增了很多新的语法,很多之前我们都已经有介绍过初始化列表如何使用 在Cpp11中允许使用初始化列表初始化任何类型,不论是内置类型还是自定义类型都可以使用初始化列表进行初始化,而在Cpp98的版本中是不能初始化自定义类型的。#include <iostream>#include <vector>class Test{publ...原创 2019-11-10 15:54:51 · 780 阅读 · 0 评论 -
【Cpp】第十八章-空间配置器
空间配置器什么是空间配置器 空间配置器是为各个容器高效管理空间的工具,负责空间的申请与回收,虽然一般情况下我们用不到它,但是研究空间配置器可以让我们对STL有更深的理解。为什么需要空间配置器 我们之前在实现各个容器的时候,需要申请空间大的地方都是通过new申请的,但是这样的申请方式有着很大的缺陷: 1、空间申请和释放需要自己管理,容易造成内存泄露。 2、频繁向系统申请小块内存,...原创 2019-11-06 20:48:43 · 212 阅读 · 0 评论 -
【Cpp】第十七章-unordered版本关联式容器
unordered系列关联式容器什么是unordered系列 unordered系列的关联式容器有unordered-map/unordered-set/unordered-multimap/unordered-multiset,这些版本的关联式容器和普通版本的又有什么区别呢?我们简单使用下和普通版本的做一个对比。#include <iostream>#include <...原创 2019-11-04 21:59:12 · 296 阅读 · 0 评论 -
【Cpp】第十六章-关联式容器
关联式容器 STL中关联式容器有以下几种map/set/multimap/multiset/unordered_map/unordered_set/unordered_multimap/unordered_multiset,所谓关联式容器即他们内部存储的是具有关联性的key-value形式的键值对。本文先从他们的基础使用开始讲起,逐渐深入到底层实现原理,并且最后从二叉搜索树到红黑树再到哈希桶逐...原创 2019-11-02 20:33:18 · 237 阅读 · 0 评论 -
【DS】第二章-顺序表和链表
第二章 顺序表和链表顺序表什么是顺序表 顺序表是物理地址全部连续的存储数据的方式。顺序表分为动态顺序表以及动态的顺序表,静态的顺序表一般很少使用,因为其大小一旦固定不能再进行改变。 顺序表在开发中十分经常使用,因为其方便简单,并且易于操作。数组就是顺序表的一种,因为其在逻辑结构上是线性的,在物理结构上是连续的。由于十分常用在Cpp的STL库中封装了以顺序表为数据结构的vector容器供...原创 2019-10-21 22:07:34 · 181 阅读 · 0 评论 -
【Cpp】第十五章-类型转换
类型转换C中的类型转换 C语言中的类型转换分为隐式类型转换和强制类型转换两种。#include <stdio.h>int main(){ //隐式类型转换 int i = 10; double d = i; printf("%d, %.2lf\n", i, d); //强制类型转换 i = (int)d; printf...原创 2019-10-18 17:24:36 · 220 阅读 · 0 评论 -
【Cpp】第十四章-智能指针
智能指针基础概念为什么要有智能指针 首先先看一段程序,看看这段程序可能会出现什么问题。#include <iostream>using namespace std;void Func(){ int* ptr = new int[10]; //...假设这其中有很多代码 throw "error!"; // delete[] ptr;}...原创 2019-10-17 21:04:15 · 584 阅读 · 0 评论 -
【网络】第七章-典型IO模型
典型IO模型IO的种类 IO模型根据特性可以分为以下几个种类:阻塞IO,非阻塞IO,信号驱动IO,异步IO,多路转接IO。阻塞IO 为了IO发起IO调用,若IO条件不满足则一直等待,直到条件具备。非阻塞IO 为了IO发起IO调用,若条件不满足则直接报错返回,执行其他指令。之后再次发起IO调用,条件不满足则继续报错返回,条件满足则直接进行数据拷贝后调用返回。 阻塞与非阻塞的区别...原创 2019-10-11 21:35:25 · 166 阅读 · 0 评论 -
【Cpp】第十章-模板进阶
模板进阶 之前的博客已经介绍过模板的概念,这是Cpp在实现泛型编程中不可缺少的一环,在模板进阶的讨论中会着重于模板的更为高级的使用。非类型模板参数使用 在模板中我们通常都是定义一个类型模板参数,在进行实例化的时候通过传入类型来实例化模板,但是模板中也可以定义非类型的模板参数。用一个封装的定长顺序表进行举例。#include <iostream>#include <...原创 2019-08-19 18:45:39 · 180 阅读 · 0 评论 -
【Cpp】第九章-STL_stack类和queue类
stack类和queue类 stack和queue以及priority_queue(优先级队列)是STL中三大容器适配器,将其称为容器适配器是因为其在底层只是对现有容器进行的了封装而并没有重新实现。因此在容器适配器中都有让传入容器的模板参数。容器适配器 适配器是一种设计模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:将一个类的接口转换成客户希望的另外一个接口。适配器模...原创 2019-08-05 18:07:31 · 358 阅读 · 0 评论 -
【Cpp】第八章-STL_deque类
deque类基础介绍 deque是双端队列,它提供了和vector类似的接口但是底层的实现与vector完全不同,vector底层用三个指针指向数组的起点,尾部和总容量的尾部,并且所有元素都是连续的,但是在deque中所有元素并不一定都是在连续的内存空间上的。deque在底层实现上是将一个连续的空间分段进行管理,并将它们的首地址用一个指针数组进行管理,这样特殊的存储结构使得它在头部和尾部增加...原创 2019-07-30 16:55:36 · 176 阅读 · 0 评论 -
【Cpp】第七章-STL_listl类
list类基础介绍 list类是STL中封装的链表模板类,并且底层实现是以双向链表作为基础进行封装的。在数据结构中,线性存储结构中主要分为顺序表和链表,前者在物理结构上拥有连续的内存空间和地址,在STL中vector和string都是使用了这种结构,其最大的特点就是方便进行随机访问并且尾插和尾删都能达到O1的时间复杂度并且使用方便,而链表作为物理结构上内存空间不连续的数据结构,其最大的特点就...原创 2019-07-29 23:16:10 · 274 阅读 · 0 评论 -
【算法】第二章-搜索
搜索深度优先搜索(DFS) 深度优先搜索是使用递归的方式以深度为主逐个探索遍历每种情况,在排列组合,迷宫问题中十分常用。深度优先搜索思想简单,但是由于使用递归,要求我们遍历时探索的必须深度有限。不然有可能会使栈溢出。还要注意有时我们在使用深度优先搜索时情况过多,而大部分是无用解时就需要套入剪枝。 模型:DFS(){ //1.判断边界,如果已经到达搜索的最深,则回退尝试其他可能...原创 2019-07-27 17:50:24 · 123 阅读 · 0 评论 -
【Cpp】第六章-STL_vector类
vector类基础介绍 vector类是STL中另一大容器,它十分类似于一个顺序表,不过经过封装它已经变成了一个可变长度并且拥有各种功能的顺序表,在其内部我们可以通过利用数组进行实现。vector是很常用的容器,因为它支持随机访问,并且尾插和尾删拥有O1的时间复杂度。但是在中间插入时要更高的时间复杂度,最差情况下需要遍历整个数组才能进行插入。它与string的物理与逻辑结构上十分相似,不过它...原创 2019-07-24 22:35:08 · 213 阅读 · 0 评论 -
【Cpp】第五章-STL_string类
string类STL STL是Standard Template Library的简称,中文名为是标准模板库,在Cpp中模板是构成泛型编程的基础,我们利用模板可以极大程度地提高我们的代码复用率,但是如果模板要我们现写也有点过于繁琐,不过好在Cpp中为我们写代码方便为我们制作了一套标准地模板库,供我们直接使用十分方便。STL的版本 STL发展至今也不是一气呵成的,随着发展和进化,STL一...原创 2019-07-22 20:55:57 · 310 阅读 · 0 评论 -
【算法】第一章-动态规划
第一章-动态规划动态规划求解模式 动态规划具备了一下三个特点: 1、把原来的问题分解成了几个相似子问题 2、所有的子问题只需要解决一次 3、储存子问题的解 从以下四个角度考虑: 1、初始状态定义 2、状态间转移方程 3、状态的初始化 4、返回结果 解决问题主要适用于:查找最优解,最大值/最小值,可不可行,是不是,方案个数例1 斐波那契数列 牛客网:...原创 2019-07-20 18:30:43 · 186 阅读 · 0 评论 -
【Cpp】第四章-模板初阶
泛型编程 在我们进行大型程序的编写时往往会遇到一类问题,同一个函数或类我们希望多种类型数据传入时都能完成类似或者相同的功能,但是在C语言中我们很难做到这一点因为我们往往在换了一个数据类型后就要重新写一遍函数,这样耽误我们大量的时间,呢么有没有一种语法在Cpp中能够使让我们的代码成为一种模板,不同的数据类型传入也依然能够执行类似的功能呢? 正所谓世界是由懒人创造的,于是在C++中引入了模板这...原创 2019-07-15 20:15:15 · 184 阅读 · 0 评论 -
【Cpp】第三章-内存管理
内存管理C++内存管理 在C语言中,我们想要动态分配内存空间需要使用到malloc,calloc,realloc函数,在C++中我们同样有动态进行内存管理的方式,并且与C语言中的内存管理有着一些区别。new/delete 在C++中我们使用new进行内存的申请,用delete进行内存的释放。他们的使用比malloc和free更加简单方便。内置类型的内存分配与释放#include &...原创 2019-06-11 01:37:43 · 338 阅读 · 0 评论 -
【Cpp】第二章-类和对象-下
类和对象初始化列表 我们之前想要在类创建时就对类进行初始化时使用构造函数直接在构造函数中对成员变量进行赋值。但是这种方法并非是最好的方法,并且有一些情况比如说常成员函数我们就无法在构造函数中初始化,因此有了新的对成员进行初始化的方法——初始化列表。使用 初始化列表是和构造函数写在一起的,会在执行成员函数函数体之前优先利用初始化列表对成员变量赋予初值。#include <iost...原创 2019-05-28 15:12:09 · 143 阅读 · 0 评论 -
【Cpp】第二章-类和对象(中)
类和对象类的六个默认成员函数 在我们构建一个类之后即使我们在其中不写任何的成员函数,在其中也会有6个默认编译器自动生成的成员函数,这些函数构成了类的基本功能包括初始化,销毁后的清理工作等。当然这些自动生成的成员函数功能有限有时候或许无法达到预期的效果,因此我们可以对其进行重载让其能够达到我们需要的功能。 1、构造函数 2、析构函数 3、拷贝构造函数 4、赋值运算符重载函数 ...原创 2019-05-17 15:03:20 · 139 阅读 · 0 评论 -
【Cpp】第二章-类和对象(上)
类和对象 从本章开始我们就要开始学习C++ 中的最为重要的部分,也是让C++ 得以实现面向对象,得以更加方便的进行大型项目编程的最重要的部分——类和对象,类和对象的存在使C++得以完成封装。类和对象初步认识简介 什么是类什么是对象呢? 类可以看作是一个类别,是一类事物的抽象和归纳。比如在现实世界中类可以是兔子,可以是人,可以是某一个职业,这是一类事物,我们将其抽象出来,而并非具体的。与...原创 2019-05-15 00:04:33 · 130 阅读 · 0 评论 -
【Cpp】第一章-Cpp入门
第一章 C++入门C++简介什么是C++ C语言是面向过程式的语言,在处理小规模的问题时则能体现出其简单易上手的的优势,但是在面对大型程序或需要高度抽象化的程序时,C语言就显得略有鸡肋。在20实际80年代,计算机界为了解决软件危机提出了面向对象(OOP)思想的变成模式,于是支持OOP的编程语言也应运而生。 1982年Bjarne Stroustrup博士在C语言的基础上引入并且扩充了面...原创 2019-05-11 23:12:06 · 443 阅读 · 0 评论 -
【Linux】第七章-进程信号
第七章-进程信号信号基本认识 生活中处处充满信号,信号的存在就是是为了传递和表达信息,通知事件的发生。并且信号是有生命周期的,信号在产生后到处理完毕之前才是信号的有效期。 在对于系统来说,当软件中断,便会产生信号,通知发生了某件事情,为了说明不同的事件,所以系统中的信号有不同的种类。信号的种类 在Linux下我们可以使用kill -l产看信号的种类,会发现一共有62种不同的信号。其...原创 2019-05-02 15:43:09 · 247 阅读 · 0 评论 -
【Linux】项目-minishell的实现
minishell的实现实现原理 我们在这里手动实现一个小型的shell,可以用来处理我们一般常规的指令如ls,还可以附加参数-l,并且还可以进行重定向操作。 实现原理很简单,我们将用户输入的字符串读取到我们的缓冲区中,然后首先遍历一遍整个缓冲区看是否存在重定向符>或者>>,并且将重定向符改为\0并且读取出重定向的文件,随后保存判断结果。之后我们再次遍历一遍进行指令处理...原创 2019-05-01 21:40:09 · 519 阅读 · 0 评论 -
【Linux】第六章-进程间通讯
第六章 进程间通讯基本介绍为什么需要进程间通讯 由于进程的独立性当我们想要一个进程把数据传输给另一个进程就需要进程间通讯的方式。但是想要传输数据就需要共同的媒介,以此达到数据传输,数据共享进程间访问控制等目的。方式 由于通讯目的不同,场景不同,因此操作系统提供了多种进程间通信的方式。 1、管道(命名/匿名):传输数据。 2、共享内存:共享数据 3、消息队列:传输数据 ...原创 2019-04-25 15:32:12 · 139 阅读 · 0 评论 -
【Linux】第五章-基础IO
第五章 基础IO回顾标准库IO接口 我们在C语言中已经见过很多包含在标准库中的IO接口:fopen fclose fwrite fread fseek...,在fopen中有一些不同的文件打开模式:r r+ w w+ a...,而要想对文件进行操作我们需要用到句柄——FILE*,之前我们称之为句柄,但它实际上是一个文件流指针,stdout stdin stderr他们也是文件流指针,用来操作...原创 2019-04-25 10:51:36 · 118 阅读 · 0 评论 -
【Linux】第四章-进程控制
进程创建fork() fork()可以用于创建一个子进程,并且父进程返回其子进程的PID,子进程返回0。子进程会完全复制父进程的PCB并且会优先执行父进程。/** * * fork初使用 * 通过复制调用进程,创建一个新的进程(子进程) */#include <stdio.h>#include <unistd.h>int main(){ prin...原创 2019-04-24 21:45:11 · 127 阅读 · 0 评论 -
【Linux】第三章-进程概念
从第三章起我们将进入Linux系统编程的阶段,我们将从计算机操作系统的角度进一步学习Linux。冯诺依曼体系结构 在这里又要旧话重提讲一下冯诺依曼体系结构,在冯诺依曼提出计算机的理论组成结构后,现代计算机的组成结构基本都是按照这一套冯诺依曼几十年前提出的体系结构进程设计与制造的。可以说冯诺依曼奠定了现代计算机的硬件体系结构。 冯诺依曼体系结构可以概括为将计算机分为以下几个部分:1、输...原创 2019-04-10 19:43:39 · 158 阅读 · 0 评论 -
【Linux】Linux基础-3
Linux基础第3节Linux文件相关命令 在Linux中文件分为以下几种: -:普通文件 d:目录文件 l:符号链接文件 p:管道文件 c:字符设备文件 b:块设备文件 s:套接字文件 以下文件相关命令以作补充。 tac:逆序显示文件内容。 more:分页显示文件内容,键入命令后可以用空格向下翻页,b向上翻页,回车按行向下移动,q退出。 le...原创 2019-03-26 23:32:32 · 170 阅读 · 0 评论 -
【DS】第一章-初识数据结构
前言什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指之间相互存在一种或特定关系的数据元素的集合。什么是算法 算法是解决一类问题的一系列计算步骤。数据结构和算法的重要性 笔试,面试必备。实际项目开发提供思想和思路,程序员的内功。如何学好数据结构 1、疯狂写代码。 2、注意画图和思考。不懂得地方多画几遍图,思考出思路过后再用代码实现...原创 2019-03-21 11:06:20 · 179 阅读 · 0 评论 -
【C语言】第十四章-程序的编译
第十四章 程序的编译程序的编译过程 在我们使用ide或者gcc的时候,编译器总是自动帮我们直接生成了可执行文件,但是在编一个过程那种还可细分为几个步骤,这几个步骤的说明则是这一章的重点。预处理 预处理是编译器对我们的代码进行的第一道处理 ,在这个过程中编译器会做以下几件事情。 1、拷贝头文件。 2、去掉注释。 3、对宏展开。 4、处理条件编译。 我们在Linux中可...原创 2019-03-18 16:53:13 · 157 阅读 · 0 评论 -
【C语言】第十三章-文件操作
第十三章-文件操作 之前我们所讨论的动态内存管理所操作的是计算机中的内存,而本章节的内容所讨论的核心是计算机的外村,也就是磁盘。我们往往想要将一个程序开辟的内存中数据存储到外存中,以供下次程序启动时使用,而本章节就会讨论相关语法。打开文件 我们所有的文件相关操作都是使用一个文件的指针进行操作的,而这个文件的指针我们还有一个名字就是句柄,句柄就像是遥控器,我们往往无法直接对文件进行操作,但...原创 2019-03-11 14:55:13 · 233 阅读 · 0 评论 -
【C语言】第十二章-动态内存管理
第十二章 动态内存管理为什么会出现动态内存分配 这个问题要结合数组来进行讨论。在C99之前的标准中,C语言中数组的定义要求必须给定常量的大小才能定义数组,也就是说数组变量的内存空间在编译时就已成定局,无法更改。那我们如果想要申请一块内存空间,空间大小在运行时才进行确定该怎么做呢?这就要用到动态的内存分配了,这里的空间大小的确定是在运行时才进行确定的。动态内存分配函数malloc和free...原创 2019-02-25 18:47:02 · 189 阅读 · 0 评论 -
【C语言】项目-电话簿
C语言项目电话簿实现思路&amp;emps; 这个程序的整体思路和实现还是很简单的,我们利用了动态分配内存的方式首先创建了电话簿联系人类型,然后创建电话簿类,其实事联系人类型构成的全局数组,然后分别实现,界面函数,增删改查打印等功能,在主函数离实现总体思路,利用while循环让用户选择具体功能调用函数的方式进行总体实现。实现代码#include &lt;stdio.h&gt;#incl...原创 2019-02-17 00:00:02 · 521 阅读 · 0 评论 -
【C语言】项目-扫雷
C语言项目扫雷实现思想 扫雷的实现是使用两个数组,一个数组是用来显示的地图数组,而另一个数组是雷阵,每当玩家输入坐标后会根据雷阵判断该位置是否有雷,如果没有会计算出该位置周围地雷的数量并返回打印出来。不过值得一提的是,地图的初始化要多设计出一个边框,这个边框不需要打印,但是在计算周围地雷数量的时候却会格外方便。实现代码#define _CRT_SECURE_NO_WARNINGS#d...原创 2018-11-19 23:31:44 · 196 阅读 · 0 评论