- 博客(60)
- 收藏
- 关注
原创 操作系统真象还原第十五章
15.1 fork 的原理与实现15.1.1 什么是 forkfork 函数原型是 pid_t fork(void),返回值是数字,该数字有可能是子进程的 pid,有可能是 0,也有可能是 -1。15.1.2 fork 的实现fork 要分两步,先复制进程资源,再跳进去执行。进程的资源:进程的 pcb,即 task_struct程序体,即代码段数据段等用户栈内核栈,进入内核态时,需要保存上下文环境虚拟地址池,每个进程拥有独立的内存空间,其虚拟地址是用虚拟地址池来管理的页表,让进程拥
2021-02-16 21:07:14 505 1
原创 操作系统真象还原第十四章
14.1 文件系统概念简介14.1.1 inode、间接块索引表、文件控制块 FCB 简介块是文件系统的读写单位,文件至少要占据一个块。在 Windows 中,快被称为簇,有 4KB、32KB 等。块大小是扇区大小的整数倍。FAT 文件系统将文件所有的块用链式结构来组织。优点是有效地利用了存储空间,缺点是当访问文件中的某个块时,必须要从头开始遍历块结点。由于效率低,微软后来退出 NTFS 文件系统。UNIX 文件系统使用 inode 索引结构来组织文件。采用索引结构的文件系统,文件中的快依然可以分
2021-02-10 11:56:14 292
原创 操作系统真象还原第十三章
13.1 磁盘及分区表13.1.2 创建磁盘分区表文件系统是运行在操作系统中的软件模块,是操作系统提供的一套管理磁盘文件读写的方法和数据组织、存储形式。文件系统的管理对象是文件,管辖范围是分区,因此它建立在分区的基础上,每个分区都可以有不同的文件系统。分区是逻辑上划分磁盘空间的方式,归根结底是人为地将硬盘上的柱面扇区划分成不同的分组,每个分组都是单独的分区。各分区都有“描述符”来描述分区本身所在硬盘上的起止界限等信息,在硬盘的 MBR 中1有个 64 字节“固定大小”的数据结构,这就是著名的分区表
2021-01-16 17:37:32 414
原创 操作系统真象还原第十二章
12.1 Linux 系统调用浅析系统调用就是让用户进程申请操作系统的帮助,让操作系统帮其完成某项工作,相当于用户进程调用了操作系统的功能。Linux 系统调用是用中断门来实现的,只占用一个中断向量号 0x80。在系统调用之前,Linux 在寄存器 eax 中写入子功能号,中断处理例程会根据 eax 的值来判断用户进程申请哪种系统调用。12.2 系统调用的实现12.2.1 系统调用实现框架一个系统功能调用分为两部分,一部分是暴露给用户进程的接口函数,它属于用户空间,此部分只是用户进程使用系统调用的
2021-01-10 21:58:03 238
原创 操作系统真象还原第十一章
11.1 为什么要有任务状态段 TSS11.1.1 多任务的起源TSS 是 Task State Segment 的缩写,即任务状态段。硬件厂商提供的多任务硬件解决方案主要是 LDT 和 TSS。11.1.3 TSS 的作用Intel 的建议是给每个任务关联一个任务状态段,这就是 TSS,用它来表示任务。TSS 是由程序员“提供”的,由 CPU 来维护。CPU 中有一个专门存储 TSS 信息的寄存器,这就是 TR 寄存器,它始终指向当前正在运行的任务。TSS 和其它段一样,本质上是一片存储数
2020-12-24 22:53:24 402
原创 操作系统真象还原第十章
10.1 同步机制–锁10.1.1 排查 GP 异常,理解原子操作线程调度工作的核心内容就是线程的上下文保护+上下文恢复。10.1.2 找出代码中的临界区、互斥、竞争条件公共资源:可以是公共内存、公共文件、公共硬件等,总之是被所有任务共享的一套资源临界区:访问公共资源的指令代码互斥:某一时刻公共资源只能被 1 个任务独享竞争条件:多个任务以非互斥的方式同时进入临界区关中断是实现互斥最简单的方法。10.1.3 信号量同步一般是指合作单位之间为协作完成某项工作而共同遵
2020-12-06 23:41:00 319 1
原创 操作系统真象还原第九章
9.1 实现内核线程9.1.1 执行流多任务操作系统采用了一种称为多道程序设计的方式,使处理器在所有任务之间来回切换。任务调度器是操作系统中用于把任务轮流调度上处理器运行的一个软件模块。调度器在内核中维护一个任务表(也称进程表、线程表或调度表),然后按照一定的算法,从任务表中选择一个任务,然后把该任务放到处理器上运行,当任务运行的时间片到期后,再从任务表中找另外一个任务放到处理器上运行。执行流是独立的,它的独立性体现在每个执行流都有自己的栈、一套自己的寄存器映像和内存资源。9.1.2 线程到底是
2020-11-30 22:09:45 295
原创 操作系统真象还原第八章
8.1 makefile 简介8.1.1 makefile 是什么make 命令可以自动找出变更的文件,并根据依赖关系,找出受变更文件影响的其它相关文件,然后对这些文件按照规则进行单独处理。makefile 文件是 make 程序的搭档,它们发现某个文件更新后,只编译该文件和受该文件影响的相关文件,其它不受影响的文件不重新编译,从而提高了编译效率。8.1.4 伪目标make 规定,当规则中不存在依赖文件时,这个目标文件名就称为伪目标。为了避免伪目标和真实目标文件同名的情况,可以用关键字“.PHO
2020-11-15 19:42:24 282
原创 操作系统真象还原第七章
7.1 中断是什么,为什么要有中断在 Linux 中文件 “/proc/进程pid/stat” 第一行的第 39 个字段是 “processor id”,它表示进程本次执行时最后所在的 CPU 编号。还可以用命令 ps -eo pid, args, psr | grep <pid>。7.2 操作系统是中断驱动的7.3 中断分类把中断按事件来源分类,来自 CPU 外部的中断就称为外部中断,来自 CPU 内部的中断称为内部中断。外部中断按是否导致宕机来划分,可分为可屏蔽中断和不可屏蔽中断两
2020-11-10 00:34:26 468
原创 操作系统真象还原第六章
6.1 函数调用约定简介C 语言遵循的调用约定是 cdecl:调用者将所有参数从右到左入栈调用者清理参数所占的栈空间6.2 汇编语言和 C 语言混合编程6.2.1 浅析 C 库函数与系统调用汇编语言和 C 语言混合编程可分为两大类:单独的汇编代码文件与单独的 C 语言文件分别编译成目标文件后,一起链接成可执行程序在 C 语言中嵌入汇编代码,直接编译生成可执行程序系统调用是 Linux 内核提供的一套子程序。系统调用的入口只有一个,即 0x80 号中断,子功能号在寄存器 eax
2020-11-01 22:56:36 502 1
原创 操作系统真象还原第五章
5.1 获取物理内存容量5.1.1 学习 Linux 获取内存的方法Linux 2.6 内核中用 detect_memory 函数获取内存容量,其本质上是通过调用 BIOS 中断 0x15 实现的,分别是 BIOS 中断 0x15 的 3 个子功能,子功能号要放在寄存器 EAX 或 AX 中:EAX = 0xE820:遍历主机上全部内存AX = 0xE801:分别检测低 15MB 和 16MB ~ 4GB 的内存,最大支持 4GBAH = 0x88:最多检测出 64MB 内存,实际内存容量超过此
2020-10-19 00:39:33 1218
原创 操作系统真象还原第四章
4.1 保护模式概述保护模式在 Intel 80286 CPU 中首次出现。4.1.1 为什么要有保护模式实模式的缺陷:实模式下操作系统和用户程序属于同一特权级逻辑地址等于物理地址用户程序可以自由修改段基址,访问所有内存访问超过 64KB 的内存区域时要切换段基址一次只能运行一个程序,无法充分利用计算机资源共 20 条地址线,最大可用内存为 1MB保护模式下,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)需要被转化为物理地址后再去访问。地址转换由处理器和操作系统共同协作
2020-10-08 22:41:07 1111 1
原创 操作系统真象还原第三章
3.1 地址、section、vstart 浅尝辄止3.1.1 什么是地址地址描述各种符号在源程序中的位置,是源代码中各符号偏移文件开头的距离。编译器的工作就是给各符号编址。3.1.2 什么是 section编译器提供的关键字 section 只是为了让程序员在逻辑上将程序划分成几个部分。3.1.3 什么是 vstartsection 用 vstart= 来修饰后,可以被赋予一个虚拟起始地址。mbr 用 vstart=0x7c00 来修饰的原因,是开发人员知道 mbr 要被加载器(BIOS)
2020-09-27 00:48:13 807
原创 操作系统真象还原第二章
2.1 计算机的启动过程载入内存:程序被加载器(软件或硬件)加载到内存某个区域CPU 的 cs:ip 寄存器被指向这个程序的起始地址按下主机上的 power 键后,第一个运行的软件是 BIOS。2.2 软件接力第一棒,BIOS2.2.1 实模式下的 1MB 内存布局Intel 8086 有 20 条地址线,故其可以访问 1MB 的内存空间。实模式下的内存布局:起始结束大小用途FFFF0FFFFF16BBIOS 入口地址,此处内容是jmp f000:e05b
2020-09-20 00:56:58 512
原创 操作系统真象还原第1.5章 NASM汇编学习
第二章有使用 NASM 汇编写主引导记录 MBR 的内容。在写第二章的代码前,每天晚上下班后花一些时间简单地回顾了 NASM 汇编的内容,只复习了最简单的语法,之后写 OS 时再边写边查资料。指令mov数据传送指令。mov eax, 1 ; eax = 1mov ebx, 2 ; ebx = 2mov ecx, eax ; ecx = eaxadd加法指令。add eax, 2 ; eax = eax + 2add ebx, eax ; ebx = ebx + e
2020-09-18 00:11:22 425
原创 操作系统真象还原第一章
开一个新坑,最终目标是按照《操作系统真象还原》这本书实现一个操作系统。在读每一章的过程中都会按照书中的步骤配环境、写代码、做实验,完成每章后都产出一篇博客。写博客的主要目的是鞭策自己不能半途而废,毕竟操作系统确实很复杂,研究生期间尝试过,后来放弃了,这一次要坚持下来。次要目的是记录写操作系统的过程中遇到的一些问题,以及有意义的知识点。开发环境如下:虚拟机:VMware Workstation 15 Player操作系统:Ubuntu 14.04.6 LTS终端软件:MobaXterm编辑器:
2020-09-13 23:57:31 1314
原创 Go语言接入腾讯云存储COS
最近做项目需要用到云存储来保存用户的头像图片,刚好看到腾讯云的COS(云对象存储)有六个月50G空间的免费额度,于是选用了腾讯云,稍微折腾一番后成功使用Go语言接入到COS。在折腾的过程中,发现此类博客较少,其中很多都是从官方文档抄过来的长篇大论。所以最后还是看官方文档去了。相信很多人在查资料的过程中,想要的只是一份开箱即用的代码,能够上传和下载文件即可(比如我自己:)。于是,我决定不要长篇大论,在博客开头先贴上代码~~~:package mainimport ( "context" "fm
2020-08-26 19:39:44 2352 1
原创 RPC框架源码阅读笔记
前言为了掌握 rpc 框架的基本原理,阅读了一个简单的 rpc 框架的源码(co) 。消息协议使用 json 。coco 这份代码是一个 C++ 基础库,开源在 github 上两个多月,获得了 1.3k star,说明这份代码的质量还是比较高的,有一定的学习价值。co 包含了一个基于 json 的 rpc 框架,相关实现在 base/rpc.h 和 base/rpc.cc,另外,还有一...
2020-01-20 21:03:25 528
原创 将VIM配置为IDE
前言我们在服务器上做开发时,可以选择使用字符界面或者GUI界面。由于远程GUI界面比较吃资源,因此其流畅度和本地操作系统的GUI界面相差甚远,使用体验往往不尽人意。因此,一般首选字符界面做开发,VIM 编辑器是字符界面下的一款神器。VIM 编辑器在配置好各种插件后,可以媲美 Windows 下功能强大的 IDE 而又不显得臃肿。本文的配置非常方便快捷,Ubuntu 下只需通过 apt 安...
2020-01-09 20:46:54 1524 1
原创 数据库事务并发问题和四种隔离级别
结论三种事务并发问题:脏读:一个事务读取到了另外一个事务没有提交的数据不可重复读:在同一事务中,两次读取同一数据,得到内容不同幻读:在同一事务中,用同样的操作读取两次,得到的记录数不同四种隔离级别:读未提交:存在脏读读提交:防止脏读重复读:防止脏读和不可重复读序列化:防止脏读、不可重复读和幻读通俗解释待续…...
2019-08-15 12:02:23 370
原创 libevent核心原理
Libevent 是一个轻量级的高性能网络库,事件驱动,基于 Reactor 模式。对 Libevent 源码的阅读可围绕事件管理展开:Libevent 对三类事件源进行了统一,用 event 结构体表示,每个 event 实例表示一个事件。同时监听多个事件(比如监听多个 socket 上的可读事件),必然会有多个 event 实例,对这些 event 实例进行管理需要特定的数据结构,Li...
2019-07-12 17:47:12 2001
原创 libevent中的信号管理
一、前言Libevent(1.4.13 版本)的源码中,event_base 结构体中的成员 sig 用于管理信号事件,sig 的变量类型为 struct evsignal_info。二、相关结构体struct evsignal_info 定义在 evsignal.h 头文件中,如下:typedef void (*ev_sighandler_t)(int);struct evsigna...
2019-06-14 15:50:08 397
原创 libevent中的尾队列
一、前言在 libevent 源码中,包括 注册事件队列(eventqueue) 和 激活事件队列(activequeues) 在内的很多地方都用到了 尾队列 这种数据结构。而 尾队列 的实现有点复杂,因此写一篇博客分析一下~二、相关结构体2.1 Entry结构体libevent 中尾队列的 Entry(即尾队列元素) 结构体定义如下:#define TAILQ_ENTRY(type) ...
2019-06-11 22:10:53 647 1
原创 收集的C++后台实习生面试题
目录腾讯三次握手和四次挥手过程,握手为什么不是两次TCP和UDP的区别UDP能不能实现可靠连接流量控制进程和线程的区别进程间通信方式守护进程堆和栈的区别STL有没有用过,vector怎么实现map怎么实现红黑树有什么特性常见排序算法有哪些,时间复杂度快排的思路讲一下给大量qq号(亿为单位)排序数组里搜索第k大的数非递归二分查找链表相加select、poll...
2019-04-29 16:28:19 790
原创 PyTorch学习笔记之常用工具
在训练神经网络的过程中最重要的工具是数据可视化GPU加速在PyTorch中,数据加载可通过自定义的数据集对象实现。数据集对象被抽象为Dataset类,实现自定义的数据集需要继承Dataset,并实现两个Python魔法方法__getitem__:返回一条数据或一个样本。obj[index]等价于obj.__getitem__(index)__len__:返回样本的数量。len(o...
2019-04-28 01:03:18 181
原创 PyTorch学习笔记之神经网络
torch.nn是专门为神经网络设计的模块化接口。nn构建于Autograd之上,可用来定义和运行神经网络。nn.Module是nn中最重要的类,可以把它看做一个网络的封装,包含网络各层定义及forward方法,forward方法可返回前向传播的结果。定义网络时,需要继承nn.Module,并实现它的forward方法,把网络中具有可学习参数的层放在构造函数__init__中。如果某一层(如Re...
2019-04-16 22:06:06 237
原创 PyTorch学习笔记之Variable
Tensor是PyTorch中重要的数据结构,可认为是一个高维数组,可以使用GPU加速。import torch as t# 构建5*3矩阵,只是分配了空间,未初始化x = t.Tensor(5, 3)# 使用[0, 1]均匀分布随机初始化二维数组x = t.rand(5, 3)# 查看x的形状print(x.size())y = t.rand(5, 3)# 加法的第一...
2019-04-16 22:05:32 836
原创 PyTorch学习笔记之Tensor
Tensor是PyTorch中重要的数据结构,可认为是一个高维数组,可以使用GPU加速。import torch as t# 构建5*3矩阵,只是分配了空间,未初始化x = t.Tensor(5, 3)# 使用[0, 1]均匀分布随机初始化二维数组x = t.rand(5, 3)# 查看x的形状print(x.size())y = t.rand(5, 3)# 加法的第一...
2019-04-16 22:04:42 243
原创 C++实现LRU算法
LRU算法LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的。LRU算法的提出,是基于这样一个事实:已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。因此,我们只需要在每次调换时,找到最近最久未使用的那个页面调出内存。这就是LRU算法的全部内容。实现使用双向链表和哈希表实现LRU算法双向链表用于保存key-va...
2019-04-09 23:29:21 5123 4
转载 std::list中size的时间复杂度
最近在做一个性能要求较高的项目,有个服务器需要处理每秒2万个udp包,每个包内有40个元素(当然这是高峰期)。服务器需要一个链表,算法中有个逻辑要把每个元素添加到链表末尾(只是这个元素对象的指针,不存在对象复制的问题),再从链表中把这些元素取出(另一个时间点)。就是一个单线程在做这件事。既然逻辑这么简单,我自然选用了C++的标准STL容器List(Linux GNU,sgi的实现...
2019-04-09 21:53:08 1495 1
原创 [leetcode]swap-nodes-in-pairs
题目描述Given a linked list, swap every two adjacent nodes and return its head.For example,Given1->2->3->4, you should return the list as2->1->4->3.Your algorithm should use only con...
2019-04-04 23:18:37 205
原创 [leetcode]merge-k-sorted-lists
题目描述Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.解法合并k个有序链表的解法与合并两个有序链表的解法类似先构造一个dummy结点,并把dummy赋值给cur,在循环中选择k个链表中值最小的头结点,使得cur的next指向最小的头结点,并...
2019-03-27 22:33:15 156
原创 [leetcode]4 sum
题目描述Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.解法解法和2sum、3sum问题...
2019-03-25 21:49:02 297
原创 惊群问题
定义惊群问题是指在多线程(或多进程)场景下,有多个线程在等待某一资源可用,一旦这个资源可用,那么所有等待这个资源的线程都会被唤醒,但是资源只有一份,那么只有一个线程获得这个资源,其它线程都获取失败惊群问题导致了不必要的线程唤醒,实际上只有一个线程能获取这份资源,那么理想情况下只唤醒一个线程就行了。而唤醒多个线程导致了不必要的线程调度,造成系统开销经典的accept惊群问题在Linux...
2019-03-19 21:22:40 3658
原创 多服务器显卡使用状态监控工具实现
一、前言实验室是做计算机视觉的,拥有几台服务器,每台服务器上有1到8张数量不等的显卡,用于同学们跑深度学习算法。每次到了会议/期刊截稿前,服务器都人满为患,大家各种抢显卡用(同时占用多张显卡能提高程序的并行性,训练模型花费时间变少),旱的旱死涝旳涝死,有的同学占了十几张卡,而有的同学天天蹲守服务器也等不到一张空闲的卡。于是,产品经理(其实是实验室大师兄)提了个需求,让我写个显卡监控工具,用于监控...
2019-03-18 22:29:31 1479
原创 判断一棵树是不是平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。解法最直观的想法是从根节点开始遍历,对每个节点求其左右子树高度,若左右子树高度差大于1,则返回false;否则以递归的方式处理其左子节点和右子节点class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot == n...
2019-03-13 22:15:20 186
原创 云风协程库代码分析
一、什么是协程协程,英文叫做 Coroutine,又称微线程、纤程,协程是一种用户态的轻量级线程。简单地说,协程就是在用户态对线程的模拟,我们都知道线程的调度是由操作系统内核完成的,而协程的调度是由用户代码完成的。相比线程,协程有如下优势协程切换在用户态完成,不需要进入内核态,没有线程切换的开销,效率更高多个协程是在同一个线程中运行的,不存在多线程环境下的写变量冲突,因此不需要多线程的锁...
2019-03-13 17:36:40 537
原创 服务器多进程、多线程和事件驱动模型
多进程模型、多线程模型多进程模型每接受一个连接就fork一个子进程,在该子进程中处理该连接的请求特点是多进程占用系统资源多,进程切换的系统开销大,Linux下最大进程数有限制,不利于处理大并发多线程模型每接受一个连接就create一个子线程,利用子线程处理这个连接的请求Linux下有最大线程数限制(进程虚拟地址空间有限),进程频繁创建和销毁造成系统开销,同样不利于处理大并发...
2019-03-13 12:09:49 599
原创 常见大数据问题
一、基础知识1.1 哈希函数哈希函数又称散列函数,其输入域可以是非常大的范围,但是输出域是固定范围性质典型的哈希函数都拥有无限的输入值域输入值相同时,返回值一样输入值不同时,返回值可能一样,也可能不一样哈希函数优劣的关键不同输入值得到的哈希值,整体均匀地分布在输出域上1.2 Map-ReduceMap-Reduce分为两个阶段Map阶段通过哈希函数把大...
2019-03-09 20:31:13 684
原创 C++11实现单例模式
1 线程不安全的单例模式类的静态成员变量由所有对象共享,也就是在内存中只有一份,我们可以利用这个特性凭直觉写出如下的单例模式class Singleton {public: static Singleton* getInstance(); Singleton(const Singleton&amp; rhs) = delete; Singleton&amp; operator=(con...
2019-03-07 23:17:13 1811 5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人