自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络编程篇: HTTPS协议

早期很多公司刚起步的时候,使用的应用层协议都是HTTP,而HTTP无论是用GET方法还是POST方法传参,都是没有经过任何加密的,因此早期很多的信息都是可以通过抓包工具抓到的。为了解决这个问题,于是出现了HTTPS协议,HTTPS实际就是在应用层和传输层协议之间加了一层ssl加密解密层,这层加密层本身也是属于应用层的,它会对要进行网络通信的数据加密。HTTPS在交付数据时先把数据交给加密层,由加密层对数据加密后再交给传输层。

2024-06-25 20:00:46 917

原创 网络编程篇:HTTP协议

HTTP协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP协议之上。在编写网络通信代码时,我们可以自己进行自定义协议来判断区分一次协议的内容,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。应用层常见的协议有HTTP和HTTPS,传输层常见的协议有TCP,网络层常见的协议是IP,数据链路层对应就是MAC帧了。其中下三层是由操作系统帮我们完成的,它们主要负责的是通信细节。

2024-06-23 22:18:51 887

原创 Linux操作系统篇:多线程

一个或多个执行流(线程),进程地址空间,文件描述符表,页表,物理内存保存的进程资源等加一起才是进程,线程是在进程内部的执行流资源。线程是操作系统调度的基本单位。进程是资源分配的基本实体(单位)。操作系统以进程为基本单位分配资源,进程在创建时就会携带一个线程,这个线程是是主线程。进程包含线程,进程内有一个或多个线程,一个进程有自己的一个PCB,页表,进程地址空间,文件描述符表,这都是操作系统给其分配的。

2024-06-21 23:38:23 781 2

原创 操作系统内功篇:内存管理之虚拟内存

在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃。操作系统是如何解决这个问题呢?这里关键的问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。我们可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,人人都有,大家自己玩自己的地址就行,互不干涉。

2024-04-02 21:32:56 845 3

原创 操作系统内功篇:操作系统结构之Linux内核和Windows内核

计算机是由各种硬件设备组成的,例如:内存,CPU等,如果上层应用层的每个软件都要和每个硬件设备打交道的话太累了,所以就有了内核,内核负责连接硬件设备和软件,负责他们的通信。

2024-03-25 20:49:14 657 4

原创 操作系统内功篇:硬件结构之软中断

中断请求的处理程序应该要短且快,这样才能减少对正常进程运行调度地影响,而且中断处理程序可能会暂时关闭中断,这时如果中断处理程序执行时间过长,可能在还未执行完中断处理程序前,会丢失当前其他设备的中断请求。●那 Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别是「上半部和下半部分」。●上半部用来快速处理中断,一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。●下半部用来延迟处理上半部未完成的工作,一般以「内核线程」的方式运行。

2024-03-24 22:29:55 748 1

原创 操作系统内功篇:硬件结构之CPU是如何执行任务的?

当代CPU一般是多核心的,每个核心都有自己的一个L1和L2Cache,L3Cache是一个CPU所有核心共享的,一个CPU只有一个。L1Cache分为数据缓存和指令缓存。CPU有三层高速缓存的目的就是将Cache作为CPU和内存间的缓存层,减少CPU访问内存的频率从而提高效率。CPU从内存读取数据也是先读取到Cache,一次读取是读取一个Cache Line(缓存行)。所以说缓存行是CPU读取数据的最小单位。Cache Line的大小可以在Linux系统中查看和修改,默认是64byte。

2024-03-23 19:42:57 942 1

原创 操作系统内功篇:硬件结构之CPU缓存一致性

是由很多个Cache Line组成的,CPU Line是CPU从内存读取的基本单位,CPU Line是由多个标志+数据块组成。

2024-03-17 20:55:27 1074 1

原创 操作系统内功篇:硬件结构之如何写出让CPU执行更快的代码?

因为CPU要操作的数据都在CPU Cache中的话,就不用再从内存中读取数据了,这样就提高了效率,访问的数据在CPU Cache中越多,有个专业名词称为缓存命中率高,所以说,缓存命中率越高,自然执行代码就快了。总结:所以说写出CPU跑得更快的代码就是写出缓存命中率高的代码。

2024-03-17 19:37:51 1017

原创 操作系统内功篇:硬件结构之存储器

内存,硬盘(机械硬盘,固态硬盘),CPU中的寄存器,CPU的L1/L2/L3Cache都属于存储设备。除了硬盘以外,其他的存储设备都会在断电后丢失数据,硬盘则不会,硬盘还是一个I/O设备。

2024-03-14 00:04:56 870 1

