- 博客(37)
- 收藏
- 关注
原创 5 Linux 网络编程基础 API
这两个函数也可用于面向连接的 socket 的数据读写,只需要把最后两个参数设置为 NULL 以忽略发送端、接收端的 socket 地址,已经建立了连接,双方知道对方地址。只有最后一个字符被当成正真的带外数据接收,服务器对正常数据的接收将被带外数据截断。判断 sockfd 是否处于带外标记,即下一个被读取到的数据是否是带外数据。建议 sock 在 listen 和 accept 之前设置选项信息。
2025-01-04 21:20:05
1206
原创 第10章 总结
通过逐行学习xv6操作系统,本书介绍了操作系统的主要思想。有些代码行承载了主要思想(例如,上下文切换,用户/内核边界,锁,等等),其中每一行都很重要;其他代码行提供了实现特定操作系统的思想的实例,很容易就能用别的方法完成(例如,更好的调度算法,更好的表示文件的硬盘数据结构,更好的允许并行事务的日志系统,等等)。所有这些思想都在一套特殊而成功的系统调用接口的背景之下展现,即Unix接口,这些思想也被沿用到其他操作系统设计之中。
2024-12-04 20:44:34
107
原创 第9章 再探并发
好的并行性能,不考虑并发的正确性,易懂的代码,在内核设计中三者兼得非常困难。直接使用锁是获得正确的最好方式,但并不总能成功。这一章重点介绍了xv6被迫以复杂方式使用锁的例子,以及xv6使用类锁但不是锁的技术。
2024-12-04 20:44:04
689
原创 第8章 文件系统
xv6文件系统实现组织为7层,如图8.1所示。硬盘层在virtio硬件驱动上读写块。缓冲区缓存层缓存了硬盘块,并且同步对它们的访问,保证同一时间内只有一个内核进程可以修改保存在任何特定块内的数据。日志层允许更高的层将对几个块的修改打包在一次传输中,保证遇到crash时以原子方式更新这些块(即所有的要么都更新了要么都没更新)。inode层提供了单独的文件,每个文件由一个有着唯一的i-编号,并包含一些持有文件数据的块的inode表示。
2024-12-04 20:43:27
877
原创 第7章 调度
任何操作系统都有可能运行比CPU数更多的进程,所以需要对如何在进程之间分享CPU时间进行妥善安排。理想的共享应该对用户进程透明。常用的方法是在硬件CPU上复用进程,给每个进程都呈现一种假象,它拥有它自己的虚拟CPU。这一章阐述了xv6怎样实现这样的复用。
2024-12-04 20:42:49
989
原创 第6章 锁
包括xv6在内的大部分内核,都交替执行不同的活动。交替执行的一个来源是多处理器硬件:计算机中有多个CPU独立执行,例如xv6的RISC-V。多CPU共享物理RAM,xv6利用共享,维护所有CPU都需要读写的数据结构。这种共享提高了一个CPU在更新一个数据结构到一半时,另一个CPU读取它的可能性。也提高了多个CPU同时更新同一个数据的可能性。没有仔细的设计,这种并行访问很可能导致错误的结果或者造成数据结构的破坏。即使是单处理器,内核也可能在不同线程之间切换CPU,导致它们的执行相互交替。
2024-12-04 20:42:18
704
原创 第5章 中断和设备驱动
驱动,是操作系统中管理特定设备的代码:它注册设备硬件,告诉设备执行操作,处理结果中断,并与可能在等待设备I/O的进程通信。驱动代码可能有很多小花招,因为驱动与它管理的设备协同执行。此外,驱动必须理解设备的硬件接口,这些接口可能很繁琐而且缺乏文档。需要操作系统关注的设备通常在操作系统中注册,以生成中断,中断是trap的一种。内核trap处理代码识别到设备产生中断后,调用驱动的中断handler;在xv6中,这个分发过程在devintr(kernel/tarp.c:177)中。
2024-12-04 20:41:23
330
原创 第4章 陷入与系统调用
有三种类型的事件会让CPU停止正常执行的指令,强制切换到指定的代码,处理这些事件。一种是系统调用,当用户程序执行ecall指令来让内核为它做一些事。另一种是异常:一个指令(用户或内核)做了一些非法的事,比方说除以0或者使用无效的虚拟地址。第三种是设备中断,当设备发信号说它需要关注时,比方说当磁盘硬件完成了读或写的请求。本书使用trap作为这些情况的通用术语。通常,不管trap发生时在执行什么代码,后面都需要恢复,这些代码不需要知道发生了什么不同的事。
2024-12-04 20:40:50
393
原创 第3章 页表
操作系统通过页表为每一个进程提供了它自己的私有地址空间和内存。页表决定了内存地址表示什么,也决定了哪部分物理地址可以被访问。它们允许xv6将不同进程的地址空间隔离开来,并将他们复用到同一物理内存上。页表提供了一个间接层,让xv6能玩一些小花招:将同一段内存(跳板页)映射到不同的地址空间,使用未映射的页来保护内核和用户栈。本章中其他部分解释了RISC-V硬件所提供的页表,以及xv6如何使用它们。
2024-12-04 20:40:05
745
原创 第2章 操作系统组织
xv6的隔离单元是进程(其他Unix操作系统也一样)。进程的抽象阻止了进程破坏或者监听另一个进程的内存、CPU、文件描述符等资源。它也阻止了进程破坏内核本身,这样进程就无法破坏内核的隔离机制。内核必须小心谨慎地实现进程抽象,因为问题应用或恶意应用可能会欺骗内核或者硬件,做一些坏事(例如规避隔离)。内核用来实现进程的机制包括用户/管理者模式标志,地址空间,以及线程时间切片。为了加强隔离,进程抽象欺骗程序,让它觉得拥有属于自己的私有机器。进程为程序提供了其他进程无法读写的私有内存系统,或者叫地址空间。
2024-12-04 20:39:26
393
原创 第1章 操作系统接口
操作系统的工作,一个是在不同程序之间共享计算机,一个是提供比硬件所提供的的服务更好用的服务集合。操作系统管理并抽象底层硬件,因此,举例来说,文字处理器不需要考虑自己用的是什么类型的硬盘硬件。操作系统将硬件在多个程序之间分享,让它们能同时运行(或看起来是同时运行)。最后,操作系统为程序间的交互提供受控的方法,这样它们就能共享数据或协同工作。操作系统通过接口向用户进程提供服务。设计一套好的接口很难。一方面,我们希望接口简单而狭窄,因为这样的接口容易正确地使用。
2024-12-04 20:38:41
452
原创 计算机网络和因特网
计算机科学领域的任何问题都可以增加一个间接的中间层来解决 ==> 分层主机间的通信问题各层的功能和协议+层与层间连接通信接口why ==> how ==> whattarget:协议定义了在两个或多个通信实体之间交换的报文的格式和顺序,以及报文的发送/接收或其它事件所采取的操作。因特网的描述方式:主机(端系统)通过通信链路和分组交换机的网络连接到一起。主机通过因特网服务提供商(ISP)接入因特网,每个 ISP 自身就是一个由多台分组交换机和多段通信链路组成的网络,各 ISP 为主机提供了各种不同类型的网络接
2024-08-21 09:26:44
579
原创 传输层_计算机网络
网络层提供了主机之间的逻辑通信运输层为运行在不同主机上的进程之间提供了逻辑通信nmap:端口扫描器ApplicationApplication-Layer ProtocolUnderlying Transport ProtocolElectronic mailSMTPTCPRemote terminal accessTelnetTCPSecure remote terminal accessSSHTCPWebHTTP,HTTP/3TCP(for HT
2024-08-04 10:13:34
926
原创 csapp:cache lab
给定一个物理地址,如何查询高速缓存的?看csapp的第六章的高速缓存存储器组织结构。详情请看csapp cache lab。模拟LRU,从一个文件中按行读取操作。是用什么数据结构存储?
2024-06-03 19:53:28
597
原创 FIFO:带尾指针的循环双链表
设计一个循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。要求能够在头进行删除,尾进行插入==>带尾指针循环双链表。
2024-05-25 11:33:45
376
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人