自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LRU缓存 数据结构设计(C++)

做LeetCode第146题LRU缓存,觉得收获不小,特此记录。请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存。int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如

2022-02-27 22:34:37 1041

原创 【Linux网络编程学习】阻塞、非阻塞、同步、异步以及五种I/O模型

此为牛客Linux C++课程笔记。1. 阻塞 blocking调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。2. 非阻塞 non-blocking非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。非阻塞I/O执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1,此时可以根据 errno 区分这两种情况,对于accept,recv 和 send,事件未发生时,errno 通

2021-11-20 17:59:51 1146

原创 【Linux网络编程学习】I/O多路复用——epoll

此为牛客Linux C++课程和黑马Linux系统编程笔记。1. 关于epollepoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。目前epoll是linux大规模并发

2021-11-20 00:23:38 476

原创 【Linux网络编程学习】I/O多路复用——select和poll

此为牛客Linux C++课程和黑马Linux系统编程笔记。0. I/O多路复用所谓I/O就是对socket提供的内存缓冲区的写入和读出。多路复用就是指程序能同时监听多个文件描述符。之前的学习中写了多进程和多线程版的简单服务器模型,但是有个问题:每次新来一个客户端TCP连接请求,就需要新建一个进程或线程来与之进行信息传输,但是如果连接的客户端太多,就会出现所谓C10K问题:当创建的进程或线程多了,数据拷贝频繁(缓存I/O、内核将数据拷贝到用户进程空间、阻塞,进程/线程上下文切换消耗大,导致操作系

2021-11-17 21:27:09 536

原创 【Linux网络编程学习】使用socket实现简单服务器——多进程&多线程版本

此为牛客Linux C++课程和黑马Linux系统编程笔记。1. 思路大体思路与上一篇的单进程版服务器–客户端类似,都是遵循下图:多进程版本有以下几点需要注意:由于TCP是点对点连接,服务器主进程连接了一个客户端以后就无法再与其他客户端相连,所以多进程版的服务器中的父进程只负责监听,连接并信息传输的工作交给子进程完成。每当accept到一个客户端的连接请求,就fork出一个子进程来处理。父进程负责监听的同时,也要回收子进程的资源,避免产生僵尸进程。2. 服务端/*实现一个简单的多进程服务

2021-11-14 20:21:46 2629

原创 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用

此为牛客Linux C++课程和黑马Linux系统编程笔记。0. 什么是socket所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。socket 可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进

2021-11-10 17:29:45 2986 1

原创 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)

此为牛客Linux C++课程和黑马Linux系统编程笔记。1. 网络字节序我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分。磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。TCP/IP

2021-11-09 23:25:46 2441 2

原创 【Linux系统编程学习】Linux线程控制原语

此为牛客Linux C++课程笔记。0. 关于线程1. 线程与进程的区别2. 线程相关操作函数2.1 创建线程: pthread_create#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);功能:创建一个子线程参数:thread:传出参数,线程创建成功后,子

2021-11-06 21:42:22 128

原创 【Linux系统编程学习】父进程捕获SIGCHLD信号以处理僵尸进程

配合之前说过的sigaction函数和waitpid函数,我们可以解决子进程变成僵尸进程的问题。先看如下示例程序:#include <sys/time.h>#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>int main() { pid_t pid; int.

2021-11-01 11:25:48 634

原创 【Linux系统编程学习】信号、信号集以其相关函数

此为牛客Linux C++和黑马Linux系统编程课程笔记。0. 信号的概念A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延迟时间非常短,不易察觉。每个进程收到的所有信号,都是由内核负责发送的,内核处理。1. Linux信号一览表

2021-11-01 11:24:55 224

原创 【Linux系统编程学习】匿名管道pipe与有名管道fifo

此为牛客Linux C++和黑马Linux系统编程课程笔记。0. 关于进程通信Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件

2021-10-26 17:05:29 276

原创 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)

此为牛客Linux C++和黑马Linux系统编程课程笔记。1. fork函数1.1 fork创建单个子进程#include<unistd.h>pid_t fork(void);作用:创建一个子进程。pid_t类型表示进程ID,但为了表示-1,它是有符号整型。(0不是有效进程ID,init最小,为1)返回值:失败返回-1;成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0注意返回值,不是fork函数能返回两个值,而是fork后,fork函数变为两个,父子需【各自】

2021-10-25 20:18:14 542

原创 【Linux系统编程学习】Linux系统IO函数(open、read、write、lseek)

此为牛客网Linux C++课程1.20课程笔记。1.open函数open函数有两种,分别是打开一个已经存在的文件和创建并打开一个不存在的文件。#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>// 打开一个已经存在的文件int open(const char *pathname, int flags);// 创建并打开一个不存在的文件int open(const char *pa

2021-10-18 22:02:27 350

原创 【Linux系统编程学习】 文件描述符

此为牛客网Linux C++课程1.19课程笔记。1. 文件描述符表如图,我们知道每个进程都有其虚拟地址空间(0~4G),其中3 ~ 4G部分为内核区。进程的进程控制块保存就在内核区,而PCB中维护一个打开文件描述符表,每个进程都有这样一张表,表在实现上是一个指针数组,数组中每个元素都是一个指向file类型的指针,也就指向一个打开的文件。而文件描述符就是该文件描述符表的的索引值,也就是序号,每当打开一个新文件,则占用一个文件描述符,而且是空闲的最小的一个文件描述符。文件描述符表的前三项是固定的,分

2021-10-17 11:07:57 191

原创 【Linux系统编程学习】C库IO函数与系统IO函数的关系

此为黑马Linux课程笔记。1. C标准IO函数工作流程如图,以C库函数的fopen为例,其返回类型是FILE类型的指针,FILE类型包含很多内容,主要包含三个内容:文件描述符、文件读写指针的位置和I/O缓冲区的地址。文件描述符:文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。文件描述符在Linux系统IO函数中很常用。文件读写指针位置:用于控制文件的读

2021-10-17 10:29:04 169

原创 【Linux系统编程学习】 GDB调试器的简单使用

本系列为牛客网Linux C++课程的课程笔记。0. GDB简介1. 准备工作想要使用gdb调试,首先需要用gcc的-g参数生成可执行文件,这样才能在可执行文件中加入源代码信息以便调试,但是注意这并不是将源文件嵌入到可执行文件中,所以调试时必须保证gdb能找到源文件。2. 启动、退出、查看代码还有一种方便的显示方法:gdb 文件名 -tui或者进入gdb后Ctrl+X+A进入TUI模式,进入TUI模式后,命令行上方将出现源代码,下方输入gdb命令。比使用list命令方便很多。3. 各

2021-10-16 11:36:31 176

原创 【Linux系统编程学习】 Makefile简单入门

本系列为牛客网Linux C++课程的课程笔记。0. Makefile介绍1. Makefile文件命名与规则示例:使用vim编写如下名为Makefile的文件:app:sub.o add.o mult.o div.o main.o gcc sub.o add.o mult.o div.o main.o -o appsub.o:sub.c gcc -c sub.c -o sub.oadd.o:add.c gcc -c add.c -o add.omult.o:mult.c

2021-10-11 23:02:06 217

原创 【Linux系统编程学习】 静态库与动态库的对比与总结

本系列为牛客网Linux C++课程的课程笔记。1. 前几节课知识总结程序编译成为可执行文件的过程:静态库制作过程:动态库制作过程:2. 静态库的优缺点:3. 动态库的优缺点:更多可参考:吴秦:C++静态库与动态库...

2021-10-10 16:35:19 86

原创 【Linux系统编程学习】 动态库的制作与使用

本系列为牛客网Linux C++课程的课程笔记。1. 动态库命名规则2. 动态库的制作第一步,用gcc编译生成.o目标文件,注意要用-fpic参数生成与位置无关的代码;第二步,用gcc的-shared参数生成动态库。涉及到的两个参数之前学过:代码演示:一个简易版计算器程序目录如下:然后执行:gcc -c -fpic add.c div.c mult.c sub.c用gcc编译成与位置无关的.o目标文件然后执行:gcc -shared add.o div.o mult.o s

2021-10-09 12:37:35 248

原创 【Linux系统编程学习】 静态库的制作与使用

本系列为牛客网Linux C++课程的课程笔记。0. 关于静态库与动态库1. 静态库命名规则2. 静态库的制作演示如下:一个简易版计算器程序目录如下:然后执行:gcc -c add.c div.c mult.c sub.c用gcc编译成目标文件然后执行:ar rcs libcalc.a add.o div.o mult.o sub.o生成了名为libcalc.a的静态库文件。3.静态库的使用首先将刚才涉及到的文件整理一下:此时编译main.c文件,执行:gcc m

2021-10-08 14:02:20 208

原创 【Linux系统编程学习】 GCC编译器

本系列为牛客网Linux C++课程的课程笔记。0. 简介1. gcc和g++的安装sudo apt install gcc g++2. gcc常用参数选项3. gcc工作流程首先是预处理器对源代码进行预处理(后缀名.i),主要做以下事情:把头文件加入到源代码当中删除源代码中的注释宏替换(如define)然后通过编译器编译成汇编代码(后缀名.s);再通过汇编器汇编成目标代码(后缀名.o);最后还要与启动代码、库代码、其他目标代码进行链接,最后生成可执行文件(window

2021-10-07 22:55:42 189

原创 【运筹与优化】单纯形法解线性规划问题(matlab实现)

单纯形法 Simplex_eye.m:%function [x_opt, fx_opt, iter] = Simplex_eye(A,b,c)A = [2 -3 2 1 0; 1/3 1 5 0 1];b = [12 20];c = [1 2 1 0 0]; %初始单纯型表Table = zeros(size(A,1)+1, size(A,2)+1);Table(1:size(A...

2019-12-20 23:19:23 14997 4

原创 【操作系统】信号量解决经典同步问题

文章目录1. 基本结构2. P,V操作3. 信号量的应用3.1 信号量实现进程互斥3.2 信号量实现前驱关系4. 用信号量解经典同步问题4.1 生产者消费者问题4.2 读者写者问题4.3 狒狒过桥问题4.4 理发师理发问题4.5 哲学家进餐问题信号量机制是Dijkstra提出的一种卓有成效的进程同步工具。信号量有整形信号量、记录型信号量、AND型信号量等,这里主要介绍我们常见的记录型信号量。1...

2019-11-10 22:46:53 7372

原创 【离散数学】图论基础知识

文章目录1.数据结构部分2.离散数学部分2.1 图的基本概念2.2 图的连通性2.3 图的矩阵表示2.4 几种特殊的图2.4.1 二部图2.4.2 欧拉图2.4.3 哈密顿图2.4.4 平面图2.5 无向树2.6 生成树1.数据结构部分2.离散数学部分2.1 图的基本概念无向图:简而言之,边不带方向的图就是无向图。有向图:简而言之,边带方向的图就是有向图。特殊定义:有限图:...

2019-06-27 13:41:35 50233 7

原创 【数据结构】对快速排序原理的理解(图解,通俗易懂)

学习数据结构时,书本上直接给出了快速排序的过程以及代码,没有详细介绍其原理,琢磨代码后,发现其原理其实十分简单,简述如下:1.在待排序列中找一个中枢元素(书本上默认为第一个元素)。2...

2019-05-16 00:30:34 7729 5

原创 【数据结构】快速排序非递归算法及其改进

在学数据结构中排序章节的时候,有一道有关快速排序的作业题描述如下:按下述要求编写快速排序的非递归算法:定义一个栈(或队列),把整个序列的上、下界入栈(或队列)。当栈(或队列)非空时进行如下操作:(1)取栈顶(或队头)元素作为序列的上、下界,在区间的头部、中间、尾部取关键字居中的元素作为中枢元素,进行一趟快速排序;(2)在一趟排序过程中,如果子表已有序(没有发生元素交换),则该子序列排序结...

2019-05-14 18:41:10 926

空空如也

空空如也

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

TA关注的人

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