1.程序员会装电脑系统吗

2.ntldrismissing最简单解决方法

3.编程用的笔记本电脑推荐

4.DELL电脑重装系统不读盘解决步骤方法

5.程序员必备知识(操作系统5-文件系统)

程序员系统维护_程序员不会修复电脑系统

学编程电脑配置要求包括处理器、内存、显卡、存储、显示器、键盘和鼠标、操作系统。

一、处理器

Intel Core i5或AMD Ryzen 5,以确保良好的运行速度。

二、内存

运行内存需要8GB或16GB DDR4,以便同时运行多个编程环境和调试工具。

三、显卡

集成显卡即可,NVIDIA GeForce MX350或AMD Radeon RX 5600M。对于一些大型游戏或专业图形处理,可选独立显卡。

四、存储

存储内存需要256GB或512GB SSD,用于安装操作系统和编程工具。可根据需求扩展至1TB或更高。

五、显示器

显示器的分辨率至少1080P,推荐1440P或4K,以便阅读和编写代码更舒适。

六、键盘和鼠标

舒适且易于使用,提高长时间编程的效率。

七、操作系统

推荐Windows 10或macOS Catalina,两者均内置了编程环境,Visual Studio Code和PyCharm等。还可以根据编程语言和需求选择相应的编程环境、IDE和工具。

优秀的电脑配置的重要性

一、工作效率

高性能的电脑可以更快地完成任务,提高工作效率。

二、流畅度

好的配置可以保证电脑运行流畅,减少卡顿现象,提升用户体验。

三、兼容性

高性能的电脑更能适应各种软件和操作系统,避免因配置不足导致的软件兼容性问题。

四、扩展性

优秀的电脑配置有助于未来升级和扩展,满足不断发展的需求,升级的空间也会更多。

五、投资回报

购买高性能电脑可以在较长的时间内保持较高的使用价值,降低更换频率,性价比属于优秀的。

六、专业性

对于专业领域,图形设计、编程、游戏等,好的电脑配置是实现高质量工作的必要条件。

七、可靠性

高性能电脑的硬件故障率相对较低,降低维修成本和停机时间可靠性会更高。

八、面子

拥有一台优质电脑,可以展示个人品位和身份。

程序员会装电脑系统吗

作为一名程序员,你的电脑就是你的“战友”。选对了,效率飙升;选错了,麻烦不断。今天,我们就来聊聊程序员选电脑的那些事儿!

选择合适的操作系统

Windows、Linux还是Mac?这得根据你的需求来。总之,别给自己找麻烦,用着顺手最重要。

显示器要大、交互要舒适

一个27寸以上的大屏,绝对让你工作起来更舒心。再配上机械键盘或HHKB,码字飞快!

内存、CPU和硬盘要给力

大内存、快CPU、SSD硬盘,这些都是必备的。开一堆网页和IDE,编译代码,速度快才能保证你的工作效率和心情。

网络环境要通畅

别让网络问题拖了你的后腿。

其他配置根据需求来

如果你需要跑GPU或做图形开发,那显卡就要给力一些。经常出差的话,那就选个轻便续航强的笔记本吧。

特别提醒:Java程序员

如果是Java程序员,那么显示器大一点更好,超过36寸最好,保护眼睛又便于编码。内存尽量大于2G,因为eclipse占内存很大,运行程序才不会卡。硬盘容量也要大于500G,因为你会保存很多工程文件。如果你要开发Android程序,那建议购买高配置电脑哦!

ntldrismissing最简单解决方法

程序员和装电脑系统完全是两个不同的概念。一般来说装电脑系统的人一般不会做程序。但是有的程序员还是会装系统的。

这个和人有关系。因为程序员相对来说做事更缜密,所以抓系统有时候也会学习一下。但并不是所有的程序员都是会装系统。毕竟是两个概念。

编程用的笔记本电脑推荐

U盘插入进不去系统的电脑上,重新开机,然后一直按F12或者F10等快捷键

操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

事实上,全新操作系统的设计和改良的关键工作就是对体系结构的设计,经过几十年以来的发展,计算机操作系统已经由一开始的简单控制循环体发展成为较为复杂的分布式操作系统,再加上计算机用户需求的愈发多样化,计算机操作系统已经成为既复杂而又庞大的计算机软件系统之一。

DELL电脑重装系统不读盘解决步骤方法

