计算机基础
操作系统
路上的追梦人
尽人事,听天命
展开
-
面试官问,浏览器输入URL地址到页面的渲染发生了什么?
浏览器输入URL地址到页面的渲染的整个过程1、客户端连接到Web服务器一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80端口)建立一个TCP套接字连接。例如,https://mp.csdn.net/console/home。2、发送HTTP请求通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据这四部分组成。3、服务器接受请求并返回HTTP响应Web服务器解析请求,定位请求资源。分析请求链接,分析凭证,分原创 2020-11-25 21:57:30 · 155 阅读 · 0 评论 -
Tcp与Http的Keep Alice区别
本文来源于:https://zhuanlan.zhihu.com/p/34052073https://www.jianshu.com/p/9fe2c140fa52什么是KeepAlive?首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。...转载 2020-10-27 21:32:14 · 406 阅读 · 0 评论 -
Go实现简单的多并发服务器
互联网通信本质上是应用进程之间的通信、连接,必须知道通信双方的IP以及端口Port;本文选用流式套接字的模式,利用Go语言实现简单的多并发任务,原理的流程图大致如下:服务器的建立建立socket,申明自身的端口port和IP,并绑定到socket,使用listen监听,然后不断用accept去查看是否有连接。如果有,捕获socket,并通过recv获取消息的内容,通信完成后调用closeSocket关闭这个对应accept到的socket。如果不需要等待任何客户端连接..原创 2020-10-27 14:44:54 · 785 阅读 · 0 评论 -
某大厂面试官问:你会Git工具?我怂了!
这表文章主要是用命令操作: 使用可视化软件操作:https://www.cnblogs.com/mswyf/p/9261859.html一.下载安装Git Bash 下载安装:https://www.cnblogs.com/mswyf/p/9261859.html二.注册github远程仓库的账号,这里就不多说了,输入用户名,邮箱密码注册就行 注册地址:https://github.com/三.创建新项目1. 2. 3. 4..转载 2020-10-21 14:08:21 · 355 阅读 · 0 评论 -
面试-define与typedef的区别
一、#define1.简单的define定义#defineMAXTIME 1000这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。2.define的“函数定义”define可以像函数那样接受一些参数,如下#definemax(x,y) (x)>(y)?(x):(y);定义就将返回两个数中较大的那个。因为这个“函数”没有类型检查,就好像一个函数模板似...转载 2020-10-13 11:13:01 · 158 阅读 · 0 评论 -
深入理解C++构造函数初始化列表与赋值
在C++中类成员变量的初始化有以下两种方式:构造函数初始化列表; 构造函数体内赋值;内部数据类型形如char,int,float…指针等class Animal{public: Animal(int weight,int height): //A初始化列表 m_weight(weight), m_height(height) { } Animal(int weight,int height) ...原创 2020-10-11 13:58:53 · 9932 阅读 · 3 评论 -
一文搞懂共享锁、排他锁、悲观锁、乐观锁、行锁、表锁
我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)。共享锁(S锁)共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。排他锁(X锁)用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁.转载 2020-10-10 20:25:12 · 2910 阅读 · 0 评论 -
Mysql三大日志-binlog、redo log和undo log
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),本文接下来会详细介绍这三种日志。binlogbinlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog是mysql的逻辑日志,并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记转载 2020-10-10 13:33:12 · 80 阅读 · 0 评论 -
一文搞懂面试中的mysql事务和锁
众所周知,事务和锁是mysql中非常重要功能,同时也是面试的重点和难点。本文会详细介绍事务和锁的相关概念及其实现原理,相信大家看完之后,一定会对事务和锁有更加深入的理解。本文主要内容是根据掘金小册《从根儿上理解 MySQL》整理而来。如想详细了解,建议购买掘金小册阅读。什么是事务在维基百科中,对事务的定义是:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的四大特性事务包含四大特性,即原子性(Atomicity)、一致性(Consis转载 2020-10-10 13:02:51 · 235 阅读 · 0 评论 -
模板类成员变量的构造函数的初始化
在C++类中,形如int型变量没有带参数的初始化默认是0,float k = 0;float = float();float tmp = float(0); // 这是 (显示转换)explicit cast以上代码都是等价的。在C++为非类类型(non-class type,或称原生类型),这里的意思是提供的缺省构造函数(deconstructor),就方便处理模板参数。template<typename T>class solution{public:原创 2020-10-10 09:47:35 · 1689 阅读 · 0 评论 -
一文搞定基址寄存器、界限寄存器、静态重定位与动态重定位
地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享它们的地址空间外)。给每个程序一个自己的地址空间,使得一个程序中的地址28所对应的物理地址与另一个程序中的地址28所对应的物理地址不同。方法:基址寄存器与界限寄存器使用一种简单的动态重定位,把每个进程的地址空间映射到物理内存的不同部分。当使用基址寄存器和界限寄存器时,程序装载到内存中连续的空闲位置且装载期间无须重定位,如图3-2c所示。当一.转载 2020-10-09 10:29:32 · 7922 阅读 · 2 评论 -
C++ 函数把引用作为返回值
通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。C++ 函数可以返回一个引用,方式与返回一个指针类似。当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如,请看下面这个简单的程序:#include <iostream> using namespace std; double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0}; double& setValues( int i ).原创 2020-10-07 18:07:35 · 339 阅读 · 0 评论 -
STL-erase与remove讲解
erase:从指定容器删除指定的元素两个重载:iterator erase (iterator position);删除指定位置position的元素,并返回删除元素的下一个元素的迭代器iterator erase (iterator first, iterator last);删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器错误用法1#include<vector>#include<iostre.转载 2020-10-06 20:01:44 · 312 阅读 · 0 评论 -
深入理解端口与IP的关系
IP:网络之间互连的协议(IP)是Internet Protocol的外语缩写, 中文缩写为“网协”.网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。端口:"端口"是英文port的意转载 2020-10-06 16:50:48 · 18163 阅读 · 0 评论 -
笔记-深入理解Redis分布式缓存
今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等概念一、缓存雪崩缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。缓存正常从Redis中获取,示意图如下:缓存失效瞬间示意图如下:缓存失效时的雪崩效转载 2020-10-06 15:51:46 · 138 阅读 · 0 评论 -
笔记-解剖类成员变量多用指针,而不是对象
class A{ //};class B{private: A* a;public: void fun(A* a); //};如A类的成员变量含有B类的对象,那么每个A类对象产生或拷贝都要产生一次B类对象的构造或者拷贝,对象占的空间比较大,对象拷贝比较消耗内存。如果换成B类的指针,A类对象拷贝,也只会产生4个字节(32位操作系统)或者8个字节(64位操作系统)的拷贝。传指针(和引用)是非常快的,A* a这种形式 在传参数的时候,会首先调用类A的赋值构..原创 2020-10-06 14:15:50 · 238 阅读 · 0 评论 -
笔记-Git的讲解
转载于https://blog.csdn.net/YJG7D314/article/details/104551896目录1.git 简介1.1 产生历史1.2 git两大特点2.安装配置3.创建一个版本库4.版本的创建与回退4.1 使用4.2 工作区和缓存区4.2.1 工作区(WorkingDirectory)4.2.2 版本库(Repository)4.3 管理修改4.4 撤销修改4.5 对比文件的不同4.6 删除文件5. 分支管理.转载 2020-10-02 18:38:54 · 565 阅读 · 0 评论 -
笔记-traits技巧讲解
侯捷老师在《STL源码剖析》中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘。如此一说,其重要性就不言而喻了。 之前已经介绍过迭代器,知道了不同的数据结构都有自己专属的迭代器,不同的迭代器也有不同的特性,由于算法的接口是统一的,通过迭代器的不同属性,算法自动选择正确的执行流程,在完全任务的同时,也尽可能提高算法的执行效率。那算法如何获知迭代器的属性呢?这一光荣的任务就是traits完成的。在STL实现中,traits编程技术得到大量的运用...转载 2020-10-01 20:25:59 · 728 阅读 · 0 评论 -
笔记-空间配置器详解
空间配置器1.什么是空间配置器为各个容器高效的管理空间(空间的申请与回收)的2.为什么需要空间配置器各种容器----->可以存放元素---->底层需要空间new 申请空间operator new ---->malloc 调用构造函数------完成对象的构造动态内存管理总结前面的容器中,每次开辟空间都用的是new,但是用new有一些不好的地方空间申请与释放需要用户自己管理,容易造成内存泄漏 频繁向系统申请小块内存块,容易造成内存碎片例如:结点 频繁转载 2020-10-01 19:39:18 · 369 阅读 · 0 评论 -
笔记-数据结构之哨兵
设置哨兵是为了减少比较次数,省去对下标越界的判断。应用:假设一个乱序数组,需要查找一个元素是否在该数组中,这时需要用到顺序查找,也就是遍历数组。一般情况下我们会写下如下代码:int Sequential_Search(int *a,int n,int key) { //数组从1开始 int i; for(int i=1;i<=n;i++) { if(a[i]==key) return i;转载 2020-10-01 13:48:19 · 1144 阅读 · 0 评论 -
笔记-类对象动态数组
默认构造函数首先,我们来看一下是什么是默认构造函数,如下面一段代码:#include<iostream>#include<math.h>using namespace std;class Point{ double x, y;public: void print(); Point(double a=0,double b=1){x=a;y=b;} //默认构造函数 Point(double a){x=1;y=1;} //构造...转载 2020-09-29 21:39:42 · 1421 阅读 · 0 评论 -
笔记-类的保护成员
在类的外部,应当把保护成员和私有成员同等看待,都不允许对象直接进行访问; 在类的内部,若类之间存在继承关系,则派生类可以访问基类保护成员,不可以访问基类私有成员,而且派生类在类内也只能通过派生类对象的形式访问基类的保护成员。派生类对于基类对象的保护成员没有任何访问特权; 公有成员则是暴露的,随时处在风口浪尖之中 只有baipublic类型的变量才可以被该类的对象du直接访问。基类的对象zhi和派生类的对象都不能直接访问类dao的保护成员和私有成员。...原创 2020-09-29 15:34:44 · 1753 阅读 · 0 评论 -
宿主机访问本机虚拟机中的web服务器
虚拟机网络选择NAT模式,linux系统使用ifconfig命令,查看ip地址,然后安装Apache并启动,虚拟主机内打开浏览器,访问localhost,访问正常,然后关闭防火墙 systemctl stop firewalld。此时本机输入刚刚查看到的ip地址即可访问。涉及到的指令:APache服务器常用指令systemctl start httpd.servicesystemctl status httpd.servicesystemctl stop httpd.ser...转载 2020-09-28 11:36:26 · 4002 阅读 · 0 评论 -
笔记-poll/select/epoll
poll/select/epoll 对比http://www.cnblogs.com/apprentice89/p/3234677.html ---有待继续学习http://blog.chinaunix.net/uid-20384806-id-1954307.html ---有待继续学习select和poll即使只有一个描述符就绪,也要遍历整个集合。如果集合中活跃的描述符很少,遍历过程的开销就会变得很大,而如果集合中大部分的描述符都是活跃的,遍历过程的开销又可以忽略。...转载 2020-09-27 15:07:38 · 214 阅读 · 0 评论 -
一文搞懂异步、并发、协程原理
异步、并发、协程原理Linux 操作系统在设计上将虚拟空间划分为用户空间和内核空间,两者做了隔离是相互独立的,用户空间给应用程序使用,内核空间给内核使用。一、异步应用程序和内核内核具有最高权限,可以访问受保护的内存空间,可以访问底层的硬件设备。而这些是应用程序所不具备的,但应用程序可以通过调用内核提供的接口来间接访问或操作。所谓的常见的 IO 模型就是基于应用程序和内核之间的交互所提出来的。以一次网络 IO 请求过程中的 read 操作为例,请求数据会先拷贝到系统内核的缓冲区(内核空间),再转载 2020-09-26 18:28:12 · 1790 阅读 · 1 评论 -
一文搞懂类的继承和多态
一:继承继承的概念:为了代码的复用,保留基类的原始结构,并添加派生类的新成员。继承的本质:代码复用我们用下图解释下:那么我们这里就可以提出几个问题了:①:进程的方式有哪些呢?这里有三种继承方式:public:任意位置可以访问 protected:只允许本类类中以及子类类中访问 private:只允许本类类中访问②:派生类继承了基类的什么?所有成员变量,包括static静态成员变量 成员方法,除构造和析构以外的所有方法 作用于也继承了,但是...转载 2020-09-26 09:58:03 · 1448 阅读 · 0 评论 -
Reactor设计模式
Reactor 反应堆设计模式为了应对高并发的服务器端开发,微软在2009年提出了一种更优雅地实现异步编程的方式Reactive Programming即反应式编程。随后其他技术紧随其后,比如ES6通过引入类似的异步编程方式等。在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,Proactor用于异步I/O操作。Reactor模式称之为响应器模式,通常用于NIO非阻塞IO的网络通信框架中。在这之前,需要弄明白几..转载 2020-09-25 15:43:06 · 347 阅读 · 0 评论 -
项目实战-Http服务器
目录从main函数开始 初始化函数startup(&port) 请求处理accept_request(&client_sock) 请求行的处理 本地处理 测试结果 服务器功能测试 使用webbench测试 Tinyhttpd是一个小型的http服务器实现,代码仅仅500行,我在大致过了一下unix环境编程之后就想找一个web服务器来练练手,这个就作为俺第一个web方向的小项目吧。看完这个代码后准备研究一下muduo库、Nginx和Redis,上.转载 2020-09-25 15:13:31 · 296 阅读 · 0 评论 -
一文弄懂连接池和线程池
线程池线程池的原理类似于操作系统中的缓冲区的概念。先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。也许有人质疑:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了吗?这也许是个不错的方法,因为它能使你的代码相对容易一些,但是却忽略了性能问题。假如有一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请转载 2020-09-24 20:45:55 · 921 阅读 · 0 评论 -
一文搞懂TCP和UDP的区别
TCP协议与UDP协议的区别首先咱们弄清楚,TCP协议和UDP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信!TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。TCP/IP协议集包括应用层,传输层,网络层,网络访问层。其中应用层包括:1、超文本传输协议(HTTP):万维网的基本协议;2、文件传输(T转载 2020-09-24 15:46:05 · 612 阅读 · 0 评论 -
一分钟弄懂线程程序计数器
程序计数器为什么是线程私有的?1.程序计数器1.1.程序计数器的本质从本质来看,程序技术器就是一块比较小的内存空间。1.2.程序计数器的作用程序计数器可以看作是当前线程所执行字节码的行号指示器,也就是说,程序计数器这块小空间里面记录的是当前线程正在执行的字节码的行号。字节码解释器通过改变计数器的值来获取下一条要执行的字节码。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。1.3.为什么程序计数器被设计成线程私有的?假如现在有一本书,有好几个同学都...转载 2020-09-23 14:25:40 · 1167 阅读 · 0 评论 -
深入理解类组合构造函数的初始化
在一个类中内嵌套另一个类的对象作为数据成员,这样可以称为类的组合。类中的成员数据是另一个类的对象。通过类的组合可以在已有的抽象的基础上实现更复杂的抽象。该内嵌对象称为对象成员,或者子对象。如学生类Student的内嵌课程类Course作为数据成员;class Student{private: Course *m_course;public:};在使用过程中,需要着重注意的是对象成员的初始化!如Student的构造函数该如何定义?如果一个类具有内嵌对象,那么在它对象化的时..转载 2020-09-23 10:13:29 · 473 阅读 · 0 评论 -
两分钟搞定POSIX
在网上查到对于posix的介绍,来自《Linux内核设计与实现(第2版)》的第5章,就这部分来看,这本书估计不错。 一般情况下,应用程序通过应用编程接口(API)而不是直接通过系统调用来编程。这点很重要,因为应用程序使用的这种编程接口实际上并不需要和内核 提供的系统调用对应。一个API定义了一组应用程序使用的编程接口。它们可以实现成一个系统调用,也可以通过调用多个系统调用来实现,而完全不使用任何系 统调用也不存在问题。实际上,API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而它们本身.转载 2020-09-21 15:27:50 · 363 阅读 · 0 评论 -
难点解刨-Posix消息队列
Posix消息队列目录1. 概述 2. Posix消息队列 创建与打开 关闭与删除 消息队列属性 获取属性 设置属性 消息发送与接收 3. 消息队列限制 4. 生产者消费者问题——Posix消息队列实现 单生产者 + 单消费者 多生产者 + 单消费者 5. 效率对比1. 概述消息队列可认为是一个消息链表,队列中的每个消息具有如下属性:消息优先级,由发送者赋予 消息数据长度,可以为0 消息...转载 2020-09-21 14:25:15 · 450 阅读 · 1 评论 -
OSI七层网络模型的详细讲解
七层网络结构:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层一般也作五层 应用层、传输层、网络层、数据链路层、物理层(实体层)引申问题:TCP/IP协议与http协议的区别:TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的...转载 2020-09-21 10:33:42 · 2271 阅读 · 0 评论 -
一文搞懂用户缓冲区与内核缓冲区
常常听到有程序员会跟你讨论:“我们在读写文件的时候,系统是有缓存的”。但实际上有一部分人把用户进程缓存区和系统空间缓存区的概念混淆了,包括这两种缓冲区的用法和所要解决的问题,还有其它类似的概念。本文就来区分一下不同的缓冲区概念(主要针对类unix平台)。 用户进程和操作系统的关系,首先我用一张图来解释“用户进程和操作系统的关系:这是一个计算机系统运行时的简化模型,我们把所有运行在操作系统上的进程成为用户进程,它们都运行在用户空间(可以看到用户空间有很多进程)。把操作系统运行的空间成为系统空.转载 2020-09-21 09:58:46 · 7315 阅读 · 3 评论 -
一文搞懂类的静态成员变量与静态成员函数
原文作者:https://blog.csdn.net/lms1008611/article/details/81408236在C语言中,我们知道有static静态变量,生命周期与作用域都跟普通变量有所不同。而在C++的类中,也有静态成员变量同时还有静态成员函数,先来看看C++中静态成员变量与静态成员函数的语法:#include <iostream>#include <string> using namespace std;class test{privat.转载 2020-09-19 14:49:28 · 116 阅读 · 0 评论 -
一文搞定Linux文件描述符
Linux中一切皆文件,比如C++源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。一个Linux进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符(File Descriptor)。这只是一个形象的比喻,为了让读者容易理解我才这么说。如果你也仅仅理解到这个层面,那不过是浅尝辄止而已,并没有看到文件描述符的本质。 本篇文章的目的就是拨云见雾,从底层实现的角...转载 2020-09-19 10:44:52 · 185 阅读 · 0 评论 -
libevent网络框架
一、libevent是什么libevent是一个轻量级的开源的高性能的事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。它被众多的开源项目使用,例如大名鼎鼎的memcached等。特点:事件驱动,高性能;轻量级,专注于网络(相对于ACE);开放源码,代码相当精炼、易读;跨平台,支持Windows、Linux、BSD和Mac OS;支持多种I/O多路复用技术(epoll、poll、dev/转载 2020-09-13 16:21:02 · 246 阅读 · 0 评论 -
C++类的名字后面直接加括号
class A {private: static int k; int h; public: class B {public: void foo(const A& a){ cout << k << endl; //运行完成 cout << a.h << endl;//运行完成 } }; }; int A::k = 1; int main() { A::B.原创 2020-09-13 11:43:01 · 5524 阅读 · 0 评论