Stephan14 Blog

享受编程,信仰技术

分支预测

浅谈分支预测、流水线与条件转移

一个问题 在StackOverflow上有这么一个问题 Why is processing a sorted array faster than an unsorted array?。例子中,对一个数组进行条件求和,在排序前和排序后,性能有很大的差别。原始的例子是C++和Java的,这里将其换成了C# : static void Main(string[] args) { // G...

存储模型

程序运行的相关技术

存在的问题 如何把多个进程的地址空间映射到物理地址空间中,合理分配使用内存 地址重定位 进程中的地址不是进程的最终物理地址,因为其在运行之前没有被加载到物理内存中,所以不能确定其最终的物理地址。因此需要地址重定位将进程中的地址空间中的逻辑地址转化成运行时可以直接寻址的物理地址。 静态重定位 当程序加载到内存中时,一次行实现逻辑地址到物理地址的转换,这样在执行过程中可以直接去内存中寻址...

管程

原理与使用方法

背景 使用信号量中的P、V操作编程的要求比较高,容易出现死锁等问题。从而在程序设计语言中引入管程的成分,降低使用成本,称其为一种高级的同步机制。 定义 由共享的资源的数据结构以及其上操作的一组过程组成,进程只能通过调用管程中的过程来间接的访问管程中的数据结构。 特点 互斥:只有一个进程调用管程,其他的进程就不可以进入,以保证管程中数据结构的完整性,通常管程的互斥是由编译...

互斥解决方案

硬件和软件方法

介绍 互斥是指进程之间的竞争关系 临界区的使用原则 没有进程在临界区时,想进入临界区的进程可以进入 不允许两个进程同时处于临街区 临界区外运行的进程不得阻塞其他进程进入临界区 不得使进程无限期等待进入临界区 解决方案 软件解决方案 Dekker解法 Peterson解法 硬件方案 屏蔽中断 TSL指令 几种软件解决方法 第一种 当...

C++反射机制

可变参数模板实现C++反射

概要 本文描述一个通过C++可变参数模板实现C++反射机制的方法。该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能。Nebula框架在Github的仓库地址。 C++11的新特性–可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。关于可变参数模板...

实现varint和zigzag转换器

RPC服务中流量的极致优化

背景 在RPC服务中,消息传递的大部分中使用的整数都是很小的非负整数,但是一个整数一般都占用4个字节,这样会导致很占用资源。所以就发明了一个变长整型类型varint,这样当时数值非常小的时候,就可以只使用1个字节,稍微大一点的时候就使用2个字节,再大一点就使用3个字节,还可以使用超过4个字节来表示整型数字。 原理 其原理就是将数字的二进制形式以7个比特位为一组进行拆分,每7个比特位和一个...

CPU调度

CPU调度算法、调度时机、调度过程

CPU调度 什么是CPU调度 按照一定的调度算法,从就绪队列中选择一个进程,把CPU的控制权交给被选中的进程。如果就绪 队列中没有就绪进程,系统会安排一个空闲进程或者idle进程上CPU执行。 CPU调度要解决的问题 进程调度的原则 进程调度的时机 进程调度的过程 调度的时机 进程正常终止或者因错误而终止 进程创建或者等待进程变成就绪态 进程从运行态变...

线程

线程引入以及线程相关实现

线程的引入 应用的需要 一个软件中同时工作多个任务,例如一个字处理软件需要同时需要编辑、排版、保存等线程同时工作 开销的考虑 创建和撤销线程时间开销比较小 两个线程切换花费的时间比较少 线程之间的通信不需要内核介入 性能考虑 多处理器可以提高性能 线程 线程是进程的一个运行实体,是CPU的调度单位,称为轻量级进程 属性 有唯一标识符 有状态和状态转换 ...

进程

进程相关的数据结构

进程的概念 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,进程是系统资源分配和调度的独立单位,又被称为任务 进程特点 程序的一次执行过程 正在运行的抽象程序 将一个CPU变成多个虚拟的CPU 每个进程有独立的地址空间 将CPU控制权调度给进程 进程控制块(PCB) 操作系统用于管理进程的数据结构,主要包括进程的各种属性和进程的动态变化,是操作系统感知...

系统调用

X86系统调用

系统调用、库函数、API、内核函数 系统调用、库函数、API、内核函数的关系图如下: 应用程序可以直接调系统调用,但是通常情况下,应用程序都是通过C函数库或者是API的接口来间接地调用系统调用,在操作系统内核当中,提供了很多的内核函数,这些内核函数通过封装实际上把它提供到了C函数库或者是 API接口,所以系统调用对于内核而言,内核函数就是这个系统调用的处理程序,这些处理程序通过封装在C函...