适合程序员编程用的笔记本电脑首先应该满足小巧轻便这个需求,然后才是性能因素,一个标准的程序员必定能够随时随地改BUG,所以可以优先考虑苹果MacBook Pro,由于其 MacOS 就是Linux内核,做开发无疑是最佳的选择。当然还有非常多的Windows笔记本,性价比更高,可以装乌班图、CentOS等各种Linux系统也基本不是问题,其性能更高,选择更多。

1、ThinkPad X1 Carbon 2021款

参考价格:10499元

机型配置:11代酷睿i5-1135G7 16G 512G /4G版/16:10微边框

ThinkPadX1Carbon 2021款作为主打高端,服务于高端商务人士的产品,其硬件配置也很强悍。我手里这款搭载了酷睿i5-1135G7处理器,并通过了英特尔Evo平台认证。

Evo认证不只是对处理器及显卡的性能认证,更是对整机硬件环境的一种综合能力认证:必须搭载酷睿11处理器,并内置英特尔锐炬Xe核显,并搭载Wi-Fi6无线网卡,蓝牙5.0以及Thunderbolt4接口,并且搭载不小于256GB容量的PCIe/NVMeSSD和不小于8GB的双通道内存。此外扬声器、麦克风、像头等功能性设备也有严格的评定标准。所以看到Evo认证基本就可以认定这是一款整机表现更稳定、综合性能更高的产品。

2、联想YOGA 14s

参考价格:6299元

机型配置:8核 R7-5800H 16G 512G 2.8K 90Hz高刷屏

YOGA14s是联想的高端轻薄本,所以屏幕配备的是16:10长宽比、2880×1800分辨率的高色域屏,还支持90Hz刷新率,单独拿出来每一个规格参数都可以当卖点。标配16GB内存,是LPDDR4X-4266规格,不可升级,硬盘则是512GB SSD,笔记本的最大卖点就是AMD平台配上了MX450独显,是25W的大杯型号,整体上没有明显的短板。

3、 惠普战66 四代

参考价格:7099元

机型配置:i7-1165G7 16G 1TB MX450 2G独显 高色域 一年上门+意)

惠普战66四代的好评主要集中在这几方面:轻薄、颜值、性能。多数用户表示“始于颜值,忠于性能”,这几点正好是当下选购笔记本最为重要的考量标准,而惠普战66四代在各方面均得到了相当高的认可。

此外,惠普战66四代在日常商务使用方面,也广受用户好评。如下面这位用户就表示惠普战66四代的军工品质,能抗能打。据官方信息显示,惠普战66四代还通过了业界严苛的19项美国MIL-STD-810H军标测试,简单来说,就是无论何时何地,不管使用环境多么严峻,都能随时进行办公。

4、雷蛇灵刃15 标准版

参考价格:8299元

机型配置:10代I7-10750H 官配16G/512G/RTX2060/144HZ

雷蛇灵刃15是专为 PC 游戏玩家提供的游戏本,通过专注于游戏硬件和外围设备的公司生产的。但许多程序员喜欢这个设备,因为它外观时尚,功能强大,而且相当专业。也就是说,与其他游戏笔记本电脑相比,没有多少视觉金光闪闪,而且它也很薄。不仅能够满足编程工作,也能够游刃有余的玩游戏,何乐不为呢?

