自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 后台开发核心技术(14):进程间通信

通信方式前言管道消息队列共享内存信号量ipcs命令前言进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?首先,进程间通信至少可以通过传送、打开文件来实现,不同的进程通过一个或者多个文件来传递信息,事实上,在很多应用系统都是用了这种方法。UNIX系统中实现进程间通信的方法有很多,而且不幸的是,极少的方法能在所有的UNIX系统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式)。而Linux作为一种新兴的操作系统,几乎支持所有的UNIX下常用的进程间通

2020-07-11 15:06:33 232

原创 muduo库总结(二)理论分析

目录好的网络服务器设计Reactor模型epollselect和poll的缺点epoll原理以及优势LT模式、ET模式好的网络服务器设计在这个多核时代,服务端网络编程如何选择线程模型呢? 赞同libev作者的观点:one loop per thread is usually a good model 这样多线程服务端编程的问题就转换为如何设计一个高效且易于使用的event loop,然后每个线程run一个event loop就行了(当然线程间的同步、互斥少不了,还有其它的耗时事件需要起另外的线程做)。

2020-07-11 13:05:08 308

原创 muduo库总结(一)源码粗读

前言我相信用linux进行后端开发的C++程序员应该对muduo库都比较熟悉,muduo库利用了epoll+线程池对网络IO模块进行了封装,实现了高并发、高性能的网络库,通过简单的几个类能快速的建立起网络模块,非常的方便。今天对muduo库进行一个简单的源码分析。简介muduo 是一个基于 Reactor 模式的现代 C++ 网络库,它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。源码我们从muduo库的一个使用案例中出发,一步一步

2020-07-11 12:17:42 396

原创 HTTP和HTTPS泛谈

目录前言HTTP和HTTPS什么是无状态协议,HTTP 是无状态协议吗,怎么解决Cookie简述 HTTP1.0/1.1/2.0 的区别地址栏输入 URL 发生了什么HTTPS 的工作原理前言由于对客户端的开发非常感兴趣,所以不仅准备找后端的工作岗位也准备找客户端的岗位,客户端这边看很多面经上对 http 和https非常重视,今天特意总结一下。之所以叫泛谈,因为是写一个大概的http和https的请求过程,大概的区别,并不详细介绍。我在博客上看到一个大佬的总结非常之详细,思路非常之清晰,后面借助这位大

2020-07-11 00:08:44 177

原创 后台开发核心技术(13):select、poll、epoll

前面文章中说了一些关于IO多路复用的知识,今天专门总结一下select、poll、epoll的用法和区别;IO复用有时也称为事件驱动,基本原理就是:有一个函数会不断轮询所负责的socket,当某个socket有数据到达了,就通知用户进程。所以称之为事件驱动!这里的函数就是用select、poll、epoll来实现轮询的功能。selectselect在socket编程中还是相当重要的,可是很多初学者并不爱用select写程序,习惯直接用connect、accept、recv或recvfrom这样的阻塞

2020-07-04 20:46:01 150

原创 后台开发工具——CMake使用总结

CMake简介使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。CMake安装ubuntu上直接执行 sudo apt install cmake 安装完成,可以通过cmake -version查看其版本:CMake使用介绍cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项,一个基本的CMakeLists.txt的配置文件内容如下:cm

2020-07-04 16:01:01 277

原创 后台开发核心技术(12):进程

有关线程与进程的知识与操作系统是密不可分的,特别是其实现,类似线程的调度策略,其实是操作系统去实现这部分内容,为了模块化的复习,就单独抛开(有些部分还是需要涉及)操作系统去介绍关于线程、进程的内容,后面再专门去总结一下操作系统的知识。程序与进程linux的进程结构一般由三部分构成:代码段、数据段、堆栈段。堆栈段还包括了进程控制块(PCB),PCB位于进程核心堆栈的底部,不需要额外分配空间。程序转化为进程的步骤:1、内核将程序读入内存,为程序分配内存空间;2、内核为该进程分配PID和其他所需资源;

2020-07-02 22:50:09 155

原创 后台开发核心技术(11):多线程

