IkanのBolg

只想安安静静撸代码


  • Home

  • Tags

  • Categories

  • Archives

操作系统-番外-基于NAND存储设备文件系统F2FS

Posted on 2020-07-02 | In OS学习笔记

背景

由于磁盘的机械特征,导致要想提升它的读写速度是非常困难的。因此SSD应运而生,它的读写速度,因为没有磁头,导致其寻道时间几乎为0。

SSD的分类
  • 基于闪存类:采用FLASH芯片作为存储介质,擦写次数有限制
  • 基于DRAM的固态硬盘:采用DRAM作为存储介质,它是一种高性能的存储器,而且使用寿命很长,美中不足的是需要独立电源来保护数据安全

针对闪存ssd的特性,虽然其速度快,我们知道大部分的I/O操作都是随机写,如果不仔细的处理,会严重增加I/O的延迟和缩短SSD的寿命。虽然LFS和BTRFS有效的降低了随机写的影响,但是没有完全考虑到SSD的特性(性能和寿命)

F2FS出现了,它是专门为基于 NAND 的存储设备设计的新型文件系统,F2FS是第一个公开提出以优化性能和寿命并且广泛使用的文件系统,下面我们了解F2FS的设计原理

Read more »

操作系统-番外-日志结构文件系统LFS

Posted on 2020-06-26 | In OS学习笔记

引言

过去几十年CPU速度的增长是巨大的,但是磁盘的访问速度却增长较慢。内存近些年发展也很快,可以提供较大的空间存储程序的工作集,因此磁盘传输主要是被写操作支配。因此如何提升写效率是有效利用磁盘的关键。

日志结构文件系统是用顺序写,因为省去了绝大部分seek操作,因此大大提升了写的性能。还有一个好处就是系统崩溃恢复,日志结构文件系统只需要检查最近的部分日志

日志结构文件系统实现

基本假设
  • 大部分的读请求都从缓存中读取
  • 大部分磁盘访问都是写请求
段概念
  • 段定义:虽然磁盘顺序写效率高,考虑一下,如果有一个文件执行写操作就写,但是如果中间间隔一会儿写另一个文件,那么中间磁盘已经旋转。要想获得高效率,必须连续顺序写,因此需要在内存中缓存修改的块,直到达到一定数量的时候执行一次写操作,这个大块叫做段

  • 段布局:段中不仅包含了数据块,也包括i-node块,段的开头还包括一个段summary块,包含了垃圾回收需要的关键信息,后边详细解释

    img

    Read more »

操作系统笔记-9-文件系统

Posted on 2020-06-20 | In OS学习笔记

引言

之前已经学习过数据在内存中是如何表示,如何存储,但是这些存储在PC断电后数据便消失。因此我们需要一个可以持久化存储并且容量远远大于内存的结构,这一篇我们将学习,文件是如何被组织和操作的,这是一个操作系统重要的部分-文件系统。文章的结构主要分为文件和目录的概念、文件系统的实现、文件系统的管理和优化、最后是例子。

文件和目录基本概念

文件
  • 文件定义:文件是一种抽象的概念,它提供了一种方法可以将信息存储到硬盘并且随后读取回来。

  • 文件命名:文件命名规则是通常分为两部分,小数点后的叫文件扩展名(不是必须的),小数点前的叫文件名,某些操作系统有字符数限制(学完文件的组织结构就知道为什么了),某些系统区分大小写。

    Read more »

日常问题随笔-RestTemplate发送Get请求通过body传参问题

Posted on 2020-06-18 | In 问题随笔

问题出现

今天在对接其他部门的接口时,发现对方提供了一个GET请求,但是参数却要求通过body传递json格式的数据。这可难住我了,GET请求还能通过body传递参数吗?带着疑问,先试一下吧。我们项目用的RestTemplate,我想起了RestTemplate的exchange方法有个参数HttpEntity,会不会是这里可以传参数进去呢?迅速写了代码

1
2
3
4
5
6
public static String getForJson(String url, Map<String,Object> dataValue) {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<String> httpEntity = new HttpEntity<>(JSON.toJSONString(dataValue),httpHeaders);
return SpringContextUtil.getBean(RestTemplate.class).exchange(url, HttpMethod.GET,httpEntity,String.class).getBody();
}

结果

Read more »

操作系统笔记-8-高速缓存

Posted on 2020-06-13 | In OS学习笔记

引言

上一篇学习了虚拟内存,虚拟内存解决了多道程序并发运行的内存分配和解决小内存运行大程序的问题。这一篇将讲解高速缓存,来解决内存的低速和cpu高速不匹配的问题,计算机的很多的问题,其实都可以中间加一层解决,因此计算机才变得复杂,想象一下如果主存的速度可以匹配cpu的速度那么高速缓存就不需要了,再进一步,假设硬盘的速度可以匹配cpu,我想主存也可以不需要了。但是现有的技术还达不到这个目标,所以这一部分还是得学习一下高速缓存,看看高速缓存是如何解决cpu快速访问指令和数据的问题。

基本概念

CPU、缓存、内存架构

现代cpu一般都是多核的,高速缓存通常分了三级,L1分为指令缓存和数据缓存并且是cpu核心独有;L2也是cpu核心独有;L3则是多核心共享,其示意图如下

