自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Windows10下安装keras环境

前言毕设题目基于keras,所以安装个环境,然而踩了很多坑,整理一下,为大噶排下坑。1. 安装Anaconda这里推荐清华的镜像源:anaconda安装后一直next,记得勾选安装路径填入到系统环境变量中这个选项就可以。情况1:Anaconda快捷方式没有或者突然消失解决方法:进入cmd,cd进入anaconda安装目录,输入python .\Lib_nsis.py mkmenus测试安装结果:打开anaconda命令端,输入python,显示其版本号则成功。2. 安装Tensorfl

2020-12-04 01:05:55 351

原创 [读书笔记] APUE | 第十四章 | 高级IO

1. 非阻塞IO对于一个给定的文件描述符,有两种方法对其指定非阻塞IO:如果调用open获得描述符,则可指定O_NONBLOCK标志如果对于一个已经打开的描述符,则可调用fcntl,由这个函数打开O_NONBLOCK文件状态标志。2. 记录锁记录锁的功能是:当一个进程读或者修改某一文件某个部分时,可以阻止其他进程修改同一文件区。fcntl函数的第三个参数是一个指向flock结构体的...

2020-03-26 18:54:29 126 1

原创 [读书笔记] | APUE | 第十三章 | 守护进程

1. 守护进程的特征linux下,keventd守护进程为在内核中计划执行的函数提供上下文kapmd守护进程对很多计算机系统中具有的高级电源管理提供支持kswapd守护进程也称为页面调出守护进程linux内核使用两个守护进程bdflush和kupdated将高速缓存的数据冲洗到磁盘上,当可用内存达到下限时,bdflush将脏缓冲区从缓冲池中洗到磁盘上,每隔一定时间间隔,kupdated守...

2020-03-25 19:13:10 145 1

原创 [读书笔记] APUE | 第十一章 & 第十二章 | 线程

1. 读写锁读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量只有两种状态,加锁或者不加锁,而且只允许一个线程对其加锁;而读写锁有三种状态:读模式加锁,写模式加锁,不加锁。写模式下一次只有一个线程可以拥有读写锁,而在读模式下,多个线程可以同时占有读写锁。注意:在写模式下,在锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。在读模式下,所有试图对其加锁的线程都会得到访问权,在都模式...

2020-03-24 17:24:09 110 1

原创 [读书笔记] APUE | 第十章 | 信号

之前的linux学习里,介绍了信号相关内容,这里记录一些重点内容1. 不可靠信号不可靠信号值的是,信号有可能会丢失。但在早期的uinx系统中存在这样一种情况:...

2020-03-23 19:08:50 118

原创 [读书笔记] APUE | 第八章 | 进程控制

在前面学习Linux过程中已经总结了进程控制相关东西,这里将不再赘述重复的,只记录不太了解的、混淆的知识点。1. fork与vfork注意,在fork创建的子进程,是父进程的一份副本,他所虽然有这些数据的副本,如堆栈,数据空间,但是父子空间并不共享这些,是相互独立的,修改子进程的变量,并不影响父进程。两个函数的最大区别在于,vfork函数保证了子进程先运行,在子进程调用exit后,父进程才可...

2020-03-21 20:07:41 107

原创 项目笔记 | 基于自建http协议的共享目录服务器

前言百度网盘存储功能方便了我们存储资料不仅限于物理设备,但是对于普通用户难以忍受限速的操作。在学习了网络编程之后,决定自己写一个基于http协议的共享目录,方便客户端将文件目录上传到服务端,支持目录列表展示,文件上传,文件下载,断点续传。1. 框架流程跟着想法画的,难免有些粗糙:对流程总结一下:搭建tcp服务器,用epoll进行事件监控判断事件是监听事件时,放置线程池任务队列,调用...

2020-03-21 14:04:42 278

原创 [读书笔记] APUE | 第七章 | 进程环境

1. main函数main函数的原型是int main(int argc,char * argv[],char *envp[]);argc是命令参数个数,argv指向参数的各个指针所构成的数组,envp里存放的就是环境变量。当内核执行程序时,在调用main前先调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始地址,这是由连接器设置的,连接器由编译器调用。2. 进程终止在之前...

2020-03-20 18:46:38 72

原创 [读书笔记] APUE | 第六章 | 系统数据文件和信息

1.口令文件口令文件存储在/etc/passwd文件中root用户的ID为0两个获取口令文件项的函数struct passwd *getpwnam(const char *name);struct passwd *getpwuid(uid_t uid);getpwuid函数是将i节点中的用户ID映射为用户登录名。2. 阴影口令系统的加密口令一般存放在,阴影口令文件里,它至少...

2020-03-19 14:26:58 89

原创 [读书笔记] APUE | 第五章 | 标准IO库

1. 流和文件对象在标准IO库中,所有的操作都是针对文件流,流的定向决定了所读、写的字符是单字节还是多字节。流被创建时,并未被定向。下面这个函数可设置流的定向。 #include <wchar.h>int fwide(FILE *stream, int mode);mode参数决定了设置的定向:mode为正,字节定向。mode为负,宽定向。mode为0,不设置定向、但...

