自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LAB 信号量实现细节

2022-08-01 23:23:11 990 1

原创 Linux CFS调度 记录

dl_sched_class deadline调度器 SCHED_DEADLINErt_sched_class 实时调度器 SCHED_FIFO、SCHED_RRfair_sched_class 完全公平调度器 SCHED_NORMAL、SCHED_BATCHidle_sched

2022-07-03 21:42:56 775

原创 C语言 pivot_root的Invalid argument错误解决方案

解决PivotRoot系统调用失败

2022-06-23 11:12:43 1808

原创 优质奶牛 差分数组实现多次修改数组

[编程题]优质奶牛时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 64M,其他语言128M牛牛管理这一片牧场,在这片牧场中,一共有 头奶牛,为方便统计,它们排成了一排,编号为 1~n 。现在质检员牛妹在检测这些奶牛的质量,她列出了 条特性,只有满足所有特性的奶牛才可称之为优质奶牛。但是,牛牛现在只知道对于某条特性,某几段连续区间内的奶牛是满足条件的,如果这样依次排查,会浪费很多时间。由于牛妹时间很急,马上要赶往下一个牧场,所以,牛牛请你帮助他筛选优质奶牛。输入描述: 本

2022-03-22 11:11:43 741

原创 实验5-信号量的实现和应用

(先新建sem.c)中实现如下系统调用函数sem_t *sys_sem_open(const char *name, unsigned int value);int sys_sem_wait(sem_t *sem);int sys_sem_post(sem_t *sem);int sys_sem_unlink(const char *name);挂载虚拟机,在(~/oslab/hdc/usr/include/linux)中创建sem.h,定义数据类型sem_t:#ifndef _SEM_H_

2022-02-23 15:51:28 1062

原创 实验4-进程轨迹跟踪