背景介绍进程:以前,进程是最小的执行单位。进程是包含程序指令和相关资源的集合,每个进程和其他进程一起参与调度,竞争CPU、内存等资源。每次进程的切换,都存在着进程资源的保存和恢复动作,这称为上下文切换。发现问题:比如一个简单的GUI程序,为了有更好的交互性,通常一个任务执行界面交互,一个任务进行后台计算。每个任务都由一个进程来实现,那么相当的低效!因为每个进程的系统资源都是独占的,比如内存空间。每一次切换,这些独立资源都需要切换,所以,演化出了——利用分配给同一个进程的资源,尽量实现多个任务的方法,这就

2020-07-01 13:18:56 157

原创 后台开发核心技术(10):网络IO模型

前言IO有很多种,磁盘IO、外设IO、网络IO等,都有着同步和异步两种操作,今天主要说一下网络IO模型。看到有关网络IO、同步异步的很多博客,各有不同的理解,今天我说一下自己的理解,如有不对,请大佬们多多指点!首先看一下网络IO种的四个概念:阻塞、非阻塞、同步、异步。我认为阻塞与同步的概念不是一个概念,不意味着非阻塞就是同步,阻塞就是异步。整个网络IO发生过程中会经历两个阶段,数据准备和数据拷贝,弄清楚其中的过程,理解TCP是如何将数据送来的就可能有很大帮助。数据准备:TCP将数据(拿TCP作为例

2020-06-30 11:30:00 131

原创 后台开发核心技术(09):运输层总结

与上篇文章一样,还是重点关注因特网的运输层协议,即TCP、UDP运输层协议。运输层协议运输层协议是在端系统中实现而不是在路由器中实现,是直接服务于应用层,为应用层提供可靠传输的、面向连接的TCP或者不可靠传输的UDP。在介绍运输层协议之前,先简单说一下IP协议(网络层协议),为主机之间提供了一种逻辑通信,IP服务模型是尽力而为交付服务,其实就是不可靠服务。一、运输层服务的基本职责UDP和TCP最基本的职责之一是:将两个端系统间的IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务,就是为网络

2020-06-29 16:45:09 102

原创 后台开发核心技术(08):套接字编程

通过上篇文章已经看到很多应用层的应用程序,典型的网络应用是由一对程序(客户程序和服务器程序)组成的,它们位于两个不同的端系统中,当运行这两个程序时,创建了一个客户进程和服务器进程,同时它们通过从套接字读出和写入数据在彼此之间进行通信,开发者创建一个网络应用时,其主要任务就是编写客户程序和服务器程序的代码。我们将使用下列简单的客户-服务器应用程序来演示对于UDP和TCP的套接字编程:1)客户从键盘读取一行字符,并将该字符向服务器发送。2)服务器接收该数据并将这些数据转化为大写。3)服务器将修改过的数据

2020-06-28 15:38:21 426

原创 后台开发核心技术(07):计算机网络之应用层总结

说计算机网络,首先要说的肯定是网络协议,要通过网络传达数据信息,首先要做的是选择合适的网络协议,典型的网络应用程序有:Web、电子邮件、DNS、对等文件分发、视频流等。前言进程通信: 进程通信分为在同一台主机上的进程间通信和不同主机(端系统)的进程间通信,同一台主机上的进程通信规则由端系统上的操作系统确定,而本次主要总结的是不同端系统上的进程间通信——在不同的端系统上的进程进行通信,通过跨越计算机网络交换报文而相互通信。套接字:又叫应用程序编程接口(API)。进程通过一个称为套接字的软件接口向网络发送

2020-06-28 13:36:06 483

原创 后台开发核心技术(06):调试工具

strace1、前言:为了为创建文件、进程、复制文件等这些操作提供系统服务,应用程序必须和操作系统之间进行交互。但是,应用程序是不能直接访问Linux内核的。它既不能访问内核所占内存空间,也不能调用内核函数。不过应用程序可以跳转到system_call的内核位置,内核会检查系统调用号,这个号码会告诉内核进程正在请求哪种服务。然后,它查看系统调用表,找到所调用的内核函数的入口地址,调用该函数,然后返回到进程。所有操作系统在其内核都有一些内建的函数,这些函数可以用来完成一些系统级别的功能,一般称Linux系

2020-06-24 23:27:41 115

原创 后台开发核心技术(05):Linux程序内存空间布局