2020-03-18 14:15:45 79

原创 [读书笔记] APUE | 第四章 | 文件和目录

1.查看文件信息函数 #include <sys/stat.h> int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *bustat函数是通过文件名获取文件信息,fstat通...

2020-03-17 18:37:41 95

原创 [读书笔记] APUE | 第三章 | 文件I/O

1. 文件描述符对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,当打开一个现有文件或者创建一个新文件时,进程会向内核返回一个文件描述符。在POSIX应用程序中,0代表标准输入,1代表标准输出,2代表标准出错输出。分别代表常量,STDIN_FILENOSTDOUT_FILENO、STDERR_FILENO。...

2020-03-15 15:53:56 121

原创 [散列 | C++实现]

1.常见的哈希函数1.1 直接定址法取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B1.2 除留余数法设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函 数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址2. 闭散列闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表...

2020-03-10 19:25:46 190

原创 选择 | 插入排序 | C++实现

1. 选择排序初始最小值为数组第一位,向后寻找比它小的,有的话更换下标,退出本次循环后,让最小值与第第一位交换,随后直至最后一位。

2020-03-09 19:51:45 99

原创 红黑树 | C++实现

1.红黑树的定义与性质红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩 倍,因而是接近平衡的。性质:每个结点不是红色就是黑色。根节点是黑色的。如果一个节点是红色的,则它的两个孩子结点是黑色的。对于每个结点,从该结点到其所有后代叶结点的简单...

2020-03-09 17:13:46 117

原创 堆 | C++

1. 堆的定义堆是一种基于完全二叉树的数据结构。每个父节点都大于等于(或者小于等于)它的两个子节点的完全二叉树就是堆。大堆:大于等于的情况称为大根堆。小堆:小于等于的情况称为小根堆。2. 堆的建立因为堆是完全二叉树,所以可以用数组来存储。比如父节点的下标为i,那么它的左孩子为(i + 1)/ 2 + 1,右孩子为(i + 1)/ 2 + 2;如果某叶子节点的下标为i,则它的父亲节点为...

2020-03-08 20:06:09 234

原创 AVL树 | C++实现

