计算机
触不可及<>
切忌只看不做,眼高手低,多动手。
展开
-
从0开始学架构-学习笔记
05 复杂度来源:高可用高可用定义:系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。系统的高可用方案五花八门,但万变不离其宗,本质上都是通过“冗余”来实现高可用。通俗点来讲,就是一台机器不够就两台,两台不够就四台;一个机房可能断电,那就部署两个机房;一条通道可能故障,那就用两条,两条不够那就用三条(移动、电信、联通一起上)。高可用的“冗余”解决方案,单纯从形式上来看,和之前讲的高性能是一样的,都是通过增加更多机器来达到目的,但其实本质上是有根本区别的:高性能增加机原创 2022-04-28 17:40:41 · 1760 阅读 · 1 评论 -
后端技术面试38讲 笔记
极客时间 后端技术面试38讲 笔记1 软件的基础原理1 程序运行原理:程序是如何运行又是如何崩溃的?1 软件的基础原理1 程序运行原理:程序是如何运行又是如何崩溃的?不管是文本格式的代码还是可执行的代码,都被称为程序,程序是静态的,安静地呆在磁盘上,什么也干不了。要想让程序处理数据,完成计算任务,必须把程序从外部设备加载到内存中,并在操作系统的管理调度下交给 CPU 去执行,去运行起来,才能真正发挥软件的作用,程序运行起来以后,被称作进程。一台计算机如何同时处理数以百计的任务我们自己日常使用的 P原创 2022-03-21 16:14:35 · 3371 阅读 · 0 评论 -
后端技术面试38讲 笔记
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结1 软件的基础原理1 程序运行原理:程序是如何运行又是如何崩溃的?不管是文本格式的代码还是可执行的代码,都被称为程序,程序是静态的,安静地呆在磁盘上,什么也干不了。要想让程序处理数据,完成计算任务,必须把程序从外部设备加载到内存中,并在操作系统的管理调度下交给 CPU 去执行,去运行起来,才能...原创 2022-03-21 16:26:14 · 252 阅读 · 0 评论 -
负载均衡算法
负载均衡算法分类介绍现有的负载均衡算法主要分为静态和动态两类。静态负载均衡算法以固定的概率分配任务,不考虑服务器的状态信息,如轮转算法、加权轮转算法等;动态负载均衡算法以服务器的实时负载状态信息来决定任务的分配,如最小连接法、加权最小连接法等。分类1、轮询法轮询法,就是将用户的请求轮流分配给服务器,就像是挨个数数,轮流分配。这种算法比较简单,他具有绝对均衡的优点,但是也正是因为绝对均衡它必须付出很大的代价,例如它无法保证分配任务的合理性,无法根据服务器承受能力来分配任务。2、随机法随机法,是随转载 2022-03-07 21:17:45 · 1009 阅读 · 0 评论 -
Linux父子进程写时复制
重要:https://www.cnblogs.com/wuchanming/p/4495479.htmlhttps://blog.csdn.net/championhengyi/article/details/52089087转载 2022-01-08 10:41:02 · 178 阅读 · 0 评论 -
Linux高性能服务器编程笔记
3.1 TCP服务的特点基于字节流和基于报文段的区别:UDP协议和IP协议一样,提供不可靠服务。它们都需要上层协议来处理数据确认和超时重传。3.3 TCP连接的建立和关闭3.4.2 TIME_WAIT状态第5章 Linux网络编程基础API通用socket地址:5.2 创建socket:socket函数:参数解释:bind函数:监听socket:listenaccept**connect**接收连接:5.8 数据读写:TCP数据读写:原创 2022-01-02 15:48:46 · 1468 阅读 · 1 评论 -
ubuntu redis服务如何启动
1、设置开机自动启动,关机自动关闭sudo update-rc.d redis-server defaults2、启动Redis:sudo /etc/init.d/redis-server start3、启动client客户端连接:$ redis-cliredis> set foo barOKredis> get foo"bar"4 查看redis服务的状态,执行ps -ef|grep redis查看 或者 service redis status 命令查看状态为原创 2021-12-13 21:28:43 · 2853 阅读 · 0 评论 -
堆排序-golang语言实现
使用数组存储堆,节点之间的索引关系:本文从数组索引0位置开始存储若当前节点索引为i,则父节点为 (i - 1) / 2两个子节点分别为: 2i + 1 , 2i + 2如下图所示:堆排序主要有两步:建堆排序(本文构建大顶堆,进行升序排序)(1) 建堆:对于完全混乱的数组,从0开始建堆,只需要从最后一个叶子节点的父节点开始往前遍历,分别执行建堆操作,即可完成堆的构建。如下图所示:(2) 排序:利用堆进行排序,每次操作将堆顶元素(保存的最大值)和最后一个元素进行交换,并对新的堆的元素进行原创 2021-11-27 10:30:32 · 729 阅读 · 0 评论 -
Linux下go安装与环境配置 & VSCode配置go环境
1 首先查看linux版本,是否是64位版本,安装go时要确保安装对应版本uname -m2 安装对应go版本https://golang.google.cn/dl/3 解压安装至系统目录 下述命令解压到 /urs/local/ 目录 sudo tar -C /usr/local/ -xzvf go1.10.2.linux-amd64.tar.gz4 配置环境打开.bashrc 或 .profile 文件设置export GOROOT="/usr/local/go"export G原创 2021-11-06 11:40:50 · 2877 阅读 · 1 评论 -
面试问题记录总结
1 项目或实习经历中有解决比较有挑战的工程实际问题吗?具体的问题?海康威视网络摄像头,视频流分帧转图像,加ros时间戳2 为什么协程比实际线程更轻量?(1)协程切换完全在用户空间进行,线程切换涉及特权模式切换,需要在内核空间完成; 不依赖操作系统和其提供的线程,golang自己实现的CSP并发模型实现:M, P, G go协程也叫用户态线程,协程之间的切换发生在用户态。在用户态没有时钟中断,系统调用等机制,因此效率高(2)协程切换相比线程切换做的事情更少。 执行go协程只需要极少的栈内存(大原创 2021-09-13 21:40:26 · 261 阅读 · 0 评论 -
C++使用多线程交替打印1~10
方法1:pthread库https://subingwen.cn/linux/thread-sync/#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <pthread.h>#define MAX 10原创 2021-09-13 09:45:06 · 1158 阅读 · 0 评论 -
结构体内存对齐相关
1 为什么要做内存对齐1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。2 为什么是4字节对齐因为在32位操作系统(虽然64位操作系统,但是为了保证兼容性,编程仍然主要考量32位)中,数据总线是32位,地址总线是32位。地址总线是32位,意味着寻址空间是原创 2021-09-11 19:37:05 · 64 阅读 · 0 评论 -
常见数据结构应用场景
转载:https://www.cnblogs.com/lz3018/p/5932198.html通用数据结构可以简单的按照速度将通用数据结构划分为:数组和链表(最慢),树(较快),哈希表(最快)。增、删、改、查是四大常见操作,不过其实可以浓缩为两个操作:增和查。删除操作和和修改操作都是建立在查找操作上的,所以完美的数据结构应该是具有较高的插入效率和查找效率。通用数据结构关系可以根据下图选择合适的通用数据结构:数组使用场景数组在以下三个情形下很有用:1)数据量较小。2)数据规模已知。3)随转载 2021-09-10 17:07:48 · 569 阅读 · 0 评论 -
数组实现循环队列
在用数组实现时,有以下几个地方需要注意:1、队列的长度就是数组的长度2、没有成员时,队头队尾都指向第一个位置,即下标为03、队头始终指向队列中最先进队的成员,队尾始终指向队列中最后进队的成员的后面下一个位置3、当队头与队尾的下标相同时,队列为空,因此队尾在指向第四个位置即下标为3时,就应该算队满,否则当队头下标为0时,最后一个位置即第五个位置也有成员,此时队尾下标为0,按照上面的思想应该算队列为空,与实际不符。因此队列的实际容量始终为数组容量减一。4、按照上面的思想,队头和队尾下标表示应该为(当前原创 2021-09-10 16:27:43 · 380 阅读 · 0 评论 -
数据结构相关细节
1 完全二叉树的顺序存储使用数组的方式:2 图的存储方式邻接矩阵:邻接表:有向图的邻接表存储:边链表只存储从当前顶点出发的3 B树 与 B+树多叉排序树:B树:平衡的多路查找树B树所有叶节点都在同一层,各子树没有高度差,绝对平衡,比平衡二叉树要求更高。B+树所有叶子结点包含了全部关键字和关键字指向记录的指针,叶节点内的关键字有序排列,叶节点之间也是有序排列,指针相连。所有非叶子节点可以看成是索引,仅包含了其子树中最大(最小)关键字的值。B+树支持顺序查找,即从原创 2021-09-10 11:53:31 · 81 阅读 · 0 评论 -
单链表排序:冒泡法
冒泡排序的基本思想就是对于给定的n个元素,从第一个元素开始,依次对相邻的两个元素进行比较,当前面的元素大于后面的元素时,交换其位置,进行一轮比较和换位后,n个元素中最大的数将位于第n位,然后对前(n-1)个元素进行第二轮比较,重复该过程,直到进行比较的元素只剩下一个。但是,由于单链表不能像数组那样随机存储,和数组的快排序相比较,还是有一些需要注意的细节:支点的选取,由于不能随机访问第K个元素,因此每次选择支点时可以取待排序那部分链表的头指针。遍历链表方式,由于不能从单链表的末尾向前遍历,因此使原创 2021-09-09 10:16:20 · 1941 阅读 · 0 评论 -
二叉排序树,平衡树,红黑树等树
1 平衡树为什么要平衡,平衡有什么用?首先平衡二叉树是特殊的二叉排序树,他的结点元素间存在着排序关系。其次相对于一般的二叉排序树,平衡二叉树的左右子树的深度差也有不超过1层的约束。这样使得平衡树是同种元素序列情况下的深度最小的二叉排序树。这可以减少二叉树元素查找的深度,从而提升平均查找效率。保证O(log2N)的时间复杂度。如果不做平衡操作,极端情况下二叉树会退化成链表,时间复杂度会退化为O(n)对于查找操作而言,二叉搜索树的时间复杂度介于O(log2N)到O(n)之间,如果退化成单链表,时间复杂原创 2021-09-08 21:39:04 · 265 阅读 · 0 评论 -
数字证书和数字签名
数字证书网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”。而这里又有一个显而易见的问题,“证书本身的传输过程中,如何防止被篡改”?即如何证明证书本身的真实性?身份证运用了一些防伪技术,而数字证书怎么防伪呢?解决这个问题我们就接近胜利了!如何放防止数字证书被篡改?我们把证书原本的内容生成一份“签名”,比对证书内容和签名是否一致就能判别是否被篡改。这就是数字证书原创 2021-09-08 20:39:51 · 2717 阅读 · 0 评论 -
Nginx-基本概念和原理
https://baijiahao.baidu.com/s?id=1677770814186358219&wfr=spider&for=pc转载 2021-09-06 21:07:50 · 164 阅读 · 0 评论 -
文件系统的层次结构
原创 2021-09-04 20:19:33 · 193 阅读 · 0 评论 -
聚簇索引使用B+树的好处
使用B+树的好处由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。 B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保原创 2021-09-01 10:47:30 · 431 阅读 · 0 评论 -
C语言实现字符串拷贝
利用数组实现#include<stdio.h>#include<string.h>void copy_string(char str1[],char str2[]){ int i = 0; while(str2[i] != '\0') { str1[i] = str2[i]; i++; } str1[i] = '\0';}int main(){ char a[100],b[100];转载 2021-08-31 15:12:31 · 1687 阅读 · 0 评论 -
二维有序数组的查找
**题目:**在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。/*题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。*//*Time:2016-9-8 15:44:52Author:CodingMengmeng*/#include <iost原创 2021-08-26 18:02:24 · 242 阅读 · 0 评论 -
数组实现栈
转载 2021-08-25 09:47:35 · 77 阅读 · 0 评论 -
http相关细节
1 HTTPS建立连接过程:先建立TCP连接,再建立SSL连接:HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。2 HTTP3 基于UDP3 HTTP 由于是明⽂传输,所以安全上存在以下三个⻛险:窃听⻛险,⽐如通信链路上可以获取通信内容,⽤户号容易没。篡改⻛险,⽐如强制植⼊垃圾⼴告,视觉污染,⽤户眼容易瞎。冒充⻛险,⽐如冒充淘宝⽹站,⽤户钱容易没。原创 2021-08-24 11:51:06 · 121 阅读 · 1 评论 -
几种数据结构的查找、删除、插入的时间复杂度(数组 链表 二叉查找树 平衡二叉查找树 哈希表)
其中无序数组直接插在末尾,时间复杂度为1有序数组使用二分查找,时间复杂度logN无序链表插入在表尾,时间复杂度1有序链表插入需要寻找插入位置,时间复杂度N二叉树一般情况即为平衡二叉树,最坏情况为有序链表不过,此处需要说明,平衡二叉树删除时需要从被删除节点的父节点开始调节平衡一直调节到根节点,不过这个过程的时复杂度也是logN...原创 2021-08-17 14:40:26 · 6602 阅读 · 0 评论 -
cgi是什么
https://www.jianshu.com/p/c4dc22699a42原创 2021-08-10 17:57:25 · 168 阅读 · 0 评论 -
大小端存储及其判断
大端存储:字数据的高字节存储在低地址中小端存储:字数据的低字节存储在低地址中例如:32bit的16进制数字0x12345678所以在Socket编程中,往往需要将操作系统所用的小端存储的IP地址转换为大端存储,这样才能进行网络传输小端模式中的存储方式为:大端模式中的存储方式为:了解了大小端存储的方式,如何在代码中进行判断呢?下面介绍两种判断方式:方式一:使用强制类型转换-这种法子不错#include <iostream>using namespace std;int ma原创 2021-08-05 16:10:08 · 215 阅读 · 0 评论 -
输入输出:一行字符串以逗号分隔,string转int
#include<iostream> #include<vector> #include<string> #include<sstream> //stringstream头文件 using namespace std; int main(){ vector<int> arr; // 5,6,8,26,50,48,52,55,10,1,2,1,20,5:3 vector<string> stu; string.原创 2021-08-01 17:50:04 · 729 阅读 · 0 评论 -
缓冲区buffer
什么是缓冲区机制:缓冲区是内存空间的一部分,在内存中预留了一定的存储空间,用来暂时保存输入和输出等I/O操作的一些数据,这些预留的空间就叫做缓冲区;缓冲区有buffer缓冲区和Cache缓存区两种,但是这篇主要介绍buffer缓冲区为什么要设置缓冲区原因:高速设备与低速设备的不匹配,势必会让高速设备花时间等待低速设备,我们可以在这两者之间设立一个缓冲区,从而使低速输入输出设备和高速的cpu可以协调工作,避免低速输入输出设备占用缓冲区,解放cpu。(1)减少CPU对磁盘的读写次数:CPU读取磁盘中的数转载 2021-07-18 16:26:47 · 1606 阅读 · 0 评论 -
topK问题
下面代码:求解第k大的数力扣215:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/class Solution {public: int findKthLargest(vector<int>& nums, int k) { int len = nums.size(); int left = 0; int right = len - 1;原创 2021-07-17 16:56:24 · 98 阅读 · 0 评论 -
设计模式:单例模式
单例模式:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方式。单例模式主要有两种实现方式,懒汉式和饿汉式。饿汉式:一上来就获取资源//饿汉式class Singleton_hungry{private: Singleton_hungry(){ cout << "我是饿汉" <原创 2021-07-17 16:08:12 · 131 阅读 · 0 评论 -
docker基本概念
原创 2021-07-14 17:20:38 · 59 阅读 · 0 评论 -
git使用记录
创建本地分支:git checkout -b 分支名git branch 查看本地分支git branch -r 查看远端分支git add .git commit -m ‘提交信息’推送新分支git push --set-upstream 服务器名 新分支名git push --set-upstream origin feature/test01...原创 2021-07-13 15:47:30 · 76 阅读 · 0 评论 -
Git进阶教程-3-分支管理
建议原文查看:https://code.iamhefang.cn/content/git-tutorial-2-git-branch-manage.htmlGit分支和其他VCS相比有何优势?在使用分支之前我们有必要先了解一下什么是分支?Git的分支和其他版本控制系统的分支有何不同?几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把当前的工作从开发主线上分离出来,以免影响开发主线。在其他版本控制系统中分支常常需要创建一个源代码的完整副本,这种做法对于大型项目来说是非常耗费时间的转载 2021-07-12 17:39:39 · 174 阅读 · 0 评论 -
controller和service
做 web 开发,无论哪个语言,无论哪个框架都有 controller 和 service 两个概念,很多时候也分不清楚逻辑写在 controller 还是 service ,框架一般也不做强制限制,都在于开发者自身的素质能力以及对框架的认知。究竟什么是 controller,可以说他是对 http 中 request 的解析,以及对 response 的封装,它对应的是每一个路由,是 http 请求到代码的一个承接,它必须是可单例的,是无状态的。service 顾名思义是为了服务而生,为了业务而生,是转载 2021-07-12 09:51:51 · 4656 阅读 · 0 评论 -
httpd工作原理
简单说下程序的逻辑吧:一个无限循环,一个请求,创建一个线程,之后线程处理函数处理每个请求,然后解析HTTP请求,然后做一些判断处理,之后判断文件是否可执行,不可执行,打开文件,输出给客户端(浏览器)呗,可执行就创建管道,父子进程通信。整个流程就这么简单,程序主要处理2种HTTP请求方式:GET和POST。main函数中:首先调用startup函数:在服务端设置socket,绑定端口号,然后建立监听socketwhile循环:进入循环,服务器通过调用accept等待客户端的连接,accept会以阻塞原创 2021-07-11 16:22:43 · 319 阅读 · 0 评论 -
http请求头和响应头get/post
https://www.cnblogs.com/lauhp/p/8979393.html转载 2021-07-11 16:09:06 · 145 阅读 · 0 评论 -
linux常用命令
文件相关:1 cd2 pwd3 mkdir4 cp5 rm日志相关:6 tail7 cat权限:8 chmod -R 777 .网络:9 pingifconfig原创 2021-07-10 17:26:33 · 139 阅读 · 0 评论 -
Session工作原理
1 写入Session列表服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为Session列表。该Map的key是一个32位长度的随机串,这个随机串称为SessionID,value则为Session对象的引用。当用户第一次提交请求时,服务端Servlet执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value为新创建的HttpSession对象。2 服务器生成并发送Cook原创 2021-07-10 17:01:14 · 203 阅读 · 0 评论