一个典型的Linux的运行中的C程序的内存空间布局:一个典型的Linux下的C程序内存空间由如下这几部分构成:(1)代码段:代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行之前都已经确定好了,并且内存区域通常属于只读。(2)初始化数据段:通常用来存放程序中已经初始化的全局变量的一块内存区域,例如,位于所有函数之外的全局变量:int val = 100; 数据段属于静态内存分配。(3)未初始化数据段:通常是指用来存放程序中未初始化的全局变量的一块内存区域。(4)堆:堆是用

2020-06-24 22:33:51 127

原创 Ubuntu下最新mysql8.0.20版本修改用户名和密码的问题

问题背景来源于:对刚下载的最新版 mysql 8.0.20 进行初始化用户的用户名和密码;刚下载的mysql没有用户名和密码,可以通过查看mysql下的 debian.cnf 文件找到自动生成的临时用户名和密码,效果如图:可以看到在 /etc/mysql下有这个文件,用vim打开即可(如果不是root用户就用sudo,因为这个文件需要root权限打开):可以看到有用户名和密码,拿着这个用户名和密码去登录:命令为:mysql -u debian-sys-maint -p 然后回车后输入密码(这里偷懒

2020-06-16 22:04:23 2326 4

原创 错误经验

今天遇到一个错误半天没找到哪里有问题,误区是:库文件比较多,特别是用到了一些不是很熟悉的头文件,例如muduo库中的<muduo/base/Logging.h>,根据报错信息:一度怀疑自己是不是下载的开源库有缺失,以为是头文件muduo库里的问题,然而!太天真,就是自己写的头文件类后面落了一个 ; 导致muduo库的日志类对象识别不了!总结: 不要怀疑开源库的错误,肯定是别的地方的错误引起的开源库中的错误,错误类型可根据提示去自己的库中找类似的点。...

2020-06-15 19:38:48 201

原创 后台开发核心技术04编译

编译过程编译与链接的过程可以分解为4个步骤,分别是预处理、编译、汇编、链接,具体如下图所示:1、预处理g++ -E hello.cpp -o hello.i // 预处理指令预处理主要是处理那些源代码文件只能够以 # 开始的预编译指令。比如 #include、#define等;2、编译g++ -S hello.i -o hello.s // 编译指令编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,这部分往往是最核心和最复杂的部分;

2020-06-14 14:55:25 186

原创 应用muduo库编写服务端程序的简单示例

1 、 工作环境:Linux系统中;2、 使用muduo库进行编写程序需要链接到库文件libmuduo_base.so、libmuduo_net.so、libpthread.so,一般在系统路径 /usr/lib 或者 /usr/local/lib 下,所以不需要添加头文件的搜索路径,因为这两个路径是处在环境变量中,是自动搜索的。代码:注释里面写的很清楚,工作环境是用vscode连接到远程的linux进行开发的,上面也说了一下,直接包含头文件就可以了,不用添加搜索路径,然后对上面的源文件进行

2020-06-13 23:25:02 378

原创 O(n*logn)排序算法的总结

对经典排序方法性能进行总结:排序方法时间复杂度空间复杂度稳定性冒泡排序O( n^2 )O(1)稳定插入排序O( n^2 )O(1)稳定选择排序O( n^2 )O(1)不稳定归并排序O( n*logn )O(n)稳定堆排序O( n*logn )O(1)不稳定快速排序O( n*logn )O(logn)不稳定桶系列排序O( n )O(n)稳定今天重点讨论这三个时间复杂度为O(n*logn)的算法,桶排序

2020-05-23 21:10:02 620

原创 关于二分查找的一些总结

最近二十天基本上在复习算法和数据结构,对其中一些力扣做了一些总结,今天将二分查找法的应用总结一下:基本上分为三种类型:1、 在排序数组中,找某个值,属于常规的二分查找法的应用// 这里写一下 二分查找法在一有序数组中找某个值,并返回其下标;int find_the_index(int arr[],int start,int end,int target) //在arr数组中,从下标start到end中找值为target的数{ if(start>end)return -1; //代表返

2020-05-22 20:50:40 196

原创 二叉树的遍历总结

对于二叉树,可能大家最熟悉不过了,而二叉树的遍历也是校招中重点考察的知识点,今天总结一下,以便以后看一遍就能想起来:// 二叉树结点:class TreeNode{ public: int val; TreeNode*right; TreeNode*left; TreeNode(int x):val(x),right(nullptr),left(nullptr){} ~TreeNode(void){}};// 二叉树的建立// 建立二叉

2020-05-21 21:29:33 490

原创 windows下安装vscode远程连接到ubuntu进行后台开发的一些总结

这篇文章不是按部就班的教程,是对于windows下安装vscode远程连接到ubuntu进行后台开发的一些总结。ubuntu乌班图是我使用的第一个linux系统,用时还懵懵懂懂,现在已是深有感情,相比于centos等其他linux系统,我个人最喜欢的还是乌班图,这里说一下vscode远程连接乌班图,对乌班图的一些要求:1)乌班图版本要在16以上最好,16以下我没尝试过,不过16.0的都已经需...