程序员必备知识(操作系统5-文件系统)

 dell电脑很受中层用户欢迎,不过有时出现重装系统无法读盘情况,怎么解决呢。接下来是我为大家收集的DELL电脑重装系统不读盘解决办法,欢迎大家阅读:

 DELL电脑重装系统不读盘解决办法

 一.光驱不能被机器识别,也就是通常说的认不到光驱

 机器认不到光驱的情况一般来说有可能是光驱坏掉了,但在DELL的机器很有可能只是BIOS的信息出错而已,简单恢复一下就可以了。

 不过在恢复BIOS的信息以前,我们还要确定一下,光驱的跳线的位置,很多问题也是出在这个地方。

 DELL机器的BIOS对跳线有特别的要求,即必须跳到cable select的模式上才可以,而不是象大多数兼容机一样的slave。具体跳线的图示和位置一般都在光驱的表面标明。

 恢复BIOS的方法分新机型和旧机型2种

 1.老机型的方法:

 1)、开机后,在看到DELL图标时,按3下F2,进入BIOS。(灰色界面)

 2)、分别按键盘上的Caps Lock, Scroll Lock, 以及 Num Lock三个键,使键盘上相应的三个指示灯点亮。

 3)、同时按下Alt + E 组合键。这时系统将会发出?嘀?的一声,表明NVRAM已被清除。

 4)、按Alt + F 组合键,恢复BIOS出厂设置,当然也有?嘀?的一声。

 5)、按Alt + B 组合键,将所做的更改保存,重新启动机器。

 然后就在一行英文这里停住半分钟左右,随后如果找到光驱,机器就会进入系统就会看到光驱的盘符了。

 2.新机型的方法比较简单:

 1)、开机后,在看到DELL图标时,按3下F2,进入BIOS。(蓝色界面)

 2)、按Alt + F 组合键,恢复BIOS出厂设置。

 3)、按ESC键,选择SAVE/EXIT并回车来保存退出。

 该操作可谓是万金油,能解决大多数的端口问题,例如:打印口问题/串口问题/软驱端口/光驱检测不到/鼠标键盘等等等等

 注意:当做完该操作之后,默认是将软驱端口打开,如果用的电脑没有装软驱,则会再每次开机时报Diskette drive 0 seek failure, F1。。。F2。。。错误,那么就需要进BIOS将软驱端口关闭。

 一、开机的时候按F2进入BIOS〉翻到第二页?Advanced?〉将USB BIOS Legacy Support选项禁用(改为Disabled)〉F10保存退出即可,此时USB设备(鼠标键盘无法使用)安装后改回来就可以试试这个看行不行?

 二、恢复BIOS的方法分新机型和旧机型2种

 1.老机型的方法:

 1)、开机后,在看到DELL图标时,按3下F2,进入BIOS。(灰色界面)

 2)、分别按键盘上的Caps Lock, Scroll Lock, 以及 Num Lock三个键,使键盘上相应的三个指示灯点亮。

 3)、同时按下Alt + E 组合键。这时系统将会发出?嘀?的一声,表明NVRAM已被清除。

 4)、按Alt + F 组合键,恢复BIOS出厂设置,当然也有?嘀?的一声。

 5)、按Alt + B 组合键,将所做的更改保存,重新启动机器。

 然后就在一行英文这里停住半分钟左右,随后如果找到光驱,机器就会进入系统就会看到光驱的盘符了。

 2.新机型的方法比较简单:

 1)、开机后,在看到DELL图标时,按3下F2,进入BIOS。(蓝色界面)

 2)、按Alt + F 组合键,恢复BIOS出厂设置。

 3)、按ESC键,选择SAVE/EXIT并回车来保存退出。

 该操作可谓是万金油,能解决大多数的端口问题,例如:打印口问题/串口问题/软驱端口/光驱检测不到/鼠标键盘等等等等

 三、原版Windows 2000/XP/2003安装光盘都可以通过以下两种方式来启动安装程序:

 ⑴、在电脑原有的Windows系统下,运行光盘上的Setup.exe程序来启动安装程序。

 这种安装方式会在C盘写入一些安装时必需用到的临时文件,所以在安装过程中C盘不能被删除也不能

 被重新格式化,C盘原有的旧文件无法被彻底清除。因此,这种安装方式是不彻底的,不推荐大家使用。

 ⑵、开机后直接从光盘引导进入安装程序,这也是下面详细介绍的推荐安装方式。

 对于新购买的没有安装操作系统的电脑,这也是唯一的安装方式。另外,只有这样启动安装程序,

 才可以在安装过程中对整个硬盘进行分区,或是格式化C盘来彻底清除C盘的旧文件。

 ★特别提醒:如果在安装过程中进行硬盘分区操作,硬盘上的全部数据都将会被删除

 (不重新分区的话只有C盘的数据会全部丢失),请务必事先做好重要数据的备份工作。

 相关阅读:操作系统常见故障核心知识

 1、进程与线程

 1 进程与线程的概念

 进程:是一定功能的程序关于某个数据集合的一次运行活动,进程是系统进行资源调度和分配的独立单位。

 线程:是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

 2 进程与线程的关系

 a. 一个线程可以创建和撤销另一个线程,一个进程中可以多个线程并发执行;

 b. 相对进程而言,线程更加接近于执行体的概念,多个线程可以共享同一个进程的资源,每个线程还有自己私有的桟空间并拥有独立的执行序列。

 c. 进程有独立的地址空间,在保护模式下,进程崩溃时不会对其他进程有影响。线程有自己的堆桟和局部变量,但是线程之间没有独立的地址空间,所以一个线程的死亡就相当于进程的死亡。因此,多进程的程序比多线程的程序具有更好的健壮性,但是进程间切换耗费资源较大,大约是线程间切换的十倍,所以多线程拥有更高的效率

 线程和进程的区别联系:

 1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。

 2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

 两者都可以提高程序的并发度,提高程序运行效率和响应时间。

 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

 根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:

 1、速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。

 2、资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。

 3、同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内

 2、进程间通信

 进程间通信主要有:管道、系统IPC(消息队列、信号量、共享存储)和socket。

 管道主要分为普通管道、流管道、命名管道。

 管道是一种半双工的通信方式,数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程

 命名管道也是半双工的通信方式,它允许无亲缘关系的进程间进行通信 信号量是一个计数器,用来控制多个进程对资源的访问,它通常作为一种锁机制。

 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。

 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

 共享内存就是映射一段能被其它进程访问的内存,这段共享内存由一个进程创建,但是多个进程可以访问。

 3、缓冲区溢出

 概念: 缓冲区溢出是指计算机向缓冲区填写的数据超过了缓冲区的容量,数据覆盖在其他合法区域上。

 危害: 程序崩溃,导致拒绝服务;跳转并执行一段恶意代码

 注:缓冲区溢出的原因是程序员没有对输入数据进行检查。

 4、死锁

 1 概念:在两个及两个进程并发执行的过程中,有的线程持有了一部分资源,又在等待其他进程持有的资源,资源的互相持有和等待就导致了进程死锁。

 2 死锁产生的四个条件(ACID):

 互斥性: 一个资源只能被一个进程持有

 请求和保持:一个进程因请而阻塞导致原来持有的资源得不到释放

 不可剥夺: 进程未完成功能之前,不可强制释放当前所持有的资源

 环路等待: 若干进程之间形成环路等待资源的情形

 3 解决死锁的方法:

 解决死锁的基本思路就是破坏死锁产生的四个必要条件

 解决死锁的基本方法如下:

 预防死锁、避免死锁、检测死锁、解除死锁

 解决四多的常用策略如下:

 鸵鸟策略、预防策略、避免策略、检测与解除死锁

 5、进程调度的策略

 FCFS(先来先服务)、优先级、时间片轮转、多级反馈

 6、进程同步的方式

 原子操作、信号量、自旋锁管程、会合、分布式系统

