月度归档: 2021年7月

12 篇文章

IO Multiplexing (二)
在前面一篇文章中,简要地介绍了在几个io多路复用的api的使用以及它们各自的优缺点.然而,对于epoll还有不少东西.如epoll的两种触发模式--边沿触发(edge trigger)和水平触发(level trigger).此外,epoll往往和非阻塞io搭配在一起使用,那么为什么epoll要和非阻塞io搭配在一起呢,是否有更好的效率呢? 本文用…
GoLang: Defer,Panic,Recover,Closure
GoLang: Defer,Panic,Recover,Closure 本文主要内容来自: GoLang Blog--Defer, Panic, and Recover GoLang Spec--Defer statements 接下来先简要的介绍defer,panic和recover的使用,最后在介绍一些defer和closure(闭包)组合在一…
Java并发编程基础
什么是线程 为了说明什么是线程,首先需要强调一点,什么是进程。所谓进程,就是正在运行的程序代码。每个进程之间是相互隔离的,两个进程有不同的栈,堆,寄存器组,PC,虚拟地址空间等。而线程是进程中更小的单位,与进程相类似,每一个线程也有他自己的context,包括它自己的寄存器,PC,栈等。但是一个线程会共享创建它的父进程的中的堆,打开的文件(即文件描…
volatile 关键字
因为CPU缓存的关系,以及指令的重排等等原因。有时候线程操作的变量往往是它从内存中复制过来到CPU缓存内的,所以修改完了如果没有flush到内存,那么可能会出现不一致。道理大概是这么个道理,在Java中,每个线程有自己的缓存大小,对于数据操作的时候,先操作线程内部的数据。所以其他线程对于该数据的变化看不到。所以引入了volatile 关键词来保证,…
TCP Data Flow and Window Management
在前面的内容,我们主要关注TCP如何建立连接的,以及TCP是如何保证数据的可靠传输的,如何来处理报文的丢失的。在本章中,一开始先介绍下在交互性较强的应用中TCP是怎么做的。比如说在在线游戏,按下一个键,按下一下鼠标就要发送一个TCP报文,这种情况下报文中的TCP header占据了更多的内容,有效字节(数据)非常少,游戏的操作往往是十分频繁的,那么…
TCP Congestion Control
在本章中,我们将会关注拥塞控制的问题,它是在大数据(bulk data)传输中很重要第一个问题。TCP拥塞控制能够保证网络不会被overwhelmed。最简单的方法就是,当TCP认为网络拥塞的时候,就降低发送速度。所以问题就是:如何判断认为网络是拥塞的以及TCP如何来降低发送速率,以及什么时候可以再提高速率。 TCP被设计为数据在双方之间可以可靠传…
MIT6.828 HW2 Shell
环境 系统Ubuntu 20.04 64位系统 HW地址:HW2-Shell 正文 本次实验难度一般般,不需要写很多的代码,并且能够帮我们熟悉常用的Unix system call((),比如说open,close等等。在正式做这个作业之前,务必先阅读xv6Book chapter 0。记下chapter 0中的对于各个system call的详细…
Mit6.828 lab5
环境 deepin 20 64 位系统 说在前面 本次Lab我也觉得比较难,到最后也有部分测试点没有通过,在实现pipe上也有点问题。另外,我觉得Lab5这部分和xv6中对于Unix的一些知识点的实现稍微有些不同(至少我是这么认为的,这个lab中的很多知识点我选择了认真阅读xv6的代码来理解)。比如说pipe的实现,file descriptor的…
Mit6.828 lab4 Part C
环境 deepin 20 实验地址:mit6.828 2018 lab4 partC 很重要:不知道是不是我的代码实现有些问题,请把lib/syscall.c中的sys_ipc_recv()中的 return syscall()的第二个参数由1改为0。具体看文末 正文 在lab4的最后一部分,你将会修改内核的代码来从uncooperative的进程…
Mit6.828 lab4 Part B:Copy-on-write fork
环境 deepin 20(Ubuntu系统老遇到小问题,就换到deepin去了) lab原地址:mit6.828 lab4 本次lab关键在于理清里面代码的逻辑 正文 正如前面说提到的,Unix提供了fork()来作为他的创建进程原语。fork()这个系统调用复制了父进程的地址空间到子进程中去。 xv6通过复制父进程所有的内容来实现fork().这…