操作系统笔记之内核初始化
内核的初始化内核初始化,就是我们操作系统的内核初始化。那么操作系统初始化需要初始化哪些东西?是按照什么步骤进行的?带着孜孜不倦的态度去探索了…
先来个大概的印象:
从中可以知道初始化的内容包含进程初始化(0、1、2)、中断处理初始化、内存管理初始化、调度管理初始化。
进程初始化首先,OS的目的是为了处理各种进程,但是OS本身也可以看做是一个跟CPU等硬件打交道的进程,因此在操作系统中必须先有一个进程:0号进程。这是OS创建的第一个进程,也是进程列表中的第一个进程。通过指令set_task_end_magic(&init_task)来创建。OS中我们知道创建进程都是通过fork或者kernel_thread产生进程,但这个进程却不是,它也是唯一一个不是的。而进程列表(Process List)可以看做一个管理进程的工具,里面存放着所有的进程。
中断初始化在有了进程之后,我们如果有进程进行了中断或者其他处理,那么就需要进程系统调用,而系统调用也是通过发送中断的方式进行的。这就需要进行中断的初始化,通过函数trap_init()进行初始化,里面设置好了很多中断门。
内存初始化同样 ...
操作系统笔记之CPU的认知
本篇主要介绍CPU的组成以及记录下其中关于寄存器的知识。以x86为例进行说明。
CPU的组成我们知道现在的电脑组成一般包含CPU、内存、USB、硬盘、网卡、显卡、声卡等等,其中CPU和内存较为重要,CPU(Central Processing Unit,中央处理器)是一台电脑的核心,可以视作一个人的大脑,可以说所有设备都是围绕它来展开的(计算机的计算二字全都在CPU里了,你说它核心不核心)。
而这些设备之间的连接血管或者经络是一个叫做总线(Bus)的东西。其连接的逻辑图如下所示:
对于其他的设备而言,内存是相对来说最为重要的。CPU是拥有计算能力的,但是我们在计算的时候需要计算什么数据呢(也就是数据在哪儿)?计算的结果又存放在哪儿呢?由于CPU造价昂贵(各位可以对比下配置电脑的时候CPU和内存条的价格就心中有数了),并且其主要功能是“计算”二字,所以不可能将存储大量数据的功能也放置在CPU中(并不是说CPU中就没有一点儿数据了),这个时候就需要一个跟CPU进行“沟通”并且速度不能太慢的硬件–内存。
CPU是如何计算的?
CPU是负责计算的,那么一定可以想到CPU中是拥有一个计算能 ...
HTTP协议笔记
HTTP协议概念HTTP是一种超文本传输协议,也就是Hyper Text Transfer Protocl。
协议:它是一个在计算机中的协议,它使用计算机能够识别的语言确立了一种计算机之间可以交流(通信)的规范,以及相关的各种控制和错误等处理方式(行为约定、规范)。
传输:从一个点到另一个点。说明HTTP是一个双向协议,并且允许传输过程进行中转(也就是说HTTP传输是不关心中间层经历了什么的,后面可以随意添加TCP层、IP层等都是基于此,甚至SSL/TLS也是基于此特性)。
超文本:这是指HTTP传输的内容为超文本。以前计算机中的文本是指简单的字符,但现在本文已经扩展到图片、视频、压缩包等等,这些在现代的计算机中都被看做文本。而超文本就是超越了普通的文本,是文字、图片、视频等混合体并且拥有超链接,能从一个超文本跳转到另一个超文本。常见的超文本有HTML。
总的来说,HTTP就是计算机中专门在计算机之间传输文字、视频、图片、音频等超文本数据的规范和约定。
状态码HTTP共有五大类状态码,如下图所示:
1XX
1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比 ...
redis笔记
redis的主从复制当存在多台redis服务器的时候,会有一台主服务器master,以及若干台从服务器slaves。一般说,都是master进行写操作,slaves进行读操作。
那么,master与slaves之间是怎么进行数据同步的呢?这就是redis主从复制的由来。
原理通过数据复制,redis一个master可以挂载多个slave,每个slave下面还可以挂载次一级的slave,形成多级嵌套结构。所有的写操作都在master进行,master执行完成后,会将写指令分发给挂在自己下面的slave,slave会进一步分发写指令给自己次一级的slave。
因此多节点保存数据的方式,在任何一个节点异常都不会导致数据的丢失,同时N个slave节点可以提升redis的读能力N倍。这样一个master写slave读的结构能大大提高redis的读写能力。
redis存在一个复制积压缓冲,当master在分发写指令给slave时,同时将写指令复制到积压缓冲去,这样做是防止slave在短时间断开重连时,只要slave的复制位置点仍在积压缓冲中就可以继续在复制位置点之后继续复制,大大提升了复制效率。因 ...
kafka
面试角度看kafka
取材于微信公众号《码哥字节》。
讲一讲分布式消息中间件什么是分布式消息中间件
分布式消息是一种通信机制,与RPC、HTTP、RMI等不一样,消息中间件采用分布式中间代理的方式进行通信。如上图所示,采用了消息中间件之后,上游业务系统发送消息,先存储在消息中间件,让然后右消息中间件将消息分发到对应的业务模块应用(分布式生产者–消费者 模式)。这种异步方式,减少了服务之间的耦合度。
消息中间件的作用在系统架构中引用额外的组件,必然会提高系统的架构复杂度和运维的难度。那么使用分布式消息中间件有什么优势?消息中间件在系统中又起什么作用?
解耦
数据冗余
扩展性
削峰
可恢复性
顺序保证
缓冲
异步通信
消息中间件的使用场景是什么?异步通信,消息存储处理。
消息中间件选型?语言,协议、HA、数据可靠性、性能、事务、生态、简易、推拉模式。
kafka基本概念和架构kafka架构中的一般概念:
Producer:生产者。也就是消息发送的一方。生产者负责创建消息,然后将其发送到kafka。
Consumer:消费者。也就是接收消 ...
tcp_ip八股文
UDPudp协议属于传输层协议。
udp报文协议
16位源端口号
16位目的端口号
16位UDP长度
16为UDP校验和
数据内容
数据内容
0 15 16 31
源端口:065535,11024为保留端口,为标准的服务端口
UDP长度:header + data 总长度
UDP校验和:伪头部、头部、data 三部分的校验和
数据内容:上层应用的数据,可以没有数据
若校验和失败,就会丢弃数据
UDP协议的特点
无链接
只需知道对端的IP和PORT就可以发送数据,不需要建立链接
不可靠
没有确认机制,没有重传机制。若因为网络原因没有发送到对端,UDP协议层也不会返回任何错误给应用层。
面向数据报
应用层交给UDP多长的报文,UDP就 ...
go_GC原理
Mark & SweepCarbage Collection现代高级编程语言管理内存的方式分为两种:自动和手动,像 C、C++ 等编程语言使用手动管理内存的方式,工程师编写代码过程中需要主动申请或者释放内存;而 PHP、Java 和 Go 等语言使用自动的内存管理系统,有内存分配器和垃圾收集器来代为分配和回收内存,其中垃圾收集器就是我们常说的 GC。主流的垃圾回收算法:
引用计数
追踪式垃圾回收
Go 现在用的三色标记法就属于追踪式垃圾回收算法的一种。
Mark & SweepSTW
stop the world, GC 的一些阶段需要停止所有的 mutator 以确定当前的引用关系。这便是很多人对 GC 担心的来源,这也是 GC 算法优化的重点。
Root
根对象是 mutator 不需要通过其他对象就可以直接访问到的对象。比如全局对象,栈对象中的数据等。通过Root 对象,可以追踪到其他存活的对象。
Mark Sweep 两个阶段:**标记(Mark)**和 **清除(Sweep)**两个阶段,所以也叫 Mark-Sweep 垃圾回收算法。
下面 ...
Goroutine原理
Goroutine定义“Goroutine 是一个与其他 goroutines 并行运行在同一地址空间的 Go 函数或方法。一个运行的程序由一个或更多个 goroutine 组成。它与线程、协程、进程等不同。它是一个 goroutine” —— Rob Pike
Goroutines 在同一个用户地址空间里并行独立执行 functions,channels 则用于 goroutines 间的通信和同步访问控制。
goroutine 与thread有何区别
内存占用,创建一个 goroutine 的栈内存消耗为 2 KB(Linux AMD64 Go v1.4后),运行过程中,如果栈空间不够用,会自动进行扩缩容。 创建一个 thread 为了尽量避免极端情况下操作系统线程栈的溢出,默认会为其分配一个较大的栈内存( 1 - 8 MB 栈内存,线程标准 POSIX Thread),而且还需要一个被称为 “guard page” 的区域用于和其他 thread 的栈空间进行隔离。而栈内存空间一旦创建和初始化完成之后其大小就不能再有变化,这决定了在某些特殊场景下系统线程栈还是有溢出的风险。
...
go内存分配原理
堆栈与逃逸分析堆栈定义Go 有两个地方可以分配内存:一个全局堆空间用来动态分配内存,另一个是每个 goroutine 都有的自身栈空间。
栈 栈区的内存一般由编译器自动进行分配和释放,其中存储着函数的入参以及局部变量,这些参数会随着函数的创建而创建,函数的返回而销毁。(通过 CPU push & release)。 A function has direct access to the memory inside its frame, through the frame pointer, but access to memory outside its frame requires indirect access.
堆堆区的内存一般由编译器和工程师自己共同进行管理分配,交给 Runtime GC 来释放。堆上分配必须找到一块足够大的内存来存放新的变量数据。后续释放时,垃圾回收器扫描堆空间寻找不再被使用的对象。 Anytime a value is shared outside the scope of a function’s stack frame, it wil ...