本篇与之前的第三篇的内存管理知识点有相似的地方

对于运行的进程来说,内存就像一个纸箱子, 仅仅是一个暂存数据的地方, 而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在 外部存储 中。就像图书馆这种地方,不仅空间大,而且能够永久保存。

我们最常用的外部存储就是 硬盘 ,数据是以文件的形式保存在硬盘上的。为了管理这些文件,我们在规划文件系统的时候,需要考虑到以下几点。

第一点,文件系统要有严格的组织形式,使得文件能够 以块为单位进行存储 。这就像图书馆里,我们会给设置一排排书架,然后再把书架分成一个个小格子,有的项目存放的资料非常多,一个格子放不下,就需要多个格子来进行存放。我们把这个区域称为存放原始资料的 仓库区 。

第二点,文件系统中也要有 索引区 ,用来方便查找一个文件分成的多个块都存放在了什么位置。这就好比,图书馆的书太多了,为了方便查找,我们需要专门设置一排书架,这里面会写清楚整个档案库有哪些资料,资料在哪个架子的哪个格子上。这样找资料的时候就不用跑遍整个档案库,在这个书架上找到后,直奔目标书架就可以了。

第三点,如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有 缓存层 。这就相当于图书馆里面的热门图书区,这里面的书都是畅销书或者是常常被借还的图书。因为借还的次数比较多,那就没必要每次有人还了之后,还放回遥远的货架,我们可以专门开辟一个区域, 放置这些借还频次高的图书。这样借还的效率就会提高。

第四点,文件应该用 文件夹 的形式组织起来,方便管理和查询。这就像在图书馆里面,你可以给这些资料分门别类,比如分成计算机类.文学类.历史类等等。这样你也容易管理,项目组借阅的时候只要在某个类别中去找就可以了。

