1 Star 1 Fork 0

巷雨微若 / betterPhper

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
操作系统.md 25.03 KB
一键复制 编辑 原始数据 按行查看 历史
yangqm 提交于 2022-03-31 10:07 . 1

中断和异常


  • 中断是为了实现多道程序并发执行引入的一种机制, 发生了中断, 就意味着需要操作系统介入, 开展工作, 由于操作系统的管理工作 (比如进程切换, 分配I/O设备等) 需要使用特权指令, 因此CPU要从用户态转为核心态, 中断可以使CPU从用户态切换为核心态, 使操作系统获得计算机的控制权. 有了中断, 才能实现多道程序的并发执行
  • 中断本质上是一种特殊的电信号,由硬件设备发向CPU,处理器接收到中断后,会马上向操作系统反映此信号的到来
  • 中断是由硬件引起的而不是软件
  • 一个设备的中断处理程序是它设备驱动的一部分,设备驱动程序是用于对设备进行管理的内核代码
  • 中断发生就意味着需要操作系统介入, 开展管理工作
  • 当中断发生时, CPU立即进入核心态
  • 进程从用户态切换到核心态有两种方式, 系统调用 和 中断
  • 中断机制, 当硬件设备想和系统通信的时候,它首先要发出一个异步的中断信号,去打断处理器的执行,中断通常对应着一个中断号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断
  • 硬中断和软中断, 硬中断,是CPU外部的硬件,引入的中断,随机的, 软中断,是由当前正在运行的进程所产生的,预先设计的。

系统调用


  • 系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务
  • 系统调用会使操作系统从用户态切换到核心态
  • 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,我们通常将这种软件称为内核,内核的接口被称为系统调用**(system call**)
  • 应用程序通过"系统调用"来操作计算机资源。计算机中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成,这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
  • 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
  • 高级语言最后会被编译成汇编语言, 系统调用的另一个好处是, 将操作系统调用硬件资源的复杂操作, 隐藏和封装起来, 从而为应用程序提供一个简单易用的接口

进程


  • 什么是进程 ? 进程是程序运行的实例, 进程是程序的一次执行过程,
  • 线程是CPU调度的单位, 进程是资源分配的单位
  • 进程是系统进行资源分配和调度的一个独立单元
  • 子进程与父进程的关系, 子进程是父进程的一个副本, 在只读访问的情况下父进程和子进 程可以共用同一内存页, 直到其中一个进程向某内存页面写入数据之前, 这称之为写时复制
  • 进程的几种状态及其转换 ,就绪态, 运行态, 阻塞态
  • 进程分为用户态和核心态(核心态进程管理着所有进程之间共享的资源,例如文件系统空间), 当用户态进程想要访问系统数据或功能则必须切换到核心态,
  • 进程运行所需的所有状态信息,可以称为进程的上下文
  • 进程从用户态切换到核心态有两种方式, 系统调用 和 中断
  • 进程间通信机制(信号量、消息队列、共享内存, 管道), 通过共享内存实现进程通信时,要互斥的访问共享内存空间, 通过管道实现进程通信,一个管道只能实现半双工通信,同一时间只能向管道写数据或者读数据,两者不能同时操作
  • 进程调度是操作系统中最基本的一种调度,
  • 进程在操作系统内核程序临界区中不能进行调度与切换
  • 进程调度分为抢占式非抢占式, 非抢占式只允许进程主动放弃处理器, 在运行过程中即便有更紧迫的任务到达, 当前进程依然会继续使用处理器, 直到该进程终止或主动要求进入阻塞态. 抢占式当一个进程正在运行时,如果有更紧迫的进程需要使用处理器, 则立即暂停执行当前进程, 转而将处理器分配给更重要紧迫的哪个进程
  • 进程互斥, 某段时间内只允许一个进程使用的资源称为临界资源 , 而每个进程访问临界资源的那段程序代码称为临界区 , 当进程访问临界资源时要实现进程的互斥访问
  • 在多道程序环境下,进程之间在单核CPU下是并发执行的,在多核CPU中可并行执行。所以进程之间存在相互制约,为了协调这种制约,实现资源共享和进程协作,我们引入了进程同步、进程互斥、进程通信。
  • 时间片: 时间片即TimeSlice,指的是分时复用过程中每个进程允许持续运行的最大时间配额单位。也就是说,如果A进程持续运行了一个TimeSlice,那么它必须考虑让出CPU资源给B进程
  • 在多核处理器的计算机上,进程的数量通常也是远远多于处理器数量的。因此,宏观上并行运行的多个进程在微观上往往属于分时复用。进程调度的本质是怎么样让进程更好地分时复用处理器资源。概括地说,进程调度包括调度策略进程切换两个重要话题 , 针对一个处理器来说,分时复用无非就是A进程的时间配额用完以后换到B进程的事情。在这个场景下,“如何选择B进程”就是调度策略,“如何运行B进程”就是进程切换。
  • 进程与线程最大的区别在于上下文切换过程中,线程不用切换虚拟内存,因为同一个进程内的线程都是共享虚拟内存空间的,线程就单这一点不用切换,就相比进程上下文切换的性能开销减少了很多。由于虚拟内存与物理内存的映射关系需要查询页表,页表的查询是很慢的过程,因此会把常用的地址映射关系缓存在 TLB 里的,这样便可以提高页表的查询速度,如果发生了进程切换,那 TLB 缓存的地址映射关系就会失效,缓存失效就意味着命中率降低,于是虚拟地址转为物理地址这一过程就会很慢。