2020-05-02 20:25:14 5468

原创 关于新版的VSCode通过ssh登录linux的问题

昨晚弄到4点多也没弄好用VSCode登录自己的linux服务器,太急于去找博客、论坛之类的,没有静下心来思考一下自己的错误,每个人因人而异,系统的配置,环境的配置等等情况复杂,不能只依赖于博客…惭愧白天没舍得浪费状态好的时间,晚上经过博友提醒静下心来自己查了下自己的VSCode报错,仔细看了下VSCode的说明,独立解决了通过ssh协议,登录linux服务器的问题;以下是个人遇到的问题:1) ...

2020-04-29 23:35:36 1811 2

原创 后台开发核心技术03常用的STL之string

为更熟悉string的构造,动手写一写string的简单实现;#include<string.h>class String{public: String(const char*str=NULL); String(const String &other); ~String(); String & operator =(const St...

2020-04-28 13:18:29 85

原创 快排和二分查找

经常作为复杂算法中的某一步骤,非常重要的两个算法,虽然简单,但并不一定能在很短的时间内完整正确的写出来,自己专门写在博客上,以备经常复习。快排//快速排序法void quick_sort(int arr[],int L ,int R){ if(L>=R)return ; //数量小于等于一个直接返回; int i=L,j=R; pivot=arr[i]; //...

2020-04-28 00:16:33 4219

原创 后台开发核心技术02面向对象C++

简介:本文章主要从面向对象编程的三大特点来叙述:封装、继承、多态;1) struct 和 class 在C++中唯一的区别就是默认的访问权限不同,struct默认访问权限是public的,而class是private的;2) 一个类中如果定义了全是默认参数的构造函数,那么就不能再定义重载函数了。(二义性)3)静态成员 静态成员是类的成员,而不是某个对象的成员,类的静态成员拥有一块单独的存储...

2020-04-27 19:12:16 88

原创 后台开发核心技术01C++编程常用技术

从今天开始总结、复习一下后台开发的一些核心技术,主要是作为一个复习的提纲;sizeof() 和 strlen()这里首先说一下数组是占用一片连续的存储空间,比如:int a[10] 这里的a[0]如果地址是2000的话,那么在32位机器上(int 占 4Byte),a[1]地址就是2004,a[2]地址就是2008…字符数组char str[10]=="book";str就是一个字符数组,并...

2020-04-27 15:21:17 152

原创 shell编程06

while循环基本语法:1#基本语法:while [ 条件判断式 ]do 程序done例子: 从命令行中输入一个n,统计从1+…+n的大小;#!/bin/bashSUM=0i=0while [ $i -le $1 ]do SUM=$[$SUM+$i] i=$[$i+1]doneecho sum=$SUMread读取控制台的输入上面...

2020-04-26 20:51:16 126

转载 C++/C完整编译过程

C语言程序从源代码到二进制程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。编写hello world C程序:编译过程只需这个过程如此熟悉,以至于大家觉得编译事件很简单的事。事实真的如此吗?我们来细看一下C语言的编译过程到底是怎样的。上述gcc命令其实依次执行了四步操作:1.预处理(Preprocessing),2.编译(Compilation...

2020-04-24 13:40:55 467

原创 shell编程05

学习真是个不想停下来的过程,这两天再看关于TCP套接字的一些函数,自己动手做了做,一直拖着shell编程的一些语法没写完,虽然写笔记很麻烦,但是确实对于自己复习和内容的加深有很大帮助,借此提醒自己,常写博客,常停下来回顾一下…条件语句基本判断语法:[ condition ] (一定注意 [ ] 前后都要有空格),同样是非空返回true ;常用的判断条件:1)两个整数的比较方法:= :字符...