在文件系统中,每个文件都有一个名字,这样我们访问一个文件,希望通过它的名字就可以找到。文件名就是一个普通的文本。 当然文件名会经常冲突,不同用户取相同的名字的情况还是会经常出现的。

要想把很多的文件有序地组织起来,我们就需要把它们成为 目录 或者文件夹。这样,一个文件夹里可以包含文件夹,也可以包含文件,这样就形成了一种 树形结构 。而我们可以将不同的用户放在不同的用户目录下,就可以一定程度上避免了命名的冲突问题。

第五点,Linux 内核要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用 。这就好比,图书馆里会有个图书管理系统,记录哪些书被借阅了,被谁借阅了,借阅了多久,什么时候归还。

文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。

文件系统的基本数据单位是 文件 ,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。

Linux最经典的一句话是:“一切皆文件”,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。

Linux文件系统会为每个文件分配两个数据结构: 索引节点(index node) 和 目录项(directory entry) ,它们主要用来记录文件的元信息和目录层次结构。

●索引节点,也就是inode, 用来记录文件的元信息,比如inode编号、文件大小访问权限、创建时间、修改时间、 数据在磁盘的位置 等等。 索引节点是文件的唯一标识 ,它们之间一一对应, 也同样都会被 存储在硬盘 中,所以索引节点同样占用磁盘空间。

●目录项,也就是dentry, 用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成 目录结构 ,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是 缓存在内存 。

由于索引节点唯一标识一个文件,而目录项记录着文件的名,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别字。比如,硬链接的实现就是多个目录项中的索引节点指向同一个文件。

注意,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。

(PS:目录项和目录不是一个东西!你也不是一个东西(^_=), 虽然名字很相近,但目录是个文件。持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。

如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了 文件系统的效率。

目录项这个数据结构不只是表示目录,也是可以表示文件的。)

磁盘读写的最小单位是 扇区 ,扇区的大小只有512B大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。

所以,文件系统把多个扇区组成了一个 逻辑块 ,每次读写的最小单位就是逻辑块(数据块) , Linux中的逻辑块大小为4KB,也就是一次性读写 8个扇区,这将大大提高了磁盘的读写的效率。

以上就是索引节点、目录项以及文件数据的关系,下面这个图就很好的展示了它们之间的关系:

索引节点是存储在硬盘上的数据,那么为了加速文件的访问,通常会把索引节点加载到内存中。

另外,磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。

●超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。

●索引节点区,用来存储索引节点;

●数据块区,用来存储文件或目录数据;

我们不可能把超级块和索引节点区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的.

●超级块:当文件系统挂载时进入内存;

●索引节点区:当文件被访问时进入内存;

文件系统的种类众多,而操作系统希望 对用户提供一个统一的接口 ,于是在用户层与文件系统层引入了中间层,这个中间层就称为 虚拟文件系统(Virtual File System, VFS) 。

VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口即可。

在Linux文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图:

Linux支持的文件系统也不少,根据存储位置的不同,可以把文件系统分为三类:

●磁盘的文件系统,它是直接把数据存储在磁盘中,比如Ext 2/3/4. XFS 等都是这类文件系统。

●内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的/proc 和/sys文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。

●网络的文件系统,用来访问其他计算机主机数据的文件系统,比如NFS. SMB等等。

文件系统首先要先挂载到某个目录才可以正常使用,比如Linux系统在启动时,会把文件系统挂载到根目录。

在操作系统的辅助之下,磁盘中的数据在计算机中都会呈现为易读的形式,并且我们不需要关心数据到底是如何存放在磁盘中,存放在磁盘的哪个地方等等问题,这些全部都是由操作系统完成的。

那么,文件数据在磁盘中究竟是怎么样的呢?我们来一探究竟!

磁盘中的存储单元会被划分为一个个的“ 块 ”,也被称为 扇区 ,扇区的大小一般都为512byte.这说明即使一块数据不足512byte,那么它也要占用512byte的磁盘空间。

而几乎所有的文件系统都会把文件分割成固定大小的块来存储,通常一个块的大小为4K。如果磁盘中的扇区为512byte,而文件系统的块大小为4K,那么文件系统的存储单元就为8个扇区。这也是前面提到的一个问题,文件大小和占用空间之间有什么区别?文件大小是文件实际的大小,而占用空间则是因为即使它的实际大小没有达到那么大,但是这部分空间实际也被占用,其他文件数据无法使用这部分的空间。所以我们 写入1byte的数据到文本中,但是它占用的空间也会是4K。

