操作系统
文章平均质量分 93
操作系统,实例主要基于 Linux 0.11
槑!
这个作者很懒,什么都没留下…
展开
-
【操作系统系列】Linux 零拷贝技术
零拷贝使用场景在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能。这时候服务端的任务是:将服务端主机磁盘中的文件不做修改地从已连接的socket发出去,通常用下面的代码完成// 循环的从磁盘读入文件内容到缓冲区,再将缓冲区的内容发送到socket。 while((n = read(diskfd, buf, BUF_SIZE)) > 0) write(sockfd, buf , n);但是由于Linux的I/O操作默认是缓冲I/O。这里面主要使用原创 2021-01-22 17:06:05 · 293 阅读 · 0 评论 -
【操作系统系列】IO 多路复用 epoll 详解
epollepoll_createint epoll_create(int size);epoll_create 会创建一个 epoll 实例,同时返回一个引用该实例的文件描述符。返回的文件描述符仅仅指向对应的 epoll 实例,并不表示真实的磁盘文件节点。其他 API 如 epoll_ctl、epoll_wait 会使用这个文件描述符来操作相应的 epoll 实例。当创建好 epoll 句柄后,它会占用一个 fd 值,在 linux 下查看 /proc/进程id/fd/,就能够看到这原创 2021-01-21 23:56:33 · 781 阅读 · 1 评论 -
【操作系统系列】Linux 网络 IO 模型
Linux 网络 IO 模型五种 IO 模型5 种(前4种IO都可以归类为synchronous IO - 同步IO)blocking IO - 阻塞IOnonblocking IO - 非阻塞IOIO multiplexing - IO多路复用signal driven IO - 信号驱动IO (使用较少,不介绍)asynchronous IO - 异步IOIO模型的异同点就是区分在两个系统对象、两个处理阶段的不同上两个系统对象:(1) 用户进程(线程)Process;(2)原创 2021-01-21 23:55:10 · 210 阅读 · 0 评论 -
【操作系统系列】Linux 完整文件系统实现
L5:文件系统如何组织多个文件----文件目录树从多个文件的使用角度出发来思考这个组织方式。面对多个文件,对用户来说,最重要的操作是从中找到某个文件,即文件检索操作。在用户眼里,操作系统磁盘就是操作一个目录树。用户可以访问这棵目录树,也可以修改这棵目录树,可以在目录树上添加新的目录和文件,也可以删除已有的目录和文件等。实现磁盘的抽象就是实现目录树目录树由文件和目录(目录实际上也是目录文件,也有自己的 FCB)两部分组成。文件的实现已经在 L4 中给出了详细论述,所以实现目录树的关键就是实原创 2021-01-21 01:01:11 · 563 阅读 · 0 评论 -
【操作系统系列】基于文件的磁盘使用
基于文件的磁盘使用L4:引出文件抽象到现在,用户通过盘块号来调用 bread 函数,就可以读写磁盘了直接通过盘块号来使用磁盘,即使对那些熟知磁盘块的程序员也很不方便,例如要将一块很大的内容写到多个磁盘块中,此时程序员需要自己记住这块内容中的哪一段被写到哪一个盘块中,因为将来要根据这个对应关系再从磁盘的相应块中取出这些数据内容。为了让磁盘上的数据访问更符合人的习惯,操作系统引出了磁盘使用的第四层抽象—文件,文件是一个连续的字符流。不管是什么数据,也不管这个数据内容有多大,我们都将其看成是一个字符原创 2021-01-21 00:58:09 · 528 阅读 · 0 评论 -
【操作系统系列】磁盘请求队列调度与内核高速缓存
L2:多进程产生的请求队列第二层抽象多个磁盘读写请求现在我们可以处理一个磁盘块读写请求了,但操作系统中有多个进程,每个进程都会提出磁盘块访问请求,所以在实际操作系统中是多个进程产生多个磁盘块读写请求的情形。经过第一层抽象以后,只要告诉操作系统要读写的盘块号就可以完成磁盘读写。多个磁盘读写请求,需要用队列来组织这些请求,这就是操作系统对磁盘管理的第二层抽象。经过第二层抽象以后,想进行磁盘读写的进程首先建立一个磁盘请求数据结构,并在这个数据结构中填上要读写的盘块号,然后将这个数据结构放原创 2021-01-21 00:54:38 · 975 阅读 · 0 评论 -
【操作系统系列】磁盘基本原理与盘块编号
磁盘的基本原理磁盘工作的原理(1)从 CPU 开始,当用户想要使用磁盘时,由 CPU 发送命令给磁盘设备,最终通过“out ax, 端口号”指令告诉磁盘具体的动作细节。(2)从磁盘开始,即磁盘在工作完成后用磁盘中断告诉 CPU,CPU 在中断处理中完成后续工作,如将磁盘读入的内容拷贝到用户态内存 buf 中等。磁盘读写的具体过程是:(1)磁头移动,找到要读的那个柱面(Cylinder,简称 C),由于多个磁头是绑在一起移动的,所以每个磁头下面的磁道在各自的盘面中具有同样的位置,所有磁头下面原创 2021-01-21 00:51:27 · 5616 阅读 · 3 评论 -
【操作系统系列】设备驱动 printf 与 scanf 实现
驱动的基本原理外设的工作原理计算机外设的工作原理,即 CPU 对外设的使用主要由如下两条主线构成:第一条主线是从 CPU 开始,CPU 发送命令给外部设备,最终表现为 CPU 执行指令“out ax, 端口号”;第二条主线是从外设开始,外设在完成工作后或出现状态变化时通过中断通知 CPU,CPU 通过中断处理程序完成后续工作。第一条主线的主题词是“发出命令”,第二条主线的主题词是“中断处理”文件视图让应用程序员通过命令来直接操作计算机外部设备的想法几乎不可行,这就引出了文原创 2021-01-21 00:48:50 · 882 阅读 · 0 评论 -
【操作系统系列】页面换入换出实现
换入换出即:虚拟地址个数大于物理内存时,就要换入换出(比如 32 位系统,物理内存只有 2G,那么就要换入换出,因为分配了 4G 个存储单元(1M 个页),但只有 2G 个物理存储单元(500K 个物理页)如果虚拟内存都可以映射到物理内存上,那么虚拟内存这个思想就没有存在的必要了。这个换入换出时机发生在缺页中断,之所以会缺页是因为要 get_new_page 没有时,会选物理页换入磁盘,然后将该物理页对应的页表项标志为不在内存(页表项最后一位),那么 MMU 在对虚拟地址进行 IO 时,就会有原创 2021-01-21 00:46:34 · 1636 阅读 · 0 评论 -
【操作系统系列】虚拟内存及 Linux 实现
虚拟内存原因:程序用户想要分段,物理内存想要分页采用一个中间结构将段、页结合在一起将程序分成多个段,并从中间结构上分割出一些区和每个段建立映射,完成分段机制;将中间结构分割成页,将这些页放到物理内存的页框中,并建立这个页和页框的映射,完成分页机制。中间结构是一个看起来和物理内存一样,但没有对应物理存储单元的虚拟内存,正是虚拟内存这个关键概念(抽象)将分段机制和分页机制有机地结合在一起。构建虚拟内存的核心步骤在虚拟内存中分段、建立段表、虚存页映射到空闲物理页框、建立页表说明:段原创 2021-01-21 00:43:54 · 353 阅读 · 0 评论 -
【操作系统系列】程序重定位与内存分区
程序重定位运行时重定位在编译形成可执行程序时,用到的地址都是从 0 开始的相对地址,这个地址通常被称作逻辑地址,当程序被载入到物理内存中时,可能使用任意一段空闲物理内存此时为保证程序的顺利执行,就需要进行程序重定位(Relocation),即将程序中的逻辑地址对应到实际使用的物理内存地址。编译时重定位如果选择编译时修改地址,那就是编译时重定位。在编译产生可执行代码时,要将程序中出现的逻辑地址全部加上物理起始地址以后再写入可执行文件。编译时重定位显然不能用于任务不断“启动 - 退出”的通用原创 2021-01-21 00:42:05 · 1789 阅读 · 0 评论 -
【操作系统系列】进程死锁及处理策略
死锁条件及预防死锁发生的四个基本条件互斥(Mutual Exclusion):资源不能被共享,一个资源每次只能被一个进程使用。不可剥夺(No Preemption):进程已获得的资源,在未使用完之前,不能强行剥夺。请求与保持(Hold and Wait):一个进程因请求资源而阻塞时,对已获得的资源保持不放。循环等待(Circular Wait):若干进程之间形成一种头尾相接的循环性资源等待关系。一旦能够破坏这四个必要条件中的某个条件,死锁也就不会形成了,这就是死锁预防的基本想法。“互斥原创 2021-01-20 23:59:01 · 504 阅读 · 1 评论 -
【操作系统系列】临界区算法与信号量实现
信号与信号量在需要同步的位置上,进程将自己阻塞起来等待信号;当该进程所依赖的进程执行到步调一致以后,会向操作系统发出信号;操作系统收到信号以后,将阻塞进程唤醒执行。信号量的准确定义:(1)信号量就是一个整型变量,用来记录和进程同步有关的重要信息;(2)能让进程阻塞睡眠在这个信号量上;(3)需要同步的进程通过操作(加 1 和减 1)信号量实现进程的阻塞和唤醒,即进程间的同步。因此,信号量就是一个数据对象以及操作这个数据对象的两个操作其中数据对象是信号量数值以及相应的阻塞进程队列原创 2021-01-20 23:58:16 · 1300 阅读 · 2 评论 -
【操作系统系列】CPU 调度算法与实现
CPU 调度含义与算法准则含义CPU 调度就是在就绪线程/进程队列中选择一个合适的线程/进程,再通过切换机制将 CPU 资源分配给选择出来的线程/进程。如果操作系统支持线程,线程是 CPU 调度的基本单位,否则进程就是 CPU 调度的基本单位。准则CPU 调度的关键在于如何确定哪一个任务更合适是目前为止最先来的任务呢?还是在其他特性上满足一定条件的后到任务?CPU 调度是一个没有对错的算法,只要从就绪队列中选择出来一个任务就是正确的调度算法CPU 调度只有好坏之分,即给出的原创 2021-01-20 23:57:44 · 1391 阅读 · 0 评论 -
【操作系统系列】多进程起点 0 号和 1 号进程
0号进程多进程图像是操作系统的核心图像,而多进程图像得以不断延续、演变的核心就是创建进程的系统调用 fork()fork() 的核心是通过拷贝父进程来创建子进程,这样系统中的所有进程都是从 0 号进程和 1 号进程继承来的,因此这两个进程就显得非常重要。0号进程信息fork() 的基本工作原理是通过拷贝父进程的信息来创建子进程,0 号进程是操作系统中的第一个进程,0 号进程不可能有父进程。所以在创建 0 号进程时需要手动设置进程信息,那么需要设置哪些信息呢?无非还是那几样重要信原创 2021-01-20 23:57:07 · 682 阅读 · 0 评论 -
【操作系统系列】用户级线程与内核级线程实现
用户级线程用户级线程与内核级线程线程就是要在一个地址空间下启动并交替执行的多个执行序列执行序列就是一段执行中的程序,这多段程序完全可以只出现在用户态程序中,即操作系统完全不知道这些线程的存在,这样的线程被称为 用户级线程。和用户级线程概念相对应的是内核级线程,能在同一地址空间中交替执行并交由操作系统管理的执行序列就是内核级线程。总的来说创建一个用户级线程就是创建出来一个可以让 CPU 切换进去的初始样子线程栈有自己私有的栈(所谓的私有是指每个线程在堆栈段都有自己对立的 ESP,这样的目的原创 2021-01-20 23:56:50 · 1679 阅读 · 0 评论 -
【操作系统系列】进程视图与基本问题
概念与视图概念进程用来描述一个程序及其执行过程中的信息,即描述一个执行中的程序,所以才将其命名为进程,即进行中的程序。进程是管理 CPU 引出的概念,而 CPU 管理又是计算机管理的核心,所以进程这个概念的理解对于理解整个操作系统而言是最重要的。再具体化一些进程描述的是“程序以及反映程序执行信息的数据结构的总和”,因此这个数据结构就成为认识进程的一个关键。人们给这个数据结构定义了一个基本概念,即进程控制块(Process Control Block,简写为 PCB)多进程图像CPU原创 2021-01-20 23:56:29 · 1565 阅读 · 0 评论 -
【操作系统系列】内核接口与实现原理
系统接口Shellshell 程序实际上 shell 也是一个用户程序,和 ls、hello 也没有本质区别。只是 shell 程序是在系统初始化的最后一步由操作系统执行起来的,而不像很多其他程序,如 ls 等,是由用户在 shell 中键入命令才执行的。核心实现main(){ char cmd[100]; while(1) { scanf(”[/usr/root]#%s”, cmd); // 如果是子进程,则执行 cmd原创 2021-01-20 23:56:02 · 920 阅读 · 0 评论 -
【操作系统系列】Linux 系统启动:head.s、main.c
3、head.s这是进入 32 位保护模式以后要执行的第一段代码 head.s对操作系统管理资源的关键数据结构进行初始化,但初始化之前准备工作还没有做完:(1)设置中断表 IDT,因为从现在开始操作系统不再使用 BIOS 中断了,实际上将 system 从 0x10000 挪到 0x0地址处,BIOS 中断就没法使用了,因为 BIOS 中断向量表就放置在 0 地址处;另一方面,接管中断是操作系统必须要做的事,因为不同的操作系统遇到同一中断(如时钟中断)要做的事情不会相同。(2)设置 GD原创 2021-01-20 23:55:41 · 620 阅读 · 0 评论 -
【操作系统系列】Linux 系统启动:bootsect.s、setup.s
系统启动总体启动过程:(1)BIOS 读入了操作系统的第一个扇区 bootsect.s 文件,然后执行 bootsect.s 执行;(2)bootsect.s 又读入了操作系统的 setup.s 文件,将来交给 setup.s 执行,在其中会完成一些操作系统设置工作;(3)接下来 bootsect.s 还要读入操作系统的主体模块 system 模块,在setup.s 执行完成以后到 system 执行中。在计算机加电以后,硬件电路会初始化设置PC 寄存器的值。对于 IBM PC 而言,这个原创 2021-01-20 23:55:22 · 2293 阅读 · 2 评论