自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高级IO模型

它们都会在读取失败时立刻返回, 而且。

2025-04-03 20:57:55 893

原创 网路传输层UDP/TCP

MSL的定义是: 一个TCP段在网络中从源到目的地的最长。

2025-03-27 15:03:39 609

原创 网络之数据链路层

TCP/IP提供了一种能力, 将数据可靠的从 B 跨网络送到 C 主机, 这期间是由无数次局域网转发构成的, 比如 主机B 到 路由器F 就是一次局域网通信的问题, 而就是研究也就是说,是进行数据的处理,如TCP是为了保证,是解决的问题, 研究出主机 B 为了和主机 C 通信该的问题.而解决了。

2025-03-26 16:52:42 801

原创 网络层之IP协议

综上, 我们可以看到TCP和IP在格式上有点像, 都采用了固定格式的头部(20字节) + 可选选项 +数据部分.此外,都有"源和目的"字段都包含“首部长度”和“校验”字段都属于TCP/IP 协议族,宗旨都是为了保证网络的核心能力, 把数据可靠地从A主机发送到B主机.理解IP报文在系统中向下交付当报文从传输层向下交付给网络层时, 发送了两步关键操作:1. 移动data指针添加ip报头,

2025-03-22 21:29:20 976

原创 网络应用层之HTTPS

加密就是把明文(要传输的信息)进行一系列变换, 生成密文. 解密就是把密文再进行一系列变换, 还原成明文. 在这个加密和解密的过程中, 往往需要一个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为密钥.数据摘要=数字指纹, 其基本原理是利用单向散列函数(Hash函数)对信息进行运算, 生成⼀串固定长度的数字摘要.常见的Hash算法有: MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限, 因此可能会有碰撞(两个不同的信息, 算出的摘要相同, 但是概率非常低)

2025-02-25 09:35:51 708

原创 网络应用层之HTTP

实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。

2025-02-23 15:14:13 1182

原创 网络应用层之协议和序列化反序列化

协议是一种约定, 但实质是客户和服务器双方通信的主机之间约定好的结构化的字段在之前普通的TCP和UDP网络通信中, 读写数据的时候都是按照"字符串"的形式发送和接收的, 那我们如果不发送字符串, 而是要传送一些结构化的数据怎么办呢?比如说, 我们观察QQ或微信的聊天窗口, 屏幕上的信息包括头像(url), 时间, 昵称, 消息等.用户发送的消息虽然大部分是字符串,但是经过用户层(QQ或微信软件)处理后,还需要增加头像,时间,昵称等信息。

2025-02-17 22:14:19 530

原创 Linux之Socket编程(二)

TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多.

2025-01-23 18:32:19 1133

原创 Linux之socket编程(一)

头文件:sys/types.h、sys/socket.h功能:创建套接字, 而且在创建的时候需要指定使用的通信协议.int domain是地址族, 上面说过是套接字编程的通信类型. 最常用的是AF_INET, 表示使用IPv4的网络套接字进行网络通信.int type可指定通信语义, 比如是面向字节流还是面向用户数据报.SOCK_STREAM是面向字节, SOCK_DGRAM是面向用户数据报, 对应了TCP和UDP协议.

2024-12-04 21:48:00 692

原创 Linux之网络基础

协议本质是一种约定. 人与人之间可以通过提前约定好的协议来通信, 在计算机中也是一样, 比如说client 和 server 进行通信.提前先约定好,其中 client 给server发送一个整形数字, 每个整形数字代表的操作不同. 发送1,代表注册;2代表登录;3代表访问数据...不同的层的协议不同, 总的来说, 计算机之间的协议就是提前约定好数据的格式, 数据的各个部分都代表什么意思, 通信时直接根据协议的约定来解释即可. (具体的协议后面再说)IP地址是在IP协议中, 用来表示。

2024-11-23 22:37:46 1214

原创 Linux之日志

在编写网络服务器, 各种软件时, 程序一定要打印一些日志信息.1. 可以向显示器打印, 也可以向中写入.2. 日志是软件在运行时记录的流水账, 用于排查服务进程挂掉的信息.日志等级可以根据需要设置, 暂时先设置5个:我们的日志输出方式可以分为3类: 显示器打印, 不分类写入一个文件, 根据日志等级分类写入不同文件可以利用mkdir接口创建目录:LogMessage函数就是为了将日志的内容根据日志的 style 输出.

2024-11-21 11:36:18 1065

原创 Linux之信号量