这里要注意在Windows下的NTFS文件系统中,如果一开始文件数据小于 1K,那么则不会分配磁盘块来存储,而是存在一个文件表中。但是一旦文件数据大于1K,那么不管以后文件的大小,都会分配以4K为单位的磁盘空间来存储。

与内存管理一样,为了方便对磁盘的管理,文件的逻辑地址也被分为一个个的文件块。于是文件的逻辑地址就是(逻辑块号,块内地址)。用户通过逻辑地址来操作文件,操作系统负责完成逻辑地址与物理地址的映射。

不同的文件系统为文件分配磁盘空间会有不同的方式,这些方式各自都有优缺点。

连续分配要求每个文件在磁盘上有一组连续的块,该分配方式较为简单。

通过上图可以看到,文件的逻辑块号的顺序是与物理块号相同的,这样就可以实现随机存取了,只要知道了第一个逻辑块的物理地址, 那么就可以快速访问到其他逻辑块的物理地址。那么操作系统如何完成逻辑块与物理块之间的映射呢?实际上,文件都是存放在目录下的,而目录是一种有结构文件, 所以在文件目录的记录中会存放目录下所有文件的信息,每一个文件或者目录都是一个记录。 而这些信息就包括文件的起始块号和占有块号的数量。

那么操作系统如何完成逻辑块与物理块之间的映射呢? (逻辑块号, 块内地址) -> (物理块号, 块内地址),只需要知道逻辑块号对应的物理块号即可,块内地址不变。

用户访问一个文件的内容,操作系统通过文件的标识符找到目录项FCB, 物理块号=起始块号+逻辑块号。 当然,还需要检查逻辑块号是否合法,是否超过长度等。因为可以根据逻辑块号直接算出物理块号,所以连续分配支持 顺序访问和随机访问 。

因为读/写文件是需要移动磁头的,如果访问两个相隔很远的磁盘块,移动磁头的时间就会变长。使用连续分配来作为文件的分配方式,会使文件的磁盘块相邻,所以文件的读/写速度最快。

连续空间存放的方式虽然读写效率高,但是有 磁盘空间碎片 和 文件长度不易扩展 的缺陷。

如下图,如果文件B被删除,磁盘上就留下一块空缺,这时,如果新来的文件小于其中的一个空缺,我们就可以将其放在相应空缺里。但如果该文件的大小大于所

有的空缺,但却小于空缺大小之和,则虽然磁盘上有足够的空缺,但该文件还是不能存放。当然了,我们可以通过将现有文件进行挪动来腾出空间以容纳新的文件,但是这个在磁盘挪动文件是非常耗时,所以这种方式不太现实。

另外一个缺陷是文件长度扩展不方便,例如上图中的文件A要想扩大一下,需要更多的磁盘空间,唯一的办法就只能是挪动的方式,前面也说了,这种方式效率是非常低的。

那么有没有更好的方式来解决上面的问题呢?答案当然有,既然连续空间存放的方式不太行,那么我们就改变存放的方式,使用非连续空间存放方式来解决这些缺陷。

非连续空间存放方式分为 链表方式 和 索引方式 。

链式分配采取离散分配的方式,可以为文件分配离散的磁盘块。它有两种分配方式:显示链接和隐式链接。

隐式链接是只目录项中只会记录文件所占磁盘块中的第一块的地址和最后一块磁盘块的地址, 然后通过在每一个磁盘块中存放一个指向下一 磁盘块的指针, 从而可以根据指针找到下一块磁盘块。如果需要分配新的磁盘块,则使用最后一块磁盘块中的指针指向新的磁盘块,然后修改新的磁盘块为最后的磁盘块。

我们来思考一个问题, 采用隐式链接如何将实现逻辑块号转换为物理块号呢?

用户给出需要访问的逻辑块号i,操作系统需要找到所需访问文件的目录项FCB.从目录项中可以知道文件的起始块号,然后将逻辑块号0的数据读入内存,由此知道1号逻辑块的物理块号,然后再读入1号逻辑块的数据进内存,此次类推,最终可以找到用户所需访问的逻辑块号i。访问逻辑块号i,总共需要i+ 1次磁盘1/0操作。

得出结论: 隐式链接分配只能顺序访问,不支持随机访问,查找效率低 。