1. AVL树的定义一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)2. 节点定义struct AVLNode{ AVLNode(const T& data) :_data(data) ,_left(nullptr) ,_right(nullptr) ,_par...

2020-03-08 18:01:57 145

原创 搜索二叉树 | C++实现

1. 搜索二叉树的定义二叉搜索树又称二叉排序树,它可以是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 。它的左右子树也分别为二叉搜索。2.插入情况1 : 树为空直接插入情况2:树不为空从根节点开始判断,如果大于当前节点,则向右出发,否则向左。3.删除情况1...

2020-03-08 15:14:57 101

原创 归并 | 快排 C++实现

1.归并排序1.1 算法原理将一组数据一分为二。对两组数据不断递归排序,直至每组数据为最下规模。将排序好的两组数据进行合并。1.2 实现代码#include <iostream>#include <vector>void Merge(std::vector<int>&a,int left, int right, int mid){...

2020-03-06 18:24:57 126

原创 [多路转接模型:]epoll

1.epoll相关函数接口1.创建一个epoll句柄int epoll_create(int size); 注意:用完之后,必须调用close()关闭2.注册epoll事件int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 它不同于select()是在监听事件时告诉内核要监听什么类型的事件, 而是...

2020-03-06 11:08:26 100

原创 [多路转接模型:] select

1. 同步通信与异步通信同步:所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了; 换句话说,就是由调用者主动等待这个调用的结果。异步:异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果; 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理...

2020-03-04 20:24:06 109 1

原创 [TCP/IP:]数据链路层

1.以太网帧格式源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;。帧协议类型字段有三种值,分别对应IP、ARP、RARP。帧末尾是CRC校验码(CRC用来校验数据发送是否正确)。2.MAC地址MAC地址用来识别数据链路层中相连的节点;长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:...

2020-03-03 21:49:18 180

原创 [TCP/IP:]网络层(IP协议)

1.协议格式4位版本号:指定IP协议的版本, 对于IPv4来说, 就是4。4位首部长度: IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示大 的数字是15, 因此IP头部大长度是60字节。8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位 TOS分别表示: 小延时,...

2020-03-01 17:46:15 83

原创 [TCP/IP:]传输层(UDP协议)

1.UDP协议格式16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的大长度。如果校验和出错, 就会直接丢弃。2.UDP协议的特点面向数据报,无连接,不可靠的通信协议。无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接。不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息。面向数据报...

2020-02-28 18:23:27 123

原创 [TCP/IP:]传输层(TCP协议)

1.传输层相关概念1.1 传输层作用传输层负责端与端间的数据传输,即负责数据能够从发送端传输接收端。通过端口号,确定目的端。1.2 端口号是什么端口号(Port)标识了一个主机上进行通信的不同的应用程序;在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(linux下可以通过netstat -n查看);1....

2020-02-25 12:31:48 370

原创 [TCP/IP]:应用层(HTTP协议)

1.HTTP是什么HTTP即HypertText TranSport Protocol(超文本传输协议),建立在TCP和IP协议之上。1.1 HTTP/0.9 - 单线协议TTP的初始版本没有版本号; 它后来被称为0.9来区分它和更高版本。HTTP / 0.9非常简单:请求由一行代码组成,并从唯一可能的方法开始,GET然后是资源路径(不是URL,因为连接到服务器后不需要协议,服务器和端口)。...

2020-02-23 18:53:07 216

原创 [Linux:]socket接口介绍

1. socket常见的API1.1socket的创建int socket(int domain, int type, int protocol);dmain --- 指定底层协议(AF_INET)type --- 套接字类型(STREAM/DGRAM)protocol --- 指定具体协议(Tcp -6,Tcp -17,0 -默认协议)返回值 --- 文件描述符--- 套接字操作句...

2020-02-22 19:31:44 401

原创 [Linux:]读写锁与自旋锁

1.读写锁在多线程中,修改公共数据的机会比较少,相比改写,读取数据的机会更大,如果单纯的加锁会大大降低程序效率,所以我们需要读写锁,读写锁的特点是“写独占,读共享,读锁优先级高。1.1 Linux下读写锁的接口1.1.1 设置读写优先int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref); /* p...

2020-02-21 18:15:42 216

原创 [Linux:]生产者与消费者模型

1.为什么需要生产者与消费者模型?生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯, 而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生 产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个 阻塞队列就是用来给生产者和消费者解耦的。1.2 生产者与...

2020-02-20 18:36:21 122

原创 [Linux:]线程同步与互斥

1. 与互斥相关的术语临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成(即PV操作)。2. mutex互斥量...

2020-02-18 14:47:49 82

原创 [Linux:] 线程初识

1.Linux下线程的概念1.1 什么是线程一个程序里的一个执行路线叫做线程线程是一个更轻量级的进程线程在进程内部运行,本质在进程地址空间内运行1.2 线程与进程的区别进程是资源分配的基本单位线程是调度的基本单位线程共享进程数据,也有自己的一部分数据: 线程ID、寄存器、栈、errno、信号屏蔽字、调度优先级。2. Linux线程控制2.1 创建线程 in...

2020-02-17 17:14:21 126

原创 [Linux:]信号

1.如何理解信号例如在生活中,快递员告诉我们快递到了,那么我们会终止手上的事,去取快递,这就是一种信号。站在操作系统的角度,再来理解信号:1.用户输入命令,在Shell下启动一个前台进程。2. 用户按下 Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程3. 前台进程因为收到信号,进而退出。所以,显而易见,信号是操作系统与用户通信的一种方式,也可以...

2020-02-16 15:35:57 75

原创 [Linux]:进程间通信

1. 什么需要进程间通信?数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止 时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另 一个进程的所有陷入和异常,并能够及时知道它的状态改变。2.进程通信的...

2020-02-15 18:51:30 99

原创 [STL:]关联式容器(二)

1.unordered_mapunordered_map不同于map的地方如它的前缀名一样,它是无序的,这是由于它的底层是由哈希表实现的。1.1 unordered_map的使用#include<iostream>#include<unordered_map>int main(){ std::unordered_map<int,int> um...

2020-02-14 14:57:22 59

原创 [STL:]关联式容器(一)

1.什么是关联式容器类似于vector,list,deque,等我们称之为序列式容器,它的底层是线性结构,存放的是数值本身,而关联式容器存放的是key-value键值对。键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值, value表示与key对应的信息。2.mapmap是最常用的关联式容器之一,它会按照key来比较顺序存储元...

2020-02-13 18:17:26 210

原创 [C++:]类型转换

1.static_caststatic_cast用于非多态类型转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关类型的转换。例如如下demo:#include<iostream>int main(){ double i = 3.14; int a = static_cast<int>(i); ...

2020-02-13 16:39:58 75

原创 [C++]:智能指针

1.为什么需要智能指针?当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资...

2020-02-12 19:21:57 87

原创 [C++]: 多态

1.多态的条件虚函数通过指针或者引用访问a

2020-02-07 16:54:02 60

原创 [C++] :继承

1.继承权限问题先来看这样一个demo#include<iostream>class Person {public: Person() :_a(1), _b(2), _c(3) { std::cout << _c << std::endl; } int _a;protected: int _b;private: int _c;...

2019-11-26 22:05:17 69

原创 [Linux]:进程控制

1.创建进程linux下创建进程有两种方式即调用fork函数或者vfork函数//头文件#include<unistd.h>1.1 fork() pid_t fork(void); //返回值为0 --- 子进程 //返回值为-1 --- 创建失败 //返回值为pid --- 父进程1.2 vfork() pid_t vfork(void);注意:vfork...

2019-10-31 00:01:55 78

空空如也

空空如也

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

TA关注的人

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