Read more »

操作系统笔记-7-虚拟内存

Posted on 2020-06-08 | In OS学习笔记

引言

上一篇笔记讲述了内存的地址空间抽象,但是还留下了问题,那就是当软件很大的时候虽然利用Swapping技术可以运行,但是每次交换整个进程的空间开销不容忽视,虽然近年来内存也有增长,但是软件大小增长的速度远大于内存增长的速度。

一个解决方法是Overlays(覆盖),Overlays将程序分割为多个片段,称为覆盖,当程序开始时,覆盖管理器加载覆盖0,执行完成后,通知覆盖管理器加载覆盖1,然后覆盖1会在覆盖0top上(如果有空间),或者直接在覆盖0(如果没空间)。虽然,换入换出覆盖块由操作系统完成,但是需要程序员将程序分块,这是一个复杂的工作,并且非常容易出错。因此这种技术无法普及,因此人们又提出了新的解决方案,这次是完全交给系统完成,那就是今天要学习的一个技术-虚拟内存。

基本概念

原理

每个程序都有自己独立的空间,并且这个空间分了多个固定大小的块,这些块通常叫做页,每一个页都有一个连续的地址范围,每一个页都映射一个物理范围叫页框(页框的大小通常和页是一样),程序运行不需要所有的页都在内存中,当程序引用到在物理内存中的地址空间时,由硬件(MMU)完成映射;如果不在内存中,由操作系统载入内存并重新执行失败的指令。

Read more »

操作系统笔记-6-内存管理基础

Posted on 2020-06-07 | In OS学习笔记

引言

花了一段时间才把之前的笔记整理了一部分,平时太忙也没啥时间。今天开始整理内存管理部分的,内存管理部分大致分为三部分笔记,第一部分就是本篇内存管理基础,第二部分是虚拟内存,第三部分高速缓存。

一个程序在运行前,只是一个存储在磁盘上的可执行的二进制文件,包括可执行指令和数据。当程序运行时,这个二进制文件会被加载到内存中,指令和数据在执行时会被cpu从内存中加载到寄存器中,然后执行,可能会把执行结果再次存入内存中。数据以何种形式存在内存,如果为进程分配内存,进程退出如何回收,这个过程叫内存管理,接下来就详细介绍这个过程

早期无存储器抽象

无存储器抽象内存访问

用户程序直接操作物理内存的地址,比如将位置为1000的物理内存中的内容复制到REGISTER1

1
MOV REGISTER1,1000
物理内存模型
Read more »

操作系统笔记-番外-操作系统经典书籍推荐

Posted on 2020-06-02 | In OS学习笔记

最近整理以前的笔记,有人问关于操作系统的书籍。我有个爱好喜欢收集书籍,前后也收集了几百本高质量的书籍,这里给大家推荐基本关于操作系统的书籍

Operating System Concepts 10th edition

img

又称恐龙书,这本书已经出到第10版,可见其经典。作者是想从理论层面把问题的产生和解决思路阐述清楚,包含了操作系统各个方面,是一本非常不错的入门书籍。

Read more »

操作系统笔记-5-进程&线程同步

Posted on 2020-06-02 | In OS学习笔记

引言

前一篇介绍了进程和线程调度,知道线程和进程在系统中是并发执行,这将会引发出一些问题。接下来从一个简单的生产者和消费者例子说起,从前有两个进程,一个进程负责往一个buffer里写数据,我们把它叫做生产者;一个进程负责消费数据也就是取走buffer里的数据,我们把它叫做消费者。因为我们要记录写到哪里,所以需要一个变量in来记录,还需要一个变量记录消费到哪里了out,现在我们假设核心的生产者代码段。

1
2
3
4
5
6
7
while (true) {
while (count == BUFFER SIZE)
; /* 忙等待,等到buffer有空间写入 */
buffer[in] = next produced;
in = (in + 1) % BUFFER SIZE; //构建一个环形数组
count++;
}

消费者核心代码

Read more »

操作系统笔记-4-进程&线程调度

Posted on 2020-05-27 | In OS学习笔记

引言

当我们在平时工作或学习中用电脑的时候,我想很多人都是一边听着音乐一边写代码、看文档、编辑Markdown写笔记或者Chrome看着网页,不知道你有没有好奇电脑为什么可以可以同时完成这些程序的运行,并且如果你细心可能发现了有时候程序的响应快,有时候响应慢。这些都是因为进程&线程调度的结果,哪怕你的电脑处理器只有一核,可同时同时执行多个应用程序。

为何需要调度

并不是所有的程序都是cpu密集型的,也有I/O密集型,如下图,a是cpu密集型任务,它有很长的cpu周期,而b则持有cpu的时间短但是却很频繁。如果你是系统的设计者你会让程序如果运行呢?如果每次都先执行完a再执行b,那么磁盘可能长期处于空闲状态,这里有一个简单的想法是,优先保证b进程执行,这样磁盘就可以长期保持忙碌的状态。所以,进程调度的目的一方面是让程序并发执行,一方面是为保持系统各个组件处于忙碌状态避免资源浪费。

Read more »
1234

ikan

34 posts
11 categories
16 tags
© 2020 ikan
Powered by Hexo
|
Theme — NexT.Muse v5.1.4