我们来思考另外一个问题,采用隐式链接是否方便文件拓展?

我们知道目录项中存有结束块号的物理地址,所以我们如果要拓展文件,只需要将新分配的磁盘块挂载到结束块号的后面即可,修改结束块号的指针指向新分配的磁盘块,然后修改目录项。

得出结论: 隐式链接分配很方便文件拓展。所有空闲磁盘块都可以被利用到,无碎片问题,存储利用率高。

显示链接是把用于链接各个物理块的指针显式地存放在一张表中,该表称为文件分配表(FAT, File Allocation Table)。

由于查找记录的过程是在内存中进行的,因而不仅显著地 提高了检索速度 ,而且 大大减少了访问磁盘的次数 。但也正是整个表都存放在内存中的关系,它的主要的缺点是 不适 用于大磁盘 。

比如,对于200GB的磁盘和1KB大小的块,这张表需要有2亿项,每一项对应于这2亿个磁盘块中的一个块,每项如果需要4个字节,那这张表要占用800MB内存,很显然FAT方案对于大磁盘而言不太合适。

一直都在,加油!(*゜Д゜)σ凸←自爆按钮

链表的方式解决了连续分配的磁盘碎片和文件动态打展的问题,但是不能有效支持直接访问(FAT除外) ,索引的方式可以解决这个问题。

索引的实现是为每个文件创建一个 索引数据块 ,里面存放的 是指向文件数据块的指针列表 ,说白了就像书的目录一样,要找哪个章节的内容,看目录查就可以。

另外, 文件头需要包含指向索引数据块的指针 ,这样就可以通过文件头知道索引数据块的位置,再通过索弓|数据块里的索引信息找到对应的数据块。

创建文件时,索引块的所有指针都设为空。当首次写入第i块时,先从空闲空间中取得一个块, 再将其地址写到索引块的第i个条目。

索引的方式优点在于:

●文件的创建、增大、缩小很方便;

●不会有碎片的问题;

●支持顺序读写和随机读写;

由于索引数据也是存放在磁盘块的,如果文件很小,明明只需一块就可以存放的下,但还是需要额外分配一块来存放索引数据,所以缺陷之一就是存储索引带来的开销。

如果文件很大,大到一个索引数据块放不下索引信息,这时又要如何处理大文件的存放呢?我们可以通过组合的方式,来处理大文件的存储。

先来看看 链表+索引 的组合,这种组合称为 链式索引块 ,它的实现方式是在 索引数据块留出一个存放下一个索引数据块的指针 ,于是当一个索引数据块的索引信息用完了,就可以通过指针的方式,找到下一个索引数据块的信息。那这种方式也会出现前面提到的链表方式的问题,万一某个指针损坏了,后面的数据也就会无法读取了。

还有另外一种组合方式是 索引+索引 的方式,这种组合称为多级索引块,实现方式是通过一个索引块来存放多个索引数据块,一层套一层索引, 像极了俄罗斯套娃是吧?乛?乛?

前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块, 我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗?

那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法:

●空闲表法

●空闲链表法

●位图法

空闲表法

空闲表法就是为所有空闲空间建立一张表,表内容包括空闲区的第一个块号和该空闲区的块个数,注意,这个方式是连续分配的。如下图:

当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。当用户撤销一个文件时,系统回收文件空间。这时,也需顺序扫描空闲表,寻找一个空闲表条目并将释放空间的第一个物理块号及它占用的块数填到这个条目中。

这种方法仅当有少量的空闲区时才有较好的效果。因为,如果存储空间中有着大量的小的空闲区,则空闲表变得很大,这样查询效率会很低。另外,这种分配技术适用于建立连续文件。

空闲链表法

我们也可以使用链表的方式来管理空闲空间,每一个空闲块里有一个指针指向下一个空闲块,这样也能很方便的找到空闲块并管理起来。如下图:

当创建文件需要一块或几块时,就从链头上依次取下一块或几块。反之,当回收空间时,把这些空闲块依次接到链头上。

这种技术只要在主存中保存一个指针, 令它指向第一个空闲块。其特点是简单,但不能随机访问,工作效率低,因为每当在链上增加或移动空闲块时需要做很多1/0操作,同时数据块的指针消耗了一定的存储空间。

空闲表法和空闲链表法都不适合用于大型文件系统,因为这会使空闲表或空闲链表太大。