线程


  • 线程可以称为轻量级的进程, 一个进程可能由若干线程组成,这些线程共享同样的数据和资源,但可能执行程序中不同的代码路径。
  • 从内核角度来说并没有线程这个概念, linux把所有的线程都当做进程来实现.内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程,相反线程仅仅被视为一个与其它进程共享某些资源的进程
  • 线程是一个基本的cpu执行单元, 也是程序执行流的最小单位
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。但是不能独立运行,必须依存在应用程序中,由应用程序提供多个线程执行控制。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。线程是处于动态条件下由操作系统维护的系统资源管理实体
  • 如果同一进程内的线程切换, 则不需要切换进程上下文, 系统开销相对于进程切换开销更小
  • 线程也有就绪, 运行, 阻塞三种状态
  • 线程几乎不拥有系统资源, 它们共享进程的资源
  • 不同进程内的线程切换, 会引起进程切换


  • 什么是竞态条件: 几个进程在访问资源时彼此干扰的情况通常称之为竞态条件,在对分布式应用编程时,这种情况是一个主要的问题,因为竞态条件无法通过系统的试错法检测。相反,只有彻底研究源代码(深入了解各种可能发生的代码路径)并通过敏锐的直觉,才能找到并消除竞态条件。
  • 临界区, 临界资源: 在计算机中,某段时间内只允许一个进程使用的资源称为临界资源 比如打印机,共享变量等等。而每个进程访问临界资源的那段程序代码称为临界区
  • 什么是原子操作, 原子操作指的是在执行过程中不能被中断的操作, 执行过程中,出现上下文切换行为,比如任务切换,中断处理等。都会影响原子操作的原子性。因此需要自旋锁spinlock[1]来保证操作指令序列不会在执行的中途受干扰
  • 操作系统引入了锁机制。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
  • 所谓的锁,可以理解为内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经上锁,则返回失败。解锁时,则把锁状态修改为空闲状态。
  • 死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁, 这些永远在互相等待的进程称为死锁进程.