原创 操作系统内功篇:硬件结构之CPU是如何运行的?

本文分5个小结,分别是图灵机工作方式,冯诺依曼结构,总线线路位宽和CPU位宽,程序执行的基本过程, a=1+2的具体执行过程。

2024-03-13 17:02:32 1120 2

原创 操作系统内功篇:使用说明

本专栏是我阅览大佬小林coding写的电子书《图解系统》的一些总结并参杂一些我个人学习的补充,博客大纲是用的大佬的纲要。暂时打算更新这么多,在以后的学习的过程中再慢慢更新.........

2024-03-13 16:35:54 332

原创 Linux操作系统篇:进程间通信

进程通信是什么?两个或多个进程实现数据层的交互,因为进程独立的原因,进程的通信成本较高。为什么要进程间通信?顾名思义,进程间通信就是在不同进程之间传播或交换信息。怎么实现进程间通信?a) 通信的本质:就是让不同的进程看到同一份”资源“b) "资源"是特定形式的内存空间c) "资源"由OS提供,为什么不是其中一个进程提供呢?如果是其中一个进程提供的话,那到底是谁提供呢,而且进程具有独立性互不干涉。

2024-03-10 23:04:37 1093 4

原创 Linux操作系统篇: 文件系统和软硬连接

文件=文件内容+文件属性磁盘上存储文件=存文件的内容(数据块)+存文件的属性(inode)Linux的文件在磁盘中存储是将属性和内容分开存储的。文件内容的存储是给每个文件分配一块空间,此空间就叫数据块。文件属性是存储到inode中,inode也是一个数据块,大小128字节,每个磁盘上的文件都有自己的一块数据块,但是inode不是每个文件都有的,inode是公共的,每个文件的属性都存在inode中。

2024-03-10 00:03:26 1040 3

原创 Linux操作系统篇:基础IO

1. 文件=内容+属性,内容与属性都是数据,都要在磁盘中保存。2. 文件分为打开的文件和没打开的文件。3. 进程在访问一个文件的时候,都是要先打开这个文件。打开文件之前,文件在磁盘,打开文件之后,文件在内存。4. 一个进程可以打开多个文件,多个进程可以打开多个文件,被打开的文件要加载都内存,打开文件实际是操作系统去执行,操作系统也要将打开的文件管理起来,如何管理呢?先描述,再组织一个文件被加载到内存就是一个进程。进程就要有自己的PCB,操作系统用双链表将PCB管理起来,这在之前就讲过了。

2024-03-06 23:36:01 1114 5

原创 Linux篇小知识点:进程被创建时,操作系统到底为它做了什么工作?

以32位宽虚拟地址为例子,32位宽虚拟地址就是32个比特位,32个比特位就是4字节,32个比特位被分为10+10+12三块,三块页表也不是一整块,假设说页表是一整块,虚拟地址4字节,物理地址4字节,权限2字节,一个地址映射就要10字节,32位的进程地址空间4G,地址从全零到全一,共有2^32个地址,2^32个虚拟地址就要 10*2^32个字节,这才是一个进程的页表,进程的独立性,每个进程一个页表,放进内存是放不开的。而如果页面过小,会导致外部碎片增加,4KB 的页面大小在内存管理的折中方面表现较好。

2024-03-03 09:13:06 917 6

原创 Linux操作系统篇: 进程控制

使用_exit函数退出进程的方法我们并不经常使用,_exit函数也可以在代码中的任何地方退出进程,但是_exit函数会直接终止进程,并不会在退出进程前会做刷新,这和实现有关系,exit是库函数,_exit是系统调用,exit的实现是封装的_exit系统调用但包含了会刷新一下缓冲区,而_exit函数是系统调用,并没有缓冲区的概念,自然就不会刷新。使用exit函数退出进程前,exit函数会执行用户定义的清理函数、冲刷缓冲,关闭流等操作,然后再终止进程,而_exit函数会直接终止进程,不会做任何收尾工作。

2024-03-02 18:37:09 1214 2

原创 Linux操作系统篇:进程

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系为什么计算机要采用冯诺依曼体系呢?在计算机出现之前有很多人都提出过计算机体系结构,但最终选择冯诺依曼是因为用比较少的钱就可以做出效率不错的计算机截至目前,我们所认识的计算机,都是由一个个的硬件组件组成输入单元:包括键盘鼠标,扫描仪写板等中央处理器(CPU):含有运算器和控制器等输出单元:显示器,打印机等这里的存储器指的是内存不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设。

2024-02-22 22:11:14 2095 3

原创 Linux篇:开发工具yum/vim/gcc/g++/Makefile/gdb

