双系统的实现原理

这里写图片描述

硬件令机器变快。软件则把快机器搞慢。

前言

今天谈一谈双系统的实现原理,其实写这篇博客的时候我还没怎么彻底搞懂,不过在写的过程中会边思考边写,因为借鉴了CyC2018/Interview-Notebook,这个文档也是借鉴了一本书《鸟哥的Linux私房菜》,我就借花献佛,水一水这篇了。

双系统

你也许会发现身边有许多装逼大神,用电脑就用电脑了,还非得矫揉造作地弄一个双系统,Windows+Linux,旁人一看,立马感觉逼格顶呱呱。双系统很好理解,无非就是一个选择问题,内部过程一目了然,一个if语句嘛。打个不合适的比方,就比如上厕所,这厕所就好比是操作系统,有男厕所、女厕所,你进厕所前就是一个选择嘛。下面我们就看一下机器是如何选择的。

实现原理

在谈实现原理之前,我们必须要搞清楚几个概念,也许你可能听说过这些概念,但却不知道它是干嘛用的,那么你很适合读这篇文章。

在看这些概念的过程中,你可以结合这张图来看。虽然有些繁体字,就当涨姿势了我滴乖。

这里写图片描述

BIOS

我靠,是你!BIOS,之前安装virtual box的时候还见过你,当时让我开启一下Intel VT-x,然后就需要让BIOS大哥帮忙。操作系统老师好像也讲过,好像。。。
那么这个BIOS到底是个什么鬼?Basic Input Output System。结合英文全称来说一下,基本输入输出系统。没错,BIOS 是开机的时候计算机执行的第一个程序,他会决定你开启电脑后的下一步工作。BIOS大哥知道你的磁盘里哪些可以开机,并且会读取第一个扇区的MBR,那什么又是MBR

MBR

Master boot record, MBR,翻译过来是主要开机记录,这又是什么鬼?我也不太明确这个定义,不过我确切的知道它是用来干嘛的。MBR是可以执行自己内部的开机管理程序的

开机管理程序

wtf?定义一个跟一个,什么鬼?客官您别着急,好戏马上开始。。。开机管理程序是干嘛的?开机管理程序会加载操作系统的核心文件。那就很清楚了吧,一个电脑里装上两个系统,只需要有两个开机管理程序就行了呗。
我们再来仔细看一下开机管理程序的其他功能。

选单、载入核心文件以及转交其它开机管理程序。转交这个功能可以用来实现了多重引导,只需要将另一个操作系统的开机管理程序安装在其它分区的启动扇区上,在启动 MBR 中的开机管理程序时,就可以选择启动当前的操作系统或者转交给其它开机管理程序从而启动另一个操作系统。

总结

捋一捋思路。一切从开启电源开始。。。

电源开启,电脑启动BIOS,BIOS读取第一个扇区的MBR,MBR看自己内部有没有开机管理程序(没有的话就废了,没装系统嘛),有的话,看看选单里面有啥东西,(如果安装了Linux和Windows),自身的开机管理程序是Windows的,并且可以转发到另一个开机管理程序。那么选单里就有两个选项,载入Windows和载入Linux,而载入Linux实际上是两个步骤,先转发到Linux开机管理程序的位置,然后由Linux的开机管理程序,载入Linux系统核心。

嗯,就这样了,照着图看更清晰哟。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux 双向链表是一种数据结构,它由若干个节点组成,每个节点都有两个指针,分别指向相邻节点的前驱和后继。这样,就可以通过一个节点遍历整个链表。 下面是双向链表的基本操作: - 插入:在链表的任意位置插入一个节点。 - 删除:从链表中删除一个节点。 - 查找:在链表中查找某个值。 - 遍历:遍历整个链表。 Linux 双向链表的实现通常使用结构体来表示每个节点。结构体中包含两个指针,分别指向前驱和后继节点,以及一个数据域,用于存储节点的值。 下面是一个简单的双向链表结构体的定义: ``` struct ListNode { int val; struct ListNode *prev; struct ListNode *next; }; ``` 在 C 语言中,可以使用 typedef 关键字来给结构体定义一个类型名称,方便使用: ``` typedef struct ListNode ListNode; ``` 然后就可以在程序中使用 ListNode 来定义双向链表节点了。 总结一下,Linux 双向链表是一种数据结构,它由若干个节点组成,每个节 ### 回答2: 双向链表是一种常用的数据结构,它有两个指针,指向前一个节点和后一个节点。Linux中的双向链表是一种通用的数据结构,在内核中被广泛使用。 Linux中的双向链表使用`list_head`结构体来定义链表节点,它包含了两个指针,`prev`和`next`,分别指向前一个节点和后一个节点。 为了创建一个双向链表,我们首先需要定义一个`list_head`类型的变量,作为链表的头节点。接着,在需要的地方定义其他节点,并将它们添加到链表中。 要将一个节点添加到链表中,我们需要做以下几个步骤: 1. 将节点的`prev`指针指向当前节点的前一个节点; 2. 将节点的`next`指针指向当前节点的后一个节点; 3. 将当前节点的前一个节点的`next`指针指向当前节点; 4. 将当前节点的后一个节点的`prev`指针指向当前节点。 通过这样的操作,我们就成功地将一个新节点插入到链表中。 双向链表的优点之一是可以在O(1)的时间复杂度内进行插入和删除操作。例如,要删除一个节点,只需要将当前节点的前一个节点的`next`指针指向当前节点的后一个节点,将当前节点的后一个节点的`prev`指针指向当前节点的前一个节点。最后,我们可以释放当前节点的内存。 总结来说,Linux中的双向链表通过`list_head`结构体和指针操作实现了一个通用的、高效的双向链表数据结构。它在内核中被广泛使用,用于管理各种资源和数据结构。 ### 回答3: 双向链表(Doubly Linked List)是一种数据结构,可以在每个节点中存储指向前一个节点和后一个节点的指针。相比于单向链表,双向链表可以在O(1)的时间内访问前一个节点,这使得双向链表在某些场景下更加高效。 在 Linux 中,双向链表常用于实现内核中的数据结构,如进程控制块(PCB)、进程列表以及文件系统的文件块链表等。 双向链表的实现原理可以概括为以下几个步骤: 1. 定义链表节点结构体:在 Linux 中,双向链表的节点结构体一般由包含数据元素以及指向前一个节点和后一个节点的指针组成。 2. 初始化链表:创建一个指向链表头节点和尾节点的指针,并将它们都设置为NULL。 3. 插入节点:要在链表中插入一个节点,首先需要为新节点分配内存,然后将新节点的指针指向前一个节点和后一个节点,同时更新前一个节点和后一个节点的指针,使它们指向新节点。 4. 删除节点:要删除一个节点,首先需要更新前一个节点和后一个节点的指针,将它们连接在一起,然后释放待删除节点的内存。 5. 遍历链表:通过沿着链表的指针依次访问每个节点,可以实现对链表中数据的访问、插入、删除等操作。 总结来说,双向链表通过在节点中存储指向前一个节点和后一个节点的指针,实现了在O(1)时间内访问前一个节点的能力。在 Linux 中,双向链表常用于实现各种数据结构,为内核提供高效的数据管理。通过合理地插入和删除节点,并利用链表的遍历操作,可以对链表中的数据进行快速访问和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值