内存


  • 内存是用于存放数据的硬件, 程序执行前需要先放到内存中才能被CPU处理
  • 进程地址空间, 是进程运行时所用到的虚拟地址的集合。
  • 每个进程都有一个自己的页表
  • 4GB是32位系统上可以寻址的最大内存(2的32次方 = 4GB
  • 页表用于建立用户进程的虚拟地址空间和系统物理内存(内存、页帧)之间的关联,同时指定了其中包含的页帧的数量和状态 (使用中或空闲)。页表用于向每个进程提供一致的虚拟地址空间。应用程序看到的地址空间是一个连续 的内存区。该表也将虚拟内存页映射到物理内存,因而支持共享内存的实现(几个进程同时共享的内存),还可以在不额外增加物理内存的情况下,将页换出到块设备来增加有效的可用内存空间
  • 虚拟内存, 虚拟内存的基本思想是: 每个程序拥有自己的地址空间, 这个空间被分割成多个块, 每一块称做一页或页面( Page ). 每一页有连续的地址范围. 这些页被映射到物理内存
  • 分页, 我们把程序分成等长的小块。这些小块叫做“页(Page)”,同样内存也被我们分成了和页面同样大小的”页框(Frame)“,一个页可以装到一个页框里。在执行程序的时候我们根据一个页表去查找某个页面在内存的某个页框中,由此完成了逻辑地址到物理地址的映射
  • 为了能知道进程的每个页面在内存中存放的位置, 操作系统要为每个进程建立一张页表
  • 程序访问内存时存在访问局部性。时间局部性指之前访问过的内存位置有可能再次被访问,空间局部性指之前访问过的内存位置的附近位置有可能被该程序访问。 CPU根据这种局部性,在程序访问内存时,会将当前访问内存位置及其附近位置的数据存入CPU缓存以减少内存访问来节省时间,硬盘和内存之间也同理. 这就是我们访问过网页后再次访问会感觉明显变快的原因
  • 现代计算机里的存储器类型分别有:寄存器、高速缓存、主存和磁盘,这些存储器的速度逐级递减而容量逐级递增 。存取速度最快的是寄存器

文件


  • 页( 内存操作的基本单位 ) ,磁盘块( 磁盘操作的基本单位 ), 内存页的大小与磁盘块的大小一致, 在Linux中它们的大小为4096 Bytes也就是4KB,
  • 磁盘块是文件系统读写数据的最小单位。扇区( 512 Bytes )是磁盘最小的物理存储单元,操作系统将相邻的扇区组合在一起,形成一个块,对块进行管理。每个磁盘块可以包括 2、4、8、16、32 或 64 个扇区。磁盘块是操作系统所使用的逻辑概念,而非磁盘的物理概念
  • 硬盘的读写以扇区为基本单位。磁盘上的每个磁道被等分为若干个弧段,这些弧段称之为扇区。硬盘的物理读写以扇区为基本单位。通常情况下每个扇区的大小是 512 Bytes。 值得注意的是, 操作系统是不直接与扇区交互的,而是与多个连续扇区组成的磁盘块交互
  • 操作系统并不关心文件内容是什么, 操作系统所见到的就是字节, 其文件内容的任何含义只在用户程序中解释
  • 磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。 - 超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。 - 索引节点区,用来存储索引节点; - 数据块区,用来存储文件或目录数据;
  • 进程打开文件表, 每个进程打开过的文件都会存储在进程的打开文件表中, 所谓的文件描述符指的是文件打开表中的索引, 通过这个索引可以从打开文件表中找到对应的文件, 从而对文件进行操作
  • 打开文件时并不会把文件数据直接导入内存, 而是将文件目录项中的信息复制到内存中的打开文件表中, 并将打开文件表的索引( 文件描述符 )返回给用户, 用户通过这个索引查询打开文件表, 然后直接操作文件,而不用再查询文件目录表了
  • 每个目录下都有一个目录表, 目录表存储着当前目录下的所有文件信息, 打开/root/data/db.txt这个文件时,操作系统会去/root/data这个文件夹下的目录表中找到db.txt文件所对应的目录项, 然后将目录项中的信息复制到内存中的打开文件表中, 目录项中存储了文件的必要信息, 通过目录项才能找到文件在磁盘中存储的具体数据
  • 系统中的打开文件表分为系统打开文件表进程打开文件表, 前者存储了系统当前所打开的所有文件信息, 而后者只存储了进程当前所打开的文件信息
  • Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构。索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。
  • 当我们调用write函数往磁盘写数据时, 数据并不是立马写入磁盘的, 这涉及到一个概念延迟写, 大部分情况都是写入到PageCache中就返回了, 这时并没有真正写入磁盘。我们的数据会在下列时机下被真正发起写磁盘IO请求: 1, 发现PageCache中脏页占比太多 , 2, 超过了脏页刷新时间,比如30秒, 这样做的目的是减少磁盘IO,然后一次性写入到磁盘
  • ROM “只读储存器” , ROM中的数据在出厂时就写入了, 并且以后不能修改

输入/输出


  • I/O设备可以分为两类: 块设备字符设备块设备把信息存储在固定大小的块中, 每个块都有自己的地址, 所有传输以一个或多个完整的块为单位, 硬盘是属于块设备, 字符设备以字符为单位发送或接收一个字符流, 字符设备是不可寻址的, 打印机, 鼠标 都是字符设备
  • 当I/O设备完成它的工作时, 它会产生一个中断信号, 该信号被中断控制器检测到并由它决定做什么, 如果没有其它中断, 中断控制器将立即对中断进行处理, 如果有其它中断正在处理, 该I/O设备将继续置起中断信号, 直到得到CPU的服务

其它


  • 时钟频率经常被当作处理器营销的主要指标, 但这有可能让人误入歧途, 即使你系统里的CPU看上去已经完全利用( 达到瓶颈 ), 但更快的时钟频率并不一定会提高性能----它取决于CPU周期里到底在做什么, 如果它大部分时间是停滞等待内存访问, 那更快的执行实际上并不能提高CPU指令的效率或者负载吞吐量
PHP
1
https://gitee.com/null_488_0272/better-phper.git
git@gitee.com:null_488_0272/better-phper.git
null_488_0272
better-phper
betterPhper
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891