Network 网络协议 Browser => LAN => Http server(本地通信由以太网负责) 但是这不能建立一个简单的网络,如果希望建立一个庞大的网络,需要网络层协议: Broswer => LAN1 => Router => LAN2 => http server(远程通信由IP层负责) 以太网协议 12345678910111213141516171819# 2023-10-05 操作系统 #操作系统,计算机基础, C
File system Recovery 这里我们关心的crash或者故障包括了:在文件系统操作过程中的电力故障;在文件系统操作过程中的内核panic。包括XV6在内的大部分内核都会panic,panic可能是由内核bug引起,它会突然导致你的系统故障,但是你肯定期望能够在重启之后还能使用文件系统。 你可能会反问,怎么就不能使用文件系统了?文件系统不是存储在一个持久化的存储设备上吗?如果电力故障了,存储设备不会受影响,当电脑恢复运行时,存 2023-10-05 操作系统 #操作系统,计算机基础, C
Intertupt 背景知识: 通常一个简易的RISC-V处理器由三大块构成,一是执行指令流水的core,二是平台中断控制的PLIC,三是负责调试的DM(debug module) PLIC(platform-level interrupt controller),平台级中断控制器。用来将外部的全局中断请求处理后转至中断目标。PLIC理论上支持1023个外部中断源和15872个上下文,但真实设计实现时一般不需要这么多 2023-10-05 操作系统 #操作系统,计算机基础, C
Virtual Memory 如果按传统的做法,会直接将父进程的数据拷贝到子进程中,拷贝完之后,父进程和子进程之间的数据段和堆栈是相互独立的。 但是,以我们的使用经验来说:往往子进程都会执行exec()来做自己想要实现的功能。 所以,如果按照上面的做法的话,创建子进程时复制过去的数据是没用的(因为子进程执行exec(),原有的数据会被清空) 既然很多时候复制给子进程的数据是无效的,于是就有了Copy On Write这项技术了 2023-10-05 操作系统 #操作系统,计算机基础, C
File system Performance 首先来回顾一下XV6的logging系统。我们有一个磁盘用来存储XV6的文件系统,你可以认为磁盘分为了两个部分: 首先是文件系统目录的树结构,以root目录为根节点,往下可能有其他的目录,我们可以认为目录结构就是一个树状的数据结构。假设root目录下有两个子目录D1和D2,D1目录下有两个文件F1和F2,每个文件又包含了一些block。除此之外,还有一些其他并非是树状结构的数据,比如bitmap表 2023-10-05 操作系统 #操作系统,计算机基础, C
Lock app wants to multiple cores. Kernel must handle parallel syscalls and access shared data structures in parallel. locks for correct sharing locks can limit performance 为什么使用锁?避免race conditions 加锁的目的就 2023-10-05 操作系统 #操作系统,计算机基础, C
Sleep & Wakeup 像锁一样,sleep是另一种帮助程序线性化的工具 场景: 等待管道有数据 等待磁盘读取完成 wait系统调用,等待子进程完成某个事件 以软件的形式模拟: 123Busy wait: while pipe buf is empty {} // 这样cpu空转,浪费cpu资源,最好的做饭是类似swtch一样学会放弃cpu,直到某个事件发生,才重新拥有cpu控制权,sleep和w 2023-10-05 操作系统 #操作系统,计算机基础, C
Virtual Memory and Page Table 内存分配:由proc.h里的freerange函数管理,以链表的形式进行管理 地址空间(Addr space) 在RISC-V主板上,内存是由一些DRAM芯片组成。在这些DRAM芯片中保存了程序的数据和代码。例如内存中的某一个部分是内核,包括了文本,数据,栈等等;如果运行了Shell,内存中的某个部分就是Shell;如果运行了cat程序,内存中的某个部分是cat程序。这里说的都是物理内存,它的地址 2023-10-05 操作系统 #操作系统,计算机基础, C
Thread Switch 线程切换的重点 如何实现线程间的切换? 这里停止一个线程的运行并启动另一个线程的过程通常被称为线程调度(Scheduling)。我们将会看到XV6为每个CPU核都创建了一个线程调度器(Scheduler)。 如何保存线程状态?当你想要实际实现从一个线程切换到另一个线程时,你需要保存并恢复线程的状态,所以需要决定线程的哪些信息是必须保存的,并且在哪保存它们。 如何处理运算密集型线程(compute 2023-10-05 操作系统 #操作系统,计算机基础, C
计算机网路五 拥塞控制 什么是congestion control 网络流量在某段时间可能发生急剧地上升,这个时候网络交换机或者路由器的buffer没办法承受过大的流量,就会发生溢出,导致丢包,进而导致重传,更进一步加剧网络拥堵 所以需要一系列的策略(拥堵控制)来缓解这种情况,拥堵控制和前面所提到的流量控制有点类似,流量控制是为了网络流量超出了end point的承受范围;而拥堵控制是为了避免超出网络中的中间节 2023-07-29