如果我们修改了原文件,历史上曾经还有可执行,那么原文件的最近修改时间,一定要比可执行程序要新!只需要比较,可执行程序的最近修改时间和源文件的最近修改时间:.exe新于.c源文件,不需要重新编译,.exe老于.c源文件,需要重新编译。定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作。」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n。」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直。

2024-02-21 16:24:28 1521 2

原创 Linux篇:Shell命令以及运行原理 和 权限

目录的可执行权限是表示你可否在目录下执行命令。

2024-02-21 10:51:17 1523

原创 Linux篇:指令

bin目录:这个目录包含了一些基本的系统命令和工具,这些命令对于系统的正常运行是必需的。总的来说,/usr/bin目录和/bin目录都存放了常用的可执行文件,但/bin目录中的命令更偏向于系统级别,是系统运行所必需的基本命令,而/usr/bin目录中的命令则更加面向用户,提供了更多的实用工具和应用程序。详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,

2024-02-20 21:43:50 1461

原创 二叉树创建传二级指针和不传二级指针的实现方法和一些问题

来赋值的,*root就是函数外的实参(因为root是实参的地址,*root就是实参),所以A能改变函数外的指针指向新的地址。就是修改形参的内存,这个root和函数外的实参的内存空间不同,所以修改它并不会对实参的内存造成影响,所以必须把它做为返回值返回去,否则函数外就没法获得这个变化的值。形参只是实参的拷贝,形参本身的内存地址和实参的内存地址不同(在不同的函数栈里),所以在函数内修改形参的内存,不能影响函数外的实参。2 因为A要直接修改函数外的root指针,而B不是修改函数外的指针,而是返回一个新指针。

2023-05-02 12:10:38 394 6

原创 C++高精度减法

因为其精度超过基本的数据类型规定的大小,所以常规的计算方法是不可以实现的,这里可以借助STL中的vector容器来实现,vector其实可以认为是一个数组。比如数123456,存储容器的顺序是65431,如果说顺序存储的话按照123456顺序存储的话,两个数相加后位数最高的位满10向前进1,需要移动容器的数据依次向后移动一位,这样会造成不必要的麻烦,所以我们反方向存储。高精度减法指的是大整数的相减,大整数是用基本数据类型无法存储其精度的整数,位数不超过10^6,注意是位数,不是数值的大小。

2023-04-25 18:59:22 881 3

原创 C++高精度加法

因为其精度超过基本的数据类型规定的大小,所以常规的计算方法是不可以实现的,这里可以借助STL中的vector容器来实现,vector其实可以认为是一个数组。比如数123456,存储容器的顺序是65431,如果说顺序存储的话按照123456顺序存储的话,两个数相加后位数最高的位满10向前进1,需要移动容器的数据依次向后移动一位,这样会造成不必要的麻烦,所以我们反方向存储。高精度加法指的是大整数的相加,大整数是用基本数据类型无法存储其精度的整数,位数不超过10^6,注意是位数,不是数值的大小。

2023-04-24 22:29:27 359 8

原创 一个优雅的快排实现方法

总结:所以我们不管用i还是j,为了防止临界问题让x = q[(l + r) / 2]就行了。这里就不能写成如下这种情况,因为可能发生边界问题,比如数组是1,2 ,如果写成这样的话,x不能取到q[r],和上面一样的道理这里我就不再赘述。其实还是有注意事项的,当我们让x = q[l]的时候。

2023-04-18 22:41:14 85 9

原创 WmWare Workstation虚拟机创建centos

第九步:开启虚拟机后,鼠标点击虚拟机屏幕,并使用方向键选择“install CentOS 7”并回车。第十二步:完成之后点击点击安装目标位置,如果没有特殊要求,可以直接点击左上角的完成,即可进行默认分区。注:桌面更适合于新手使用,如果你的水平很高,为追求稳定可以选择最小安装。点击继续之后,会出现如下界面,前几个我们默认,这里点击软件选择。第十步:加载完毕之后,会让我们选择系统语言,这里选择中文。第十六步:重启完成后点击红字,并勾选我同意后点击完成。第五步:为你的虚拟机命名,并选择合适的安装地址。

2023-04-15 22:05:42 1813 10

原创 带头双链表的实现

对于 双向链表 的尾结点,就是哨兵位的 prev ,将其拷贝一份,放在 tail 中,然后将 tail 的 next 链接至新节点 newnode ,然后将 newnode 的 prev 链接到 tail。如果要找到尾结点的前一个节点,那么我只需要通过 哨兵位 的 prev 找到 尾,在通过 尾 的 prev 就可以找到 尾结点的前一个节点。对于头删来说,我需要删除链表的第一个节点,也就是 哨兵位的 next 节点 ,我需要改变 哨兵位 和 第二个节点 的链接关系,然后释放 第一个节点。

