一、操作系统概述
阅读笔记:https://blog.csdn.net/qq_36894974/article/details/104554120
1、计算机硬件
- 用户通过软件——操作系统来控制计算机的硬件执行命令,比如cpu、内存、硬盘、鼠键等等这些都是硬件。
- 软件分为了
用户态
和内核态
1)shell 或者 GUI处于用户态中,用户态就是允许用户运行各种程序。
2)操作系统是软件中最基本的部分,它运行在内核态中,操作系统具有硬件的访问权,可以执行机器能够运行的任何指令。
1.1 CPU
- CPU 是计算机的大脑,它主要和内存进行交互,从内存中提取指令并执行。CPU的一个周期为:取指—>解码—>执行。每个 CPU 都有一组可以执行的特定指令集。
流水线
和超标量
这些执行方式,是因为cpu的访问、解码和执行单元可能是单独的,或者说有时有多个取指、解码和执行单元,所以看起来能多个指令一起工作。 - 由于cpu访问内存要时间,所以cpu内部会包含一些寄存器:
通用寄存器
来放关键变量和临时结果;特殊寄存器
有:程序寄存器,放下一条需要从内存提取指令的地址;堆栈指针,指向内存中当前栈的顶端,这个地方可能放了有关参数、局部变量以及没有保存在寄存器中的临时变量。程序状态字寄存器(PSW),跟踪当前系统的状态。除非发生系统结束,否则我们可以忽略 PSW 。 - CPU 有内核态和用户态两种模式,由PSW寄存器中的一个二进制位来实现切换。用户程序必须使用
系统调用
(system call)后,系统调用会转换为内核态并且调用操作系统。- 当运行在内核态时,CPU 能够执行任何指令集中的指令并且能够使用硬件的功能。
- 在用户态下,CPU 只能执行指令集中的一部分并且只能访问硬件的一部分功能。一般情况下,在用户态下,有关 I/O 和内存保护的所有指令是禁止执行的,更不能改PSW。
- 多核和多线程
CPU的多线程
,是指CPU 能保持多个不同的线程状态并且在纳秒级的时间完成切换。多线程不会提供真正的并行处理,在一个时刻只有一个进程在运行。每个线程对操作系统来说都像是一个单个的 CPU,多个线程就像是多个CPU。
许多 CPU 芯片上都具有四个、八个或更多的内核。多核芯片
就是一个CPU拥有多个核心,每个核心拥有独立的运算处理单元、控制器、寄存器、L1、L2缓存,然后一个CPU的多个核心共享最后一层CPU缓存L3,使其可以同时运行一个进程的多个线程。也有的是L2就共享了。其他的硬件资源都是共享的。
1.2 存储系统
这部分也可以参考crash course的科普:https://www.bilibili.com/video/BV1EW411u7th?p=19
内存应该要快、大、便宜
,不拖慢cpu的执行指令的效率。但无法同时满足三点,所以就有了分层存储结构
。有四层,从上到下分别是:寄存器、高速缓存、主存(内存)、磁盘
,从上到下越来越慢、大、便宜。上层里的内容是从下层里取出来的,是下一层数据的子集。
寄存器是在cpu中,和制作cpu是一样的材料,跟cpu一样快,但很小,就不再多说了。
1.2.1 高速缓存
高速缓存是介于CPU和内存之间
的临时数据交换的缓冲区。高速缓存分为L1、L2、L3三级(层)缓存,由SRAM构成,主存是用DRAM做的,SRAM和DRAM都是断电数据就掉了,但S要比D快很多。每一个缓存里都有许多缓存行。(高速缓存有很多细节,详见CSAPP)
1.2.2 内存(主存)
也叫主存,由DRAM和ROM
组成。ROM又快又便宜,但放进去东西后就改不了,只读不可写,来存放一些系统程序,比如开机的时候的BIOS,bootstrap引导加载模块。RAM就是放那些所有不能再高速缓存中找到的东西,都来这个DRAM里找。
1.2.3 外部存储器——磁盘
- 上面的都是内部存储器,磁盘是外部存储器,即CPU不能直接访问的存储器,它需要经过内存与CPU及I/O设备交换信息,用于长久地存放大量的包括暂不使用的程序和数据。
- 磁盘同 RAM相比,每个二进制位的成本低了两个数量级,容量大了两个数量级,但是随机访问数据时间大约慢了三个数量级。磁盘访问慢的原因是因为磁盘的构造不同。机械磁盘是一种机械装置,有磁道、柱面等内容。速率有50MB/s-160MB/s。
- 磁盘分为硬盘和软盘,硬盘包括机械硬盘和固态硬盘。 EEPROM和闪存(flash memory)可以擦除和重写,断电了数据还在。比RAM慢一个数量级,但是比磁盘快多个数量级,
固态硬盘(SSD)
就是用闪存制作的。
1.2.4 虚拟内存
- 最初,程序指令所访问的内存地址就是物理内存地址. 也就是不得不把程序的全部装进内存当中,然后cpu执行的时候就从内存里直接寻址。这种方式出现了一系列问题,就有了虚拟内存。
- 就是给每个程序分配它自己的连续的地址空间,这个空间被分割成多个块,每一个块被称作一页或页面。每一页有连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由MMU立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。
- 总的来说,就是将程序放在磁盘上,而将主存当作是一部分缓存,用来保存最频繁使用的部分程序。其中虚拟地址和物理地址的映射,用的是
存储器管理单元
(Memory Management Unit, MMU)。
1.3 I/O设备
I/O 设备一般包括两个部分:设备控制器和设备本身。控制器本身是一块芯片或者一组芯片,它能够接收操作系统的指令,控制物理设备。例如,从设备中读取数据并完成数据的处理。
设备驱动程序(device driver)是专门与控制器进行信息交流,发出命令、处理指令、接收响应的软件。为了使设备驱动程序能够工作,必须把它安装在操作系统中,这样能够使它在内核态中运行。
1.4 总线
连接计算机硬件系统内多种设备的通信线路,它的一个重要特征是由总线上的所有设备共享,可以将计算机系统内的多种设备连接到总线上。有三类:数据总线、地址总线、控制总线。
详见:https://blog.csdn.net/dala_da/article/details/78650035
1.5 计算机启动
主板上有bios芯片,里面放了BIOS程序。计算机启动的时候,BIOS 开启,
- BIOS会首先检查所安装的 RAM 的数量,键盘和其他基础设备是否已安装并且正常响应。
- 它开始扫描 PCIe 和 PCI 总线并找出连在上面的所有设备。
- 它通过 CMOS 存储器中的设备清单尝试启动设备,用户可以在系统启动后进入BIOS 配置程序,对设备清单进行修改。
- 判断是否能够从外部 CD-ROM 和 USB 驱动程序启动,如果没有,系统将从硬盘启动,boots 设备中的第一个扇区被读入内存并执行,然后从该分区读入第二个启动加载程序,该加载器从活动分区中读取操作系统并启动操作系统。
- 操作系统会询问 BIOS 获取配置信息。对于每个设备来说,会检查是否有设备驱动程序。一旦有了设备驱动程序,操作系统会把它们加载到内核中,然后初始化表,创建所需的后台进程,并启动登录程序或GUI。
2、操作系统的概念
2.1 进程
进程的本质就是操作系统执行的一个程序。进程就是容纳运行一个程序所有信息的一个容器。一个挂起的进程包括:进程的地址空间和对应的进程表项。与一个进程有关的所有信息,除了地址空间的内容以外,均存放在操作系统的一张表中,称为 进程表(process table),进程表是数组或者链表结构,当前存在每个进程都要占据其中的一项。
地址空间
是指,从某个最小值的存储位置(通常是零)到某个最大值的存储位置的列表。在这个地址空间中,进程可以进行读写操作
。地址空间中存放有可执行程序
,程序所需要的数据
和它的栈
。- 与每个进程相关的其他内容有:资源集,通常包括
寄存器
(寄存器一般包括程序计数器
(program counter)和堆栈指针
(stack pointer))等其他需要执行程序的信息。(猜测
:这些应该都被放在了进程表
中) - 进程
中断
时,稍后启动该进程所需要的许多其他信息,比如进程的指针,都放在了进程表
里。 系统调用
决定着进程的创建和终止。- 哪些东西放在了进程表里,目前还只是猜测
- 原文中从 进程间通信——>超级用户 这个部分的内容,都没看太清楚。
2.2 地址空间
多个进程同时放入内存时,为了保护内存,设置了虚拟内存。感觉地址空间和虚拟内存有关。
2.3 文件
创建、删除、读、写文件。要创建目录。文件描述符检查访问权限。为了对I/O设备读写,把I/O设备作为特殊文件。管道可以连接两个进程。
3、系统调用
坑,未来再填。