2020-04-22 21:19:10 90

原创 TCP/IP协议01

套接字与端口号的对应问题背景:由一个自己在学习过程中思考的问题产生,套接字必须与端口号一一对应吗?为什么服务器80号端口可以同时为多个TCP请求提供连接并且服务呢?今天总结一下:UDP创建UDP套接字有两种方法:1)clientSocket==socket(AF_INET, SOCK_DGRAM)这种方式创建UDP套接字时,运输层自动给该套接字分配端口号,特别是会从1024~655...

2020-04-20 23:53:35 305

原创 shell编程04

运算符今天学习一下在shell中使用运算符----加减乘除…基本语法:1)$((运算式)) :注意这里两个(),一定要把最后的运算式完整的(),交给最外面的();2)$[运算式],直接用中括号,(个人习惯用这个);3)expr a + b注意有加号两侧有空格!expr a -b减法,expr a \* b乘法,expr a / b除法,expr a % b取余; 再次提醒这里要在运...

2020-04-16 23:51:47 73

原创 shell编程03

位置参数变量当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。比如: ./myshell.sh 100 200 ,这就是一个shell命令行,可以在这个命令行中获取100 200 这两个参数到myshell.sh 程序中;基本语法:$n: n为数字,$0代表命令行本身,$1-$9代表第一到第九个参数,直接在shell里用这些参数即可,不用向编程语言一...

2020-04-16 23:12:41 113

原创 shell编程02

shell的变量Linux shell中的变量分为系统变量和自定义变量。系统变量如: $HOME $PATH $SHELL等。输出看一下:拿HOME为例这里将 HOEM这个系统变量的值给home_,然后输出home_。显示当前shell中所有变量的命令:setshell变量定义的基本语法:1)变量=值 (多么的直接);2)撤销变量 unset 变量 ;...

2020-04-15 20:57:51 78

原创 shell编程01

不常用的一些知识经常会忘掉,今天复习到shell编程,打算用大概5、6…个博文吧详细写一下,方便以后看:shell是什么shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至编写一些程序;shell程序不需要进行编译,直接被shell(例如bash)执行;一般是.sh 文件(任意文件都行,可执行就行,....

2020-04-15 20:09:32 64

原创 g++与gcc的区别

刚开始接触gcc,g++编译器时一直不太清楚具体的作用与区别,只是知道都可以编译c++,今天复习的时候凑着专门总结了一下:(1)误区一:gcc只能编译C代码,g++只能编译c++;事实上,两者都可以,但是注意,以下几点。1、 后缀是.c的,gcc把它当作C程序,而g++当作是C++程序;后缀为.cpp的,两者都会认为是C++程序,注意,虽然C++是C的超集,但是两者对语法要求是有区别的,例如...

2020-04-13 20:55:26 561

转载 new与malloc的区别

1. 申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。...

2020-04-13 11:59:07 125

原创 C中常用字符串处理函数

puts(字符数组)其作用是将一个字符串(以 ’ \0 ’ 结束的字符序列)输出到终端。puts函数输出的字符串可以包含转义字符。例如:char str[]={"China\nBeijing"};puts(str);//输出为:ChinaBeijinggets(字符数组)其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数...

2020-04-11 19:51:47 125

原创 默认函数参数

默认函数参数在调用函数之前,必须将默认值信息通知编译系统;int add(int a,int b=5); //函数声明(声明中必须带默认参数)add(3); //调用函数int add(int a ,int b=5){return a+b;}在用字符数组存放字符串时,字符串的运算对象要用字符串函数,如strcat(连接),strcmp(比较),strcpy(复制...

2019-12-28 00:54:45 66

原创 树的子结构-- 练习递归和遍历

题目:输入两个树A和B,判断B是不是A的子结构。class TreeNode //树结点{public: int val; TreeNode* lptr; TreeNode* rptr; TreeNode(int x) { val = x; lptr = NULL; rptr = NULL; }};bool doesTreeAhasTreeB(...

2019-12-24 19:08:01 55

空空如也

空空如也

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

TA关注的人

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