IPC中介绍过信号量, 为了让进程间通信, 从而多个执行流看到同一份公共资源, 对于造成数据不一致问题, 就需要把公共资源保护起来, 从而就需要同步与互斥.信号量共有1. 本质是一把用于描述临界资源资源的数目的2每一个执行流想访问公共资源内的某一份资源,不应该让执行流直接访问,而是其实就是先对信号量计数器进行P操作. 本质上, 只要P成功. 完成了对资源的预订机制.3. 信号量也是公共资源, 为了保证自身安全,

2024-11-04 22:02:57 758

原创 Linux之线程同步和生产者消费者模型

现在假设有一家只买泡面的超市, 超市只有一个展架. 超市有多个品牌的泡面供应商(生产者), 也有不同口味偏好的消费者用来进行执行流之间的数据传递(通信)的2个角色分别是生产者(1或n)和消费者(1或n)-->线程或进程;1个交易场所是超市-->内存空间还记得之前自习室里提到的饥饿问题吗?由于我的竞争能力很强,可以反复地去抢占自习室却不做什么事情, 管理者修改了相应的规则.在生产者消费者模型中也是存在这样的饥饿问题的, 具体体现在3个关系中的: "生产者与消费者之间的关系是互斥和同步的",

2024-10-31 11:09:04 832

原创 算法之栈(stack)

栈本身不是一个很难的数据结构, 但是对应的算法题有一定难度, 难在我们是否能想到这道题用栈解决. 如果知道用栈解决这道题, 那其实本质就是模拟.这题和题目1几乎一样, 用栈模拟即可.

2024-10-21 19:47:46 580

原创 算法之哈希表

要, 因为我们是从前向后遍历, gap = j - i 的值会随 j 的增大而增大, 所以如果本次gap > k, 随着 j 增大gap会越来越大, 不可能符合要求. 所以要覆盖掉原来的 i , 这样使之后gap的值变得更小, 更容易满足要求.第一种是从 i=0 开始, j = [i+1 , nums.size()-1] 依次遍历剩下的元素查找是否有和为target的元素.的时候,整数的范围在 [1~10^x], x在[3,7] , 但是出现负数就不推荐使用数组, 因为需要加一个偏移量, 比较麻烦.

2024-10-11 21:27:02 888

原创 算法之链表

比如插入双向链表的操作:这样做是正确的, 但是我们要时刻注意链表的代码顺序, 防止链表断开, 增加代码难度此时我们只需要多定义一个变量next,就能避免陷入繁琐的顺序思考:上面四句代码随意顺序运行都可以插入链表。

2024-10-10 11:52:21 1014 1

原创 算法之分治

分治法所能解决的问题一般具有以下几个特征:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以为若干个,即该问题具有最优子结构性质3) 利用该问题分解出的可以该4) 该问题所分解出的各个子问题是的, 即子问题之间第一条特征是绝大多数问题都可以满足的, 因为问题的计算复杂性一般是随着问题规模的增加而增加.第二条特征是应用分治法的前提它也是大多数问题可以满足的, 此特征反映了递归思想的应用.

2024-06-11 09:38:22 815

原创 Linux之线程互斥

试着用线程控制力介绍的一些系统调用, 将线程的创建、执行和等待等都封装起来. 我们在程序中指定一个函数Print, 让多个线程不断地执行该函数. myThread.hpptest.cc 创建一个线程: 创建多个线程: 首先模拟一段多线程抢票的例子观察现象: 运行之后会发现不合理的现象, 票出现了非正值初步解释原子性: 比如--操作就不是原子操作, 这条语句其实对应三条汇编指令: 在这三条汇编语句的执行过程中, 都有可能会因为线程切换而中断, 假如线程A对a要执行++操作, 刚执行完inc指

2024-06-04 10:02:03 1008

原创 Linux之线程控制

库为了能够快速的找到每一个线程, 所以提供了一个。

2024-05-30 20:39:11 1076

原创 Linux之线程概念

线程是的一种执行流/线程是在的一种执行流.是CPU调度的是承担系统资源的基本实体.首先我们需要明确:除了文件、通信等操作, 一个进程它要访问的大部分的代码和资源都是要通过进程地址空间+页表的方式去找到资源, 所以解释概念:1. 线程是的一种执行流线程是的一种执行流 ,呢?从资源占用的角度分析, 一个进程要被创建, 要完成一系列的初始化工作,, 分配和初始化内存地址空间, 把程序代码和相关数据从磁盘加载到物理内存中, 初始化文件描述符表, 设置进程调度信息插入调度队列等等一系列工作, 这样看来。

2024-05-30 11:21:09 1179

原创 Linux之信号