目录一、linux下的调度算法二、基于模板 process.c 编写多进程的样本程序三、在 Linux0.11 上实现进程运行轨迹的跟踪与统计四.一些步骤五、修改时间片大小分析一、linux下的调度算法下面是 0.11 的调度函数 schedule,在文件 kernel/sched.c 中定义为:while (1) { c = -1; next = 0; i = NR_TASKS; p = &task[NR_TASKS];// 找到 counter 值最大的就绪态进程 wh

2022-02-21 22:03:54 667

原创 试验2 系统调用

添加系统调用并测试的步骤:foo()在unistd.h添加"#define _NR _XXX"(宏定义)在sys_system.s中修改系统调用个数+1在sys.h中添加系统调用的引用(1.写一个extern int foo()2.在数组中写入系统调用sys_foo,即函数名称)在kernal目录下编写foo.c去实现foo()函数修改kernal目录下的Makefile编译树,使得foo系统调用被添加到编译树中(在编译的时候得以和其他的文件链接)在hdc/

2022-02-20 21:24:09 486

原创 实例解析:跟踪地址翻译过程 从逻辑地址到线性地址再到物理地址

发现网上好像没人说这个问题,自己学习的时候总结了一下,适合有linux基础同学进阶加深理解流程程序放到内存中1、程序分成代码段,数据段,堆,栈,内存映射区域2、从内存中找到一段空闲,得到基地址,段载入到空闲中,将基地址写入到PCB当中3、执行过程中,每取出一条指令,进行重定位,地址翻译概念LDT 叫局部描述符表,是与 GDT 全局描述符表相对应的,内核态的代码用 GDT 里的数据段和代码段,而用户进程的代码用每个用户进程自己的 LDT 里得数据段和代码段。分段PCB里放的应该是一堆基址

2022-01-26 14:39:44 892

原创 Linux内存映射实现

1、内存管理架构图分为用户空间,内核空间,硬件三个层面:方便用户——段——虚拟内存方便操作系统——页——物理内存1、用户空间应用程序malloc()申请内存,free()释放内存(是内存分配器ptmalloc提供的接口),内存分配器ptmalloc使用系统调用brk()或者mmap()向内核以页为单位申请内存,然后划分成小内存块分配给程序2、内核空间虚拟内存管理,负责把用户地址映射成虚拟地址,从进程的虚拟地址空间分配虚拟页sys_brk()用来扩大缩小堆,sys_mmap()用来内存映

2022-01-19 11:32:56 2185

原创 内核级线程Linux实现

内核在创建进程的时候,在创建 task_struct 的同时,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu 堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间运行时,cpu 堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。...

2022-01-07 15:42:39 1884

原创 HTTP缓存和浏览器缓存

1、http缓存的分类:根据是否需要重新向服务器发起请求来分类,可分为(强制缓存,协商缓存)根据是否可以被单个或者多个用户使用来分类,可分为(私有缓存,共享缓存)强制缓存如果生效,不需要再和服务器发生交互,而协商缓存不管是否生效,都需要与服务端发生交互。下面是强制缓存和协商缓存的一些对比:1.1、强制缓存强制缓存在缓存数据未失效的情况下(即Cache-Control的max-age没有过期),那么就会直接使用浏览器的缓存数据,不会再向服务器发送任何请求。优点:强制缓存生效时,http状态码为

2021-08-17 11:18:43 532

原创 HTTPS要点解析

HTTP问题HTTP是明文传输,中间人偷看中间人篡改解决偷看问题:对称加密两个人的秘钥是相同的加密和解密同用一个密钥的方式称为共享密钥加密(Common key crypto system) , 也被叫做对称密钥加密对称加密问题密钥泄漏以共享密钥方式加密时必须将密钥也发给对方。如果通信被监听那么密钥就可会落入攻击者之手, 同时也就失去了加密的意义密钥数量过多每一台客户端都需要不同的密钥,服务器上存储太多的密钥非对称加密使用一对非对称的密钥。 一把叫做私有密钥(priva

2021-08-14 11:18:50 111

原创 HTTP抓包分析——结合Firefox浏览器原理

前提输入CSDN网站进行分析打开F12分析可见,HTML文档解析时间只需要5.72秒完全加载则需要10.81秒说个题外话,chrome比firefox快好多…概念:DOMContentLoaded当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架的完成加载。loadload 仅用于检测一个完全加载的页面,页面的html、css、js、图片等资源都已经加载完之后才会触发 load 事件。html加载其

2021-08-11 15:53:02 1648

原创 TCP核心知识点

1、TCP粘包,拆包及解决方法产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区(流量窗口),例如1024个字节大小。原因:窗口大,数据少如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题;窗口小,数据多如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包,也就是将一个大的包拆分为多个小包进行发送。TCP 是一个面向字节流的协议,它是性质是流式的,所以它

2021-08-11 11:10:31 826

原创 HTTP请求的完全过程

输入URL发生了什么HTTP请求的完全过程1.1 浏览器根据域名解析IP地址浏览器根据访问的域名找到其IP地址。DNS查找过程如下:1、浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。2、路由器缓存:如果系统缓存也没有

2021-08-11 11:04:37 172

原创 TCP/IP协议 阅读小结(二)

UDP 数据报:进程的每个输出操作都正好对应一个UDP数据报,并组装成一个待发送的IP数据报不管应用层给UDP多大的数据,不嫌你大,总是会在数据前面封装UDP的头部,然后交给IP,再加上一个IP头部~~所以,就用到IP分片的内容。换句话说,UDP是制造IP分片的主要协议TCP 字节流:应用层交给TCP的数据,TCP会选择适当的大小,会有一个最大传输单元MSS,如果TCP觉得数据小了,会把好几个数据组装成为大的数据,加上TCP头部发走,如果大了,分片发走换句话说,应用层传输下来的数据跟实际传输的I

2021-08-07 16:13:39 146

原创 TCP/IP协议 阅读小结(一)

分层应用程序是用户进程,应用层关心应用程序的细节下三层一般在内核执行,下三层处理通讯细节在图中,可以划分出端系统(两边的两台主机)和中间系统(中间的路由器)应用层和运输层使用端到端协议。只有端系统需要这两层协议。网络层提供的却是逐跳协议,两个端系统和每个中间系统都要使用它。不同层的协议这是重点学习目标,接下来本系列博文所有内容围绕这几个内容展开封装(发送方)以太网数据帧的物理特性是其长度必须在46~1500字节之间每一层的首部都有nbit的位,描述了上一层将采取什么类型的

2021-08-06 11:07:59 181

原创 实验6-地址映射与共享 进程间通信

目录:基于共享内存的生产者-消费者程序:共享内存结构体`shmget()`函数`shmat()`函数1、物理页面——>线性地址空间2、进程数据段空间的分布3、实现最后基于共享内存的生产者-消费者程序:进行本次实验需要先完成实验5:信号量的实现和应用不用文件做缓冲区,而是使用共享内存不将生产者和消费者放置同一个文件pc.c,而是生产者producer.c,消费者consumer.c,两个程序都是单进程的,通过信号量和共享缓冲区进行进程间的通信。Linux下,可以通过shmget()和sh

2021-08-03 16:45:16 2643

原创 lab6:地址映射与共享

实验目的:深入理解操作系统的段、页式内存管理,深入理解段表、页表、逻辑地址、线性地址、物理地址等概念。实验段、页式内存管理的地址映射过程。编程实现段、页式内存管理上的内存共享,从而深入理解操作系统的内存管理。实验内容:用Bochs调试工具跟踪Linux 0.11的地址翻译(地址映射)过程,了解IA-32(Intel Architecture 32-bit)的CPU架构下的地址翻译和Linux 0.11的内存管理机制。实验过程:步骤:1.准备工作1.1编写test.c程序(如上),并

2021-07-31 18:16:52 911

原创 基于内核栈切换的进程切换

实验目的深入理解进程和进程切换的概念;综合应用进程、CPU管理、PCB、LDT、内核栈、内核态等知识解决实际问题;开始建立系统认识。实验内容本次实验包括如下内容:编写汇编程序switch_to:完成主体框架;在主体框架下依次完成PCB切换、内核栈切换、LDT切换等;修改fork(),由于是基于内核栈的切换,所以进程需要创建出能完成内核栈切换的样子。修改PCB,即task_struct结构,增加相应的内容域,同时处理由于修改了task_struct所造成的影响。用修改后的Linux

2021-07-28 15:33:55 1177

原创 用户级线程、核心级线程剖析

用户级线程举栗子先显示文本,再显示图像不适用线程,要等到所有资源(文本,图像)下载完成,才能显示,一开始全部空白,交互性差使用线程,线程1下载完之后,切到线程2显示文本,再切到线程3处理图片,然后切到线程4显示图片Yield切换函数Yield()是用户编写的函数,用来切换用户级线程每一个线程需要一个栈需要借助TCB,TCB是全局的数据结构切换的时候,在TCB找到栈的指针esp,然后放到esp寄存器,完成切换esp是CPU里的寄存器而且,需要每次在 } 处弹栈,所以jmp指令应该去

2021-07-26 11:28:49 313

原创 系统调用linux0.11源码详细剖析

总流程:实现系统调用在 Linux 0.11 上添加两个系统调用(1)iam()第一个系统调用是 iam(),其原型为:int iam(const char * name);完成的功能是将字符串参数 name 的内容拷贝到内核中保存下来。要求 name 的长度不能超过 23 个字符。返回值是拷贝的字符数。如果 name 的字符个数超过了 23,则返回 “-1”,并置 errno 为 EINVAL。在 kernal/who.c 中实现此系统调用。1、应用程序如何调用系统调用调用系统调

2021-07-26 11:28:30 1253

原创 索引案例思考

索引列顺序问题索引列顺序意味着按照最左列进行排序所以,索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的ORDER BY GROUP BY DISTINCT。通常,“将选择性最高的列放到索引最前列”索引的选择性——不重复的索引值(也称为基数cardinality)和数据表记录(n)总数的比值:1/n到1之间。选择性越高,可以过滤更多行数据,效率越高。不考虑排序和分组时,这时候的索引只是用于优化where条件的查找。案例在线约会网站,用户信息有很多列,包括国家,地区,城市,性别等等

2021-04-28 20:38:52 146

原创 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。

计算:所以我们要按照1M的上限来计算,假设每个单词都为16个字节,那么1M的内存可以处理多少个单词呢?1M = 1024 KB = 1024 * 1024 B 。然后1M / 16B = 2^16个单词1G大概有多少个单词呢? 有2^26个单词但是实际中远远不止这些,因为我们是按照最大单词长度算的。我们需要把这1G的单词分批处理,根据上面的计算,可以分成大于2^10个文件。索性就分成2000个文件吧,怎么分呢,不能随便分,不能简单的按照单词的顺序然后模2000划分,因为这样有可能相同的单词被划分

2021-04-28 19:06:59 1761

原创 B+树索引的使用

通过索引取得表中少量数据时,建立索引才有意义在OLAP应用中,都需要访问表中大量的数据,根据这些数据来产生查询的结果,这些查询多是面向分析的查询,目的是为决策者提供支持。如这个月每个用户的消费情况,销售额同比、环比增长的情况。因此在OLAP中索引的添加根据的应该是宏观的信息,而不是微观,因为最终要得到的结果是提供给决策者的。例如不需要在OLAP中对姓名字段进行索引,因为很少需要对单个用户进行查询但是对于OLAP中的复杂查询,要涉及多张表之间的联接操作,因此索引的添加依然是有意义的。但是,如果联接

2021-04-28 15:09:25 176

原创 InnoDB聚集索引和辅助索引

数据库的索引类似书的目录,我们通过标题以及对应的页码可以快速找到标题对应的内容。在数据库中,根据索引快速定位记录的结构,从磁盘读取数据。InnoDB存储引擎有聚集索引和辅助索引,是索引组织表,按照主键的顺序存储数据。聚集索引:按照每张表的主键构建一棵B+树,叶节点中存放表的整行数据,叶节点成为数据页,每个数据页之间通过一个双向链表进行连接。数据页存放每行的所有记录,非数据页(非叶节点)存放键值和指向数据页的偏移量。一张表只能有一个聚集索引(因为只有一个主键PRIMARY KEY)(1)..

2021-04-28 13:23:30 897

原创 数据库 数据类型的优化

选择优化的数据类型更小数据类型的更好简单数据类型尽量避免NULL特别在列上建索引的时候。当可可为NULL的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里会导致固定大小的索引变成可变带下的索引。用0,某特殊值,“”替代使用尽可能短的列Created with Raphaël 2.2.0确定合适的大类型选择具体类型结束整数类型学会使用UNSIGNED属性,正数上限扩大一倍实数类型不精确类型,DOUBLE,CPU支持原生浮点运算,计算更快精确类型,DECIMAL,例如财务

2021-04-23 13:48:15 104

原创 redis字符串底层解析

采用简单动态字符串SDS1、SDS的定义struct sdshdr{ //记录buf数组已使用字节的数量 int len; //记录buf数组未使用字节的数量 int free; //保存的数组 char buf[]}2、SDS与C字符串的区别1 O(1)复杂度获取字符串长度2 杜绝缓冲区buf溢出3 减少修改字符串长度时所需的内存分配次数4 二进制安全5 兼容部分c字符串函数3、空间分配策略3.1、空间预分配当需要对SDS进行空间拓展的时候,不仅会对SDS分配空间

2021-04-21 14:57:23 62

原创 HashMap的底层分析

存储结构-字段这里需要讲明白两个问题:数据底层具体存储的是什么?这样的存储方式有什么优点呢?在理解Hash和扩容流程之前,我们得先了解下HashMap的几个字段。从HashMap的默认构造函数源码可知,构造函数就是对下面几个字段进行初始化,源码如下: int threshold; // 所能容纳的key-value对极限 final float loadFactor; // 负载因子 int modCount; // 用于迭代的快速失

2021-04-19 11:07:36 355

原创 ArrayList与Vector以及LinkedList源码分析比较

1.ArrayList类定义ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长,默认容量大小为10成员变量 //默认初始容量 private static final int DEFAULT_CAPACITY = 10; //指定初始容量为0时,返回该空数组 private static final Object[] EMPTY_ELEMENTDATA = {}; //不指定初始容量时,返回该空数组。 pri

2021-04-09 19:55:28 84

原创 == 与 equals,hashCode 与 equals

= = : 它的作⽤是判断两个对象的地址是不是相等。即,判断两个对象是不是同⼀个对象基本数据类型= =⽐较的是值引⽤数据类型= =⽐较的是内存地址equals() : 它的作⽤也是判断两个对象是否相等。但它⼀般有两种使⽤情况:情况 1:类没有覆盖 equals() ⽅法。则通过 equals() ⽐较该类的两个对象时,等价于通过“==”⽐较这两个对象。情况 2:类覆盖了 equals() ⽅法。⼀般,我们都覆盖 equals() ⽅法来⽐较两个对象的内容是否相等;若它们的内容相等,则返

2021-04-09 15:54:52 169

原创 String、StringBuffer和StringBuilder源码解析

1.String1.1成员变量 /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0String类中常用的两个成员变量value、hash。value:字符类型的数组,用来存放我们所保存的字符串,每一个字符串都会被拆开

2021-04-09 14:45:04 149

原创 SpringBoot 中常用注解@PathVaribale/@RequestParam/@RequestBody/@ResponseBody详解介绍

其中,各注解的作用为:@PathVaribale 获取url中的数据url的格式为:localhost:8080/eduservice/id@RequestParam 获取请求参数的值url的格式为:localhost:8080/eduservice?id=100@PathVaribale 获取url中的数据看一个例子,如果我们需要获取Url=localhost:8001/eduservice/id中的id值,实现代码如下://逻辑删除讲师的方法//id值需要通过路径来传递@ApiOp

2021-01-05 14:09:54 761

原创 springboot前端映射注解介绍

1、@Controller@Controller 用来响应页面,表示当前的类为控制器。2、@RestController@RestController 是@ResponseBody和@Controller的结合表明当前类是控制器且返回的是一组数据,不是页面3、@Autowired这个注解的作用是将其他的类,接口注入,类似于之前的类的初始化等,用这个注解,类中或接口的方法就可以直接调用了。4、@RequestMapping当前台界面调用Controller处理数据时候告诉控制器怎

2021-01-05 13:38:40 819

原创 线上教育项目-讲师模块

一、编写后台管理api接口1.编写controller代码@Api(description="讲师管理") //swagger测试更加清晰@RestController//访问地址 http://localhost:8001/eduService/edu-teacher/findAll@RequestMapping("/eduService/edu-teacher")public class EduTeacherController { //注入service @Auto

2020-12-29 22:57:13 335

原创 线上教育项目-基础搭建

viewobjectvo一、创建父工程1、创建sprigboot工程online_edu配置:groupId:com.shennanartifactId:online_edu一直下一步到完成2、删除 src 目录因为我们在父项目下还需要创建maven子项目3、配置 pom.xml修改版本为 :2.2.1.RELEASE 节点后面添加 pom类型<artifactId>guli-parent</artifactId><packaging>p

2020-12-29 22:34:19 469

原创 mybatis-plus具体应用

编写代码1、实体@TableId主键策略@TableFieldt添加注解,自动填充/更新@TableLogic逻辑删除@Version版本号@Datapublic class User { //设置主键策略 @TableId(value = "id", type = IdType.AUTO) private Long id; private String name; private Integer age; private String emai

2020-12-28 23:55:21 273 1

原创 mybatis-plus使用、以及springboot项目出初始创建

mybatis-plus使用:快速开始参考:一、创建并初始化数据库创建数据库,创建数据表,添加数据二、初始化工程创建springboot工程三、添加依赖1.引入依赖在pom.xml中:spring-boot-starter、spring-boot-starter-test添加:mybatis-plus-boot-starter、MySQL、lombok、 <!--mybatis-plus--> <dependency> <group

2020-12-28 23:22:23 201

原创 MySQL查询优化

驱动表,被驱动表第一个t1是驱动表,t2是被驱动表首先得先了解左右连接,以及内连接解释的概念。内连接一下三种写法都是内连接:mysql> select * from t1 join t2 on t1.a = t2.a;mysql> select * from t1 inner join t2 on t1.a = t2.a;mysql> select * from t1 cross join t2 on t1.a = t2.a;左连接,右连接左连接:mysql&gt

2020-12-17 20:18:22 104

原创 MySQL InnoDB中的事务隔离级别和锁的关系

事务中的加锁方式1、事务的四种隔离级别隔离级别脏读(Dirty Read)不可重复读(NonRepeatable Read)幻读(Phantom Read)未提交读(Read uncommitted)可能可能可能已提交读(Read committed)不可能可能可能可重复读(Repeatable read)不可能不可能可能串行化(Serializable )不可能不可能不可能1.读未提交事务1还没提交,事务2就能读到事务1修改的内

2020-12-15 20:42:23 478

空空如也

空空如也

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

TA关注的人

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