2023-04-13 20:07:58 85 3

原创 顺序表的实现

假设现在已经有一个空间了,有一个指针指向空间起始位置,已经存了5个数据,容量为7,现在想存储一个数据,因为顺序表必须顺序存储,所以,想接着存储一个数据,存储到哪呢?未开辟和size = cacpcity 其实都是同一种情况,一般情况下,满了的时候我们都是将容量扩大2倍,2倍是一个适中的倍数,如果说光扩的话,对空间是由消耗的。当size = cacpcity时候,要分情况是否为未开辟过,如果未开辟过,则开辟,如果已经开辟过了,容量变为2倍,这里为什么是2倍,上文已经阐述,在这里不再赘述。可以看到是成功了的。

2023-04-11 21:36:30 156 8

原创 C++文件读取的四种方式

第四种方法:利用ifs内部的get()函数一个个的将字符读出来,遇到EOF时返回False退出while循环,EOF 是 end of file的标志,不太建议使用这个,因为这个很慢,只能一个一个字符读取。局限性:由于“

2023-04-06 23:43:56 27434 2

原创 C++多态实现计算器

如果使用一般的方法写一个计算器,如果以后我想添加开方,开立方根等等的接口,就必须修改源码,修改源码不利于维护,所以我们要用到多态,用动态实现。多态的优点:组织结构清晰,可读性好,方便扩展和维护,并且在开发中,提倡开闭原则,对拓展开放,对修改关闭。普通方法实现一个计算器。

2023-04-04 20:51:47 512 3

原创 C++ 动态多态的底层原理剖析

在每个创建的类内中会有一个结构,当我们为Animal写上virtual时,这个函数就变成了一个虚函数,这个类的内部就发生了变化,多了一个指针,这个指针就是上图中的虚(vfptr,v和f和ptr分别代表什么意思上图有哦)这个指针指向虚函数表(vftable),虚函数表内记录的是虚函数的地址&Animal::speak。上图是我们为Animal类中函数加virtual以后,Animal的大小,大小为4,也证实了类底层内部结构,vfptr是一个虚函数指针指向 vftable 虚函数表,表内存储的是虚函数的地址。

2023-04-03 23:04:56 99 6

原创 对越界访问的思考

【代码】对指针越界访问的思考 (1)

2023-02-23 21:59:19 89 2

原创 对C语言中的NULL理解

0其实就是地址,(void *)只是说我们认为0这个地址中存储的类型是void *,也就是说0这个地址中存储的类型是void的,也就是当前不知道还未指定的.我说的0,你这里写的2本身这个数字就是表示地址,而你的理解是2是值,这个值存在一个变量中,所以想通过&2去取2的地址,这个是错误的。C语言里有很多东西都是这种,规则只是讲了法律,但是实际应用中有很少常用技巧、或者衍生出来的用法,都没有提及,这也是我们的C高级课程中需要补充的。统函数返回的是NULL不是0,那时,你的函数就会出现莫名其妙的错误。

2023-02-23 13:02:21 4639 3

原创 在VMware虚拟机上使用网络测试命令找出虚拟机的IP地址

但是有的计算机第一种方法不行,第二种方法输入vi /etc/sysconfig/network-scripts/ifcfg-ens33 这个后WMware上会出现下面这种情况,不会显示任何东西。vi是Linux内置的文本编辑器命令 打开文件的意思 而且要注意这里的 ens33 是在我这里显示的名字,在别的计算机上可能并不一样,根据实际情况填写最后的 -名字。接着来查看ens33网卡的配置:vi /etc/sysconfig/network-scripts/ifcfg-ens33 注意vi后面加空格。

2023-01-12 10:55:51 15216 7

原创 C语言写电话通讯录

在这里,创建 头文件contact.h 源文件contact.c 源文件text.c 创建三个文件来写而不放在一个文件来写是为了简洁干净,容易让人看的明白。以上是源文件contact.c的内容,因为是对自定义函数的实现,而自定义函数的创建是头文件创建的,所以在文件开头要包含上头文件#include"contact.h"同理,也要包含头文件contact.h,以上是text.c的全部内容。源文件contact.c用来具体阐述自定义函数的实现。名字 + 性别 + 年龄 + 电话 + 地址。

2022-12-30 22:22:20 2064 3

空空如也

空空如也

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

TA关注的人

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