- 博客(24)
- 收藏
- 关注
原创 函数调用的过程以及栈中的状态
过程(函数)调用时的栈(运行时栈)运行时栈每个进程都有自己的栈空间,x86-64的栈向低地址方向增长,而栈栈指针%rsp指向栈顶元素。可以使用pushq和popq(汇编指令)将数据存入栈中或是从栈中取出,将栈指针减小一个适当的量可以为没有指定初始值的数据在站上分配空间。类似地,可以通过增加栈指针来释放空间。当x86-64过程需要的存储空间超出寄存器能够存放的大小时,就会在栈上分配空间。这个部分称为过程的栈帧(stack fram)。为了提供空间和时间效率,x86-64过程只分配自己所需要的的栈帧部分
2020-07-21 17:15:23 910
原创 系统调用原理及详细过程
系统调用原理及详细过程为什么要有系统调用?由于系统的有限资源可能被多个不同的应用程序访问,因此,如果不加以保护,那么用程序难免产生冲突。所以,现代操作系统都将可能产生冲突的系统资源给保护起来,阻止应用程序直接访问。这些系统资源包括文件、网络、IO、各种设备等。为了让应用程序有能力访问系统资源,也为了让应用程序能够借助操作系统做一些必须由操作系统支持的行为。每个操作系统都会提供一套接口,以供应用程序使用。这些接口往往通过中断来实现。系统调用与运行库(标准库)系统调用的弊端使用不便。操作系统提供的
2020-07-09 21:24:23 15965 3
原创 Mysql事务的四大隔离级别及实现方式
Mysql的四大隔离界别及实现方式Mysql的事务本文主要讲解Mysql的四大隔离级别,因此,简略阐述Mysql的事务。Mysql的InnoDB引擎是支持事务的,之所以支持事务是因为Innodb通过提供redo log ,undo log等日志和锁机制等实现了事务的原子性,一致性,隔离性,持久性,具体实现原理可参见Mysql事务的ACID及其实现针对事务的隔离性,sql标准将分为不同的隔离级别。四大隔离级别Mysql的四大隔离级分别为读未提交(Read Uncommited):该隔离级别下事务
2020-09-04 17:13:10 1319
原创 从TCP首部来看TCP协议
从TCP首部来看TCP协议本篇文章从TCP首部的内容发散出TCP协议涉及到的各个细节,可以更好的理解TCP协议TCP首部首先展示TCP首部的具体结构和各个字段源端口和目的端口每个T C P包都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个T C P连接。也就是说,包含客户端IP地址、客户端端口号、服务器 IP地址和服务器端口号的四元组唯一确定一个TCP连接。序列号序号用来标识从TCP发端向TCP收端发送的数据字节
2020-08-25 17:37:25 552
原创 Mysql中的锁机制
全局锁、表级锁、行锁全局锁:对整个数据库实例加锁。Flush tables with read lock(FTWRL), 让整个库处于只读状态典型使用场景:做全库逻辑备份,就是把每个表select出来存成文本如果所有表都使用事务引擎,还可以使用 mysqldump-single-transaction,导数据之前会启动一个事务(隔离级别是可重复写),拿到一致性视图,这样就可以备份而数据又可以正常更新表级锁:一种是表锁、一种是元数据锁(meta data lock,MDL)• 表锁: ○
2020-08-03 11:16:59 259
原创 Mysql事务的ACID及其实现
原子性、一致性、隔离性、持久性ACID:(Atomicity、Consistency、Isolation、Durability)原子性:事务中的操作要么全部成功,要么全部失败实现原理:InnoDB通过undo log(回滚日志)实现事务的回滚操作。当事务对数据库进行修改的时候,InnoDB会生成undo log,记录逻辑日志,当发生回退时,InnoDB会根据undo log的内容做与之相反的操作。持久性:事务一旦提交,它对数据库的改变应该是永久的。实现原理:InnoDB通过redo log保证事
2020-08-03 10:44:25 277
原创 Linux中的分段
Linux中的分段什么是段?有内核数段,内核代码段,用户数据段,用户代码段等,可以帮助理解。三种地址首先要区分一下三种不同的地址:逻辑地址:包含在机器语言指令中用来用来指定一个操作数或一条指令的地址。每个逻辑地址由一个段和段偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。线性地址:是一个32位无符号整数,可以用来表示高达4GB的地址。物理地址:用于内存芯片级的内存单元寻址,与从微处理器的地址引脚发送到内存总线的电信号相对应。段描述符和GDT、LDT 程序员都应该知道我们
2020-08-02 17:29:56 574
原创 linux中的PCB(进程控制块) :task_struct(进程描述符)
linux中的进程控制块task_struct进程就是处于执行期的程序,线程是进程中的活动的对象。每个线程都拥有一个独立的程序计数器(PC)、栈、和一组寄存器。内核调用的对象是线程而不是进程。在Linux中,线程的实现非常独特,从内核的角度讲,linux并没有线程的概念。Linux把所有的线程都单过进程来实现,内核没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程,每个线程都拥有自己的task_struct。进程和线程都是通过系统调用clone(
2020-08-02 15:15:07 1198 3
原创 将vmdk作为硬盘挂载到另一个linux系统的虚拟机上
将vmdk作为硬盘挂载到另一个linux系统的虚拟机上当我们在耍linux操作系统的时候,一般是在虚拟机上耍,但是刷着刷着,会把系统耍崩,但是系统里面又存了一些写好的代码还没来得及保存,而系统已经打不开了……那怎么办呢?一种方法是将虚拟机的vmdk文件作为硬盘挂载到另一个linux系统的虚拟机上。如何操作呢?我们拿VMware的虚拟机来举例添加硬盘首先找到坏掉了的系统的vmdk文件,文件路径可以通过虚拟机设置里面查看,如图所示,我的是C:\software\VMware\VMware Machin
2020-07-29 21:16:22 5817 3
原创 下半部之软中断和tasklet
中断处理及下半部由中断和异常的区别可知,中断处理程序以一部方式执行,并且他有可能会打断其他重要代码(甚至包括其他中断处理程序)的执行。因此为了避免被打断的代码停止时间过长,中断处理程序应该执行得越快越好。中断处理程序不再进程上下文中运行,所以他们不能阻塞,所以他们有很高的的实现要求。操作系统个必须有一个快速、异步、简单的机制负责对硬件做出迅速响应并完成那些时间要求很请严格的操作。因此,整个中断处理流程被分成了两个部分:第一个部分是中断处理程序,内核通过对他的异步执行完成对硬件中断的即时响应。第二部分是
2020-07-16 16:27:58 333
原创 中断和异常都是中断!
中断和异常很多时候,我们会在很多地方看到“中断”和“异常”两个概念,他们到底是指什么呢?他们之间有什么区别吗?“中断”和“异常”都是中断!中断(interrupt)通常被定义为一个事件,它可以让处理器停止当前的工作转而运行中断处理的相关程序。在物理上,中断其实就是CPU芯片内外部硬件电路产生的电信号。中断通常分为同步中断和异步中断:同步中断是cpu执行指令出现问题时由CPU控制单元产生的,因为是cpu内部产生的,所以也被称为内中断。之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断
2020-07-15 21:31:23 1025 1
原创 萃取
Traits 编程技法(萃取)不论是泛型思维还是STL的实际运用,迭代器都扮演着重要的角色。迭代器是一种行为类似指针的对象,在算法中运用迭代器时,很可能会用到其相关类型。其中的相关类型就包括迭代器所指的对象的类型。假设算法中有必要声明一个变量,其类型就是迭代器所指的对象的类型,但是输入参数却只有迭代器改怎么办?c++并没有支持typeof()!我们假设现在要实现一个算法func,其出入参数为迭代器void func(Iter iter){ //如果我们需要一个iter指向的类型的变量, //该
2020-06-22 21:12:07 128
原创 局部变量和全局变量,静态局部变量和静态全局变量,全局函数和静态函数
全局变量全局变量默认初始化为0,字符型变量为空字符’’定义在函数外,可被本文件及其他文件的函数使用(外部链接),其他文件使用时序用extern声明生命周期和程序运行周期一样不同文件的全局变量不可以重名局部变量如果没有赋初值,内容为随机如果定义在符合语句内,只在复合语句中有效同一文件中全局变量和局部变量可以同名,在局部变量作用域内,全局变量不起作用静态全局变量静态...
2020-04-03 13:38:33 524
原创 c++编译器会提供哪些默认构造函数?
1. 默认情况下,c++编译器至少为我们写的类增加3个函数:- 默认构造函数(无参,函数体为空)- 默认析构函数(无参,函数体为空)- 默认拷贝构造函数,对类中非静态成员属性进行简单的值拷贝2. 如果用户定义了拷贝构造函数,c++不会提供任何默认构造函数3. 如果用户定义了普通构造函数(非拷贝),c++不再提供默认无参构造,但是会提供默认拷贝构造...
2020-03-30 14:29:57 579
原创 c++操作符重载总结笔记
不能重载的运算符: . :: ?: sizeof前置++与后置++前置++ Object& operator++(){ a++; return *this; }后置++- Object operator++(int){ Object temp(*this); this->a++; return temp; }...
2020-03-30 14:17:35 106
原创 extern "C"的作用以及为什么要使用extern "C"
1. 实现c++代码能够调用其他c语言代码,加上extern "C"后,这部分代码编译器以c语言的方式进行编译和链接,而不是按c++方式2. 原因:c和c++对同一个函数经过编译后生成的函数名是不同的,由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函...
2020-03-30 14:09:07 1151
原创 c++之指向类成员的指针
1. 指向成员变量的指针 - 定义格式 § 数据类型 类名::*指针名 § 例如 int A::*pParam; - 赋值/初始化 § 数据类型 类名::*指针名 = &类名::非静态数据成员 § int A::*pParam = &A::param - 解引用 § <类对象名>.*<非静态数据成员指针> § <类对象指...
2020-03-30 14:05:52 237
原创 重载overload, 覆盖重写override,隐藏overwrite
1. 重载overload - 实现函数重载的条件: § 同一个作用域 § 参数个数不同 § 参数类型不同 § 参数顺序不同 § const也可以作为重载条件 - 返回值不作为函数重载的依据 - 函数重载和默认参数一起使用,需要额外注意二义性问题的产生 2. 覆盖重写override - 派生类函数覆盖重写基类虚函数: - 规则如下: § 不同的作用域(分别位...
2020-03-30 13:56:59 265
原创 TCP笔记之拥塞控制
TCP笔记之拥塞控制慢开始拥塞避免快重传快恢复拥塞控制示意图TCP的拥塞控制是为了防止过多的数据注入网络,使得网络中的路由器或者链路过载。TCP拥塞控制的四种算法分别为慢开始,拥塞避免,快重传,快恢复。慢开始TCP连接双方都维护了一个拥塞窗口和一个慢开始门限值,当tcp双方建立连接时,将拥塞窗口大小设置为1个数据段(1MSS)(Maximum Segment Size),随后包的每一次往返(...
2020-03-27 21:59:39 845
原创 条件变量的使用方法(笔记)
条件变量相关函数初始化一个条件变量#include <pthread.h>int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);常量初始化pthread_cond_t cond = PTHREAD_COND_INITIA...
2020-03-21 15:00:39 1150
原创 STL笔记之resize()和reserve()的区别
void resize(size_type n, value_type val = value_type());- 如果n<当前容器的size,则将元素减少到前n个,移除多余的元素(并销毁)- 如果n>当前容器的size,则在容器中追加元素,如果val指定了,则追加的元素为val的拷贝,否则,默认初始化- 如果n>当前容器容量,内存会自动重新分配void reserve...
2020-03-14 15:06:46 150
原创 内存分区(笔记)
内存分区内存分为四区:栈区,堆区,全局区或静态区,代码区代码区 - 存放CPU执行的机器指令,通常代码区是可共享的。代码区通常是制度的,程序运行期间不可修改 - 只读 - 程序在加载到内存前,代码区和全局区(包括data段和bss段)的大小就是固定的,程序运行期间不可改变全局区或静态区全局区或静态区可分为数据区和未初始化数据区数据区(data段) - 包含了程序中明确被初始化...
2020-03-12 17:33:48 130
原创 c++类的成员变量应该在哪里初始化?初始化列表,构造函数,类外还是类中?(笔记)
c++类的成员变量的初始化普通成员变量,在初始化列表中或者构造函数中初始化,不能在定义时初始化静态成员变量,必须在类外初始化引用变量必须在初始化列表中进行初始化const变量必须在初始化列表中进行初始化static const变量必须在类中定义时初始化...
2020-03-12 17:01:05 833
原创 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
ERROR 2002 (HY000):Can’t connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock’解决方案(Ubuntu)当mysql不能登录的时候使用以下方法解决:1. 在终端查看mysql相关进程号ps -u mysql(登录不上的时候可能会有多个与mysql相关的进程)2. 查看进程...
2019-11-20 09:44:30 4869 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人