sigaction头文件: signal.h功能:注册更改信号自定义处理方式。signum 表示信号的编号,act 是输入型参数, 用来保存属性的结构体,其中sa_handler是保存自定义处理函数的函数指针(和signal函数的handler一样),sa_mask 是需要额外屏蔽的信号, 下面主要讨论这个参数sa_sigaction是处理实时信号的, 不考虑sa_flags字段包含一些选项,本章的代码都把sa_flags设为0sa_restorer也不考虑。

2024-05-14 19:56:59 1120

原创 Linux之命令行参数与环境变量

此时PATH设置为了空,上面说过可以重新登陆新建一个bash进程重新读取PATH变量, 这个时候, 我们再来。

2024-05-02 19:34:07 1123 1

原创 Linux之进程间通信(二)

共享内存的同步方式,

2024-04-28 19:09:36 688

原创 数据结构之并查集

首先需要明确, 并查集是一个在一些应用问题中, 需要将n个不同的元素划分成一些开始时,自成, 然后按一定的规律将归于. 在此过程中要反复用到的运算. 适合于描述这类问题的抽象数据类型称为有10个人来自不同的学校, 起先都是的, 现给这些学生进行编号:{0, 1, 2, 3,4, 5, 6, 7, 8, 9};给以下数组用来存储该小集体, 数组中的代表: 该小集体中具有。

2024-04-17 16:33:06 743 1

原创 Linux之进程间通信(一)

操作系统的特点之一以实现多任务并发处理.既然进程具有独立性, 那一定会让二者产生联系, 那又何谈独立性呢?进程的独立性是指的, 但. 进程与进程间是需要信息交互与状态传递等的通信. 比如说, 父进程等待子进程查看子进程状态, 在子进程完成任务时回收子进程信息, 而且有些程序的运行也需要才能完成。比如说这个指令:cat file | grep 'hello'

2024-04-14 16:15:57 885 2

原创 汇编语言(第4版)(王爽)第一章

仅为个人汇编语言(第4版)(王爽)的读书记录, 部分添加了一点点个人理解

2024-04-08 22:18:37 902

原创 算法之模拟

从前往后遍历crokaOFFrogs字符串, 如果遇到 'c' 说明有一个青蛙开始叫, 如果遇到 'r' 只需去查找前面的字符串中是否有 'c', 所以可以用哈希表来存储字符出现的次数, 也就是青蛙的个数, 遍历到 'r' 的时候, c字符出现个数>=1, 说明有青蛙可以叫出来'r', hash['c']--, hash['r']++, 代表有一个青蛙叫到 'r', 其它字符也是同理. 叫到'k'说明青蛙叫完了.2. 如果字符串遍历结束k之前的字符有>=1的情况, 说明有青蛙没叫完, 返回-1。

2024-04-04 10:11:28 713 1

原创 Linux之动静态库

静态库是指程序在编译链接的时候把库的代码链接到可执行文件中, 程序运行的时候将不再需要静态库, 这个被链接的库就是静态库, 在Linux下静态库的后缀名一般为.a, Windows下为.lib动态库与之相反, 程序在运行的时候才去链接动态库的代码, 多个程序共享使用库的代码.一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表, 而不是外部函数所在目标文件的整个机器码, 在Linux下动态库一般后缀名为“.so”,Windows下为.dll。

2024-03-27 18:11:12 1197

原创 Linux之文件系统与软硬链接

操作系统需要通过软件的方式对底层的硬件差异化进行屏蔽, 这种动作就叫做逻辑抽象.

2024-03-23 20:52:00 1143

原创 Linux之缓冲区与C库IO函数简单模拟

不管是什么语言Java, python, C, C++等, 它们的IO函数。

2024-03-20 16:42:42 923

原创 Linux之文件管理与重定向

最开始说到过, 一个进程是可以打开的并且可以对这些文件做出不同的操作, 也就是说加载到内存中的文件可能存在多个.当我们在程序里面打开多个文件时, 操作系统肯定是得对这些文件进行管理的, 而管理的本质就是, 管理的方法就是, 所以操作系统为了管理被打开的文件就会创建内核数据结构来描述这些文件, 在操作系统中这个结构体就叫做。

2024-03-20 15:49:47 927

原创 算法之位运算

得到的结果就是最终加法的结果:

2024-03-19 20:33:25 755

原创 算法之前缀和

可以把矩阵 i*j 沿 i 和 j 分为四块, 分别标记为A,B,C,D, 因为这样划分A+B 和 A+C 的面积可以分别用dp[i-1][j]和dp[i][j-1]表示, 而D的面积就是arr[i][j], 所以dp[i][j] = A+B + A+C + D - A = dp[i-1][j] + dp[i][j-1] + dp[i-1][j] + arr[i][j] - dp[i-1][j-1], 而区间[l,r]的和就是dp[r] - dp[l-1], 直接取出数据即可。