位图法

位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。

当值为0时,表示对应的盘块空闲,值为1时,表示对应的盘块已分配。它形式如下:

在Linux文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于inode空闲块的管理,因为inode也是存储在磁盘的,自然也要有对其管理。

前面提到Linux是用位图的方式管理空闲空间,用户在创建一个新文件时, Linux 内核会通过inode的位图找到空闲可用的inode,并进行分配。要存储数据时,会通过块的位图找到空闲的块,并分配,但仔细计算一下还是有问题的。

数据块的位图是放在磁盘块里的,假设是放在一个块里,一个块4K,每位表示一个数据块,共可以表示4 * 1024 * 8 = 2^15个空闲块,由于1个数据块是4K大小,那么最大可以表示的空间为2^15 * 4 * 1024 = 2^27个byte,也就是128M。

也就是说按照上面的结构,如果采用(一个块的位图+?一系列的块),外加一(个块的inode的位图+一系列的inode)的结构能表示的最大空间也就128M,

这太少了,现在很多文件都比这个大。

在Linux文件系统,把这个结构称为一个 块组 ,那么有N多的块组,就能够表示N大的文件。

最终,整个文件系统格式就是下面这个样子。

最前面的第一个块是引导块,在系统启动时用于启用引导,接着后面就是一个一个连续的块组了,块组的内容如下:

● 超级块 ,包含的是文件系统的重要信息,比如inode总个数、块总个数、每个块组的inode个数、每个块组的块个数等等。

● 块组描述符 ,包含文件系统中各个块组的状态,比如块组中空闲块和inode的数目等,每个块组都包含了文件系统中「所有块组的组描述符信息」。

● 数据位图和inode位图 ,用于表示对应的数据块或inode是空闲的,还是被使用中。

● inode 列表 ,包含了块组中所有的inode, inode 用于保存文件系统中与各个文件和目录相关的所有元数据。

● 数据块 ,包含文件的有用数据。

你可以会发现每个块组里有很多重复的信息,比如 超级块和块组描述符表,这两个都是全局信息,而且非常的重要 ,这么做是有两个原因:

●如果系统崩溃破坏了超级块或块组描述符,有关文件系统结构和内容的所有信息都会丢失。如果有冗余的副本,该信息是可能恢复的。

●通过使文件和管理数据尽可能接近,减少了磁头寻道和旋转,这可以提高文件系统的性能。

不过,Ext2 的后续版本采用了稀疏技术。该做法是,超级块和块组描述符表不再存储到文件系统的每个块组中,而是只写入到块组0、块组1和其他ID可以表示为3、5、7的幂的块组中。

在前面,我们知道了一个普通文件是如何存储的,但还有一个特殊的文件,经常用到的目录,它是如何保存的呢?

基于Linux?一切切皆文件的设计思想,目录其实也是个文件,你甚至可以通过vim打开它,它也有inode, inode 里面也是指向一些块。

和普通文件不同的是, 普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息 。

在目录文件的块中,最简单的保存格式就是 列表 ,就是一项一项地将目录下的文件信息(如文件名、文件inode.文件类型等)列在表里。

列表中每一项就代表该目录下的文件的文件名和对应的inode,通过这个inode,就可以找到真正的文件。

通常,第一项是「则」,表示当前目录,第二项是.,表示上一级目录, 接下来就是一项一项的文件名和inode。

如果一个目录有超级多的文件,我们要想在这个目录下找文件,按照列表一项一项的找,效率就不高了。

于是,保存目录的格式改成 哈希表 ,对文件名进行哈希计算,把哈希值保存起来,如果我们要查找一个目录下面的文件名,可以通过名称取哈希。如果哈希能够匹配上,就说明这个文件的信息在相应的块里面。

Linux系统的ext文件系统就是采用了哈希表,来保存目录的内容,这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免哈希冲突。

目录查询是通过在磁盘上反复搜索完成,需要不断地进行/0操作,开销较大。所以,为了减少/0操作,把当前使用的文件目录缓存在内存,以后要使用该文件时只要在内存中操作,从而降低了磁盘操作次数,提高了文件系统的访问速度。

感谢您的阅读,希望您能摄取到知识!加油!冲冲冲!(发现光,追随光,成为光,散发光!)我是程序员耶耶!有缘再见。<-biubiu-?(`ω?∩)