随笔分类 - 课程 / 操作系统 / 操作系统介绍
摘要:一、位运算符 (一)真值表 位运算符作用于位,并逐位执行操作。“与” “&”、“或” “|” 和 “异或” “^" 的真值表如下所示: pqp&qp|qp^q 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 (二)例子 假设如果 A = 60,且 B = 13,现在以
阅读全文
摘要:一、硬件结构 冯诺依曼模型 存储器的层次结构 中断是什么 什么是软中断? 二、操作系统结构 内核 三、内存管理 为什么要有虚拟内存? 四、进程管理 进程 线程 调度 进程间有哪些通信方式? 竞争与协作 互斥与同步的实现和使用 经典同步问题 死锁的概念 五、调度算法 进程调度算法(调度) 内存页面置换
阅读全文
摘要:键盘可以说是我们最常使用的输入硬件设备了,但身为程序员的你,你知道「键盘敲入A 字母时,操作系统期间发生了什么吗」? 那要想知道这个发生的过程,我们得先了解了解「操作系统是如何管理多种多样的的输入输出设备」的,等了解完这个后,我们再来看看这个问题,你就会发现问题已经被迎刃而解了。 一、设备控制器 我
阅读全文
摘要:一、空闲空间管理 前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块,我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗? 那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法: 空闲表法
阅读全文
摘要:文件的数据是要存储在硬盘上面的,数据在磁盘上的存放方式,就像程序在内存中存放的方式那样,有以下两种: 连续空间存放方式 非连续空间存放方式 其中,非连续空间存放方式又可以分为「链表方式」和「索引方式」。 不同的存储方式,有各自的特点,重点是要分析它们的存储效率和读写性能,接下来分别对每种存储方式说一
阅读全文
摘要:我们从用户角度来看文件的话,就是我们要怎么使用文件?首先,我们得通过系统调用来打开一个文件。 fd = open(name, flag); # 打开文件 ... write(fd,...); # 写数据 ... close(fd); # 关闭文件 上面简单的代码是读取一个文件的过程: 首先用 ope
阅读全文
摘要:文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)。 VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提
阅读全文
摘要:文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。 文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。 Linux 最经典的一
阅读全文
摘要:我们来看看磁盘的结构,如下图: 常见的机械磁盘是上图左边的样子,中间圆的部分是磁盘的盘片,一般会有多个盘片,每个盘面都有自己的磁头。右边的图就是一个盘片的结构,盘片中的每一层分为多个磁道,每个磁道分多个扇区,每个扇区是 512 字节。那么,多个具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面,如上图
阅读全文
摘要:在了解内存页面置换算法前,我们得先谈一下缺页异常(缺页中断)。 当 CPU 访问的页面不在物理内存时,便会产生一个缺页中断,请求操作系统将所缺页调入到物理内存。那它与一般中断的主要区别在于: 缺页中断在指令执行「期间」产生和处理中断信号,而一般中断在一条指令执行「完成」后检查和处理中断信号。 缺页中
阅读全文
摘要:进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。 当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,并给其分配 CPU。 什么时候会发生 CPU 调度呢?通常有以下情况: 当进程从运行状态转到等待状态;(阻塞状态) 当进程从运行状态转到就绪状态; 当进程从等待状态转
阅读全文
摘要:在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那么,当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等
阅读全文
摘要:一、哲学家就餐问题 先来看看哲学家就餐的问题描述: 5 个老大哥哲学家,闲着没事做,围绕着一张圆桌吃面; 巧就巧在,这个桌子只有 5 支叉子,每两个哲学家之间放一支叉子; 哲学家围在一起先思考,思考中途饿了就会想进餐; 奇葩的是,这些哲学家要两支叉子才愿意吃面,也就是需要拿到左右两边的叉子才进餐;
阅读全文
摘要:在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,例如有互斥、同步的关系。 为了实现进程/线程间正确的协作,操作系统必须提供实现进程协作的措施和方法,主要的方法有两种: 锁:加锁、解锁操作; 信号量:P、V 操作; 这两个都可以方便地实现进程/线程互斥,而信号量比锁的功能更强一些,它还可以
阅读全文
摘要:在单核 CPU 系统里,为了实现多个程序同时运行的假象,操作系统通常以时间片调度的方式,让每个进程执行每次执行一个时间片,时间片用完了,就切换下一个进程运行,由于这个时间片的时间很短,于是就造成了「并发」的现象。 另外,操作系统也为每个进程创建巨大、私有的虚拟内存的假象,这种地址空间的抽象让每个程序
阅读全文
摘要:直接开讲! 每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。 Linux 内核提供了不少进程间通信的机制,我们来一起瞧瞧有哪些? 一、管道 如果你学过 Linux 命令,那你肯定很熟悉「|」这个竖线。 $ ps auxf |
阅读全文
摘要:进程都希望自己能够占用 CPU 进行工作,那么这涉及到前面说过的进程上下文切换。 一旦操作系统把进程切换到运行状态,也就意味着该进程占用着 CPU 在执行,但是当操作系统把进程切换到其他状态时,那就不能在 CPU 中执行了,于是操作系统会选择下一个要运行的进程。 选择一个进程运行这一功能是在操作系统
阅读全文
摘要:在早期的操作系统中都是以进程作为独立运行的基本单位,直到后面,计算机科学家们又提出了更小的能独立运行的基本单位,也就是线程。 一、为什么使用线程? 我们举个例子,假设你要编写一个视频播放器软件,那么该软件功能的核心模块有三个: 从视频文件当中读取数据; 对读取的数据进行解压缩; 把解压缩后的视频数据
阅读全文
摘要:我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,那么这个运行中的程序,就被称为「进程」(Process)。 现在我们考虑有一个会读取硬盘文件数据的程序被执行了,那么当运行到读取文件
阅读全文