2024-03-17 09:47:00 919

原创 算法之二分查找算法

1. 首先说明二分查找算法是比较恶心, 细节很多, 很容易写出死循环的算法, 但熟悉了之后是最简单的算法.2. 其次我们可能听说过二分查找的前提是数组有序的前提下进行, 但其实不一定.二分查找算法的关键是"" , 当我们发现一个规律, 根据这个规律能把这个数组分为两部分, 根据规律能有选择性的舍去一部分, 进而能在另一个部分继续查找, 可以看到这其中并没有提到数组是否有序, 关键在于数组是否有此外, 我们对于选择区间划分点mid的位置也并。

2024-03-12 20:05:26 1076

原创 算法之滑动窗口

▪ 我们既然已经找到从 left1 开始的最优的区间, 那么就可以⼤胆舍去left1,但是如果继续像⽅法⼀⼀样,重新开始统计第⼆个元素(left2)往后的和, 势必会有⼤量重复的计算(因为我们在求第⼀段区间的时候, 已经算出很多元素的和了, 这些和是可以在计算下次区间和的时候⽤上的).right不需要再回退到left重新来算一遍sum了, 抛开right对应的值, 此时窗口内的和肯定比上一个窗口小, 所以当前窗口以left为起点的子窗口的sum肯定更小, 所以right在上次的位置待着即可.

2024-03-11 15:22:41 1080

原创 C++之特殊类设计

设计模式(Design Patter)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结.为什么会产生设计模式呢?就像人类历史发展会产生兵法. 最开始部落之间打仗时都是人拼人的对砍, 后来春秋战国时期, 七国之间经常打仗, 就发现打仗也是有套路的,, 来孙子就总结出了《孙子兵法》.设计模式也是类似.为了代码可重用性、让代码更容易被他人理解、保证代码可靠性. 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络, 如同大厦的结构一样.

2024-03-08 20:29:47 825

原创 C++之类型转换

在C语言中, 如果, 或者, 或者不一致时, 就需要发生类型转化, C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换1. 隐式类型转化是, 意义相近的类型之间的转换, 编译器在编译阶段自动进行, 能转就转, 不能转就编译失败,2. 显式类型转化是的类型, 需要用户自己处理.转换的可视性比较差, 所有的转换形式都是以一种相同形式书写, 难以跟踪错误的转换。

2024-03-06 21:53:30 943

原创 C++之智能指针

前面我们知道使用异常可能会导致部分资源没有被正常释放, 因为异常抛出之后会直接跳转到捕获异常的地方从而跳过了一些很重要的的代码, 比如说下面的情况:无异常抛出正常内存释放: 有异常抛出, 内存泄漏: 为了解决这个问题就可以异常重新抛出, 在func函数里面添加捕获异常的代码, 然后在catch里面对资源进行释放最后重新将异常进行抛出, 最后交给main函数中的catch进行处理, 比如说下面的代码: 无论除零是否有异常都会正常释放资源: 但是这么写就完成正确了吗? 肯定没有, 因为new本

2024-03-05 10:20:42 1187

原创 C++之异常处理

实际中都会自定义自己的异常体系进行规范的异常管理, 因为一个项目中如果大家随意抛异常, 那么外层的调用者就没办法处理了, 所以实际中都会定义一套继承的规范体系.这样大家抛出的都是继承的派生类对象, 捕获一个基类就可以了如果每个小组分别负责数据库模块, 缓存模块, 业务模块, 每个小组都会抛出异常, 但是每个小组抛出的异常类型又不同, 如果一起在main函数里面进行捕捉的话就会非常的多并且非常的复杂, 并且每个小组所抛出的异常都有着自己的模块的属性, 所以使用一个类来解决这里的异常就不现实.

2023-12-09 19:00:41 1298

原创 C++11(下)

总体而言emplace的效率并没有比push_back高多少, 但是有一种场景提升比较明显, 对于浅拷贝而且是对象很大的类有效果, 因为浅拷贝push_back不存在移动构造(不存在资源转换), 就是构造+拷贝构造, 而emplace是直接构造, 直接构造肯定比构造+拷贝构造效率高, 所以emplace对于深拷贝的类效果不是很明显, 因为移动构造的成本就是转移资源, 成本很低;对于浅拷贝的类有一定的提升.

2023-12-07 20:44:47 1242

空空如也

空空如也

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

TA关注的人

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