操作系统

1. 什么是进程

A:一个程序至少有一个进程,进程是程序运行的一次执行,进程时系统进行资源分配的最小单位,且每个进程都有自己的地址空间。

进程调度算法: 先来先服务调度算法、短作业优先调度算法、抢占式优先级调度算法、高响应比优先调度算法、时间片轮法调度算法。

进程的三种状态:运行、阻塞、就绪。

进程间通信方式
  1. 管道 无名管道 与FIFO 有名管道
  2. 消息队列
  3. 信号量:是一个计数器,用于实现进程间的互斥与同步
  4. 共享内存: 与信号量一起使用,是最快的一种进程间通信方式,

共享内存: 是通过把一块内存分别映射到不同的进程空间中实现进程间通信,而共享内存本身不带有任何互斥与同步机制,因此需要用户自己实现互斥与同步,常用的有互斥锁与信号量

2. 线程与进程的区别

  1. 线程是进程的一个实体,是进程的一条执行路径,比进程更小的独立运行的基本单位,线程也被成为轻量级进程,一个程序至少有一个线程。

  2. 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,一个进程中所有线程共享该地址空间,但是他们有各自独立的栈(stack)

  3. 同一个进程内的线程共享本进程内的地址空间,共享本进程的资源。

  4. 一个进程崩溃后,在保护模式下,不会对其他进程产生影响,但是一个线程崩溃整个进程崩溃,所以多进程比多线程健壮。

  5. 两者均可以并发执行

  6. 线程的划分尺度小于进程,使得多线程程序的并发性高,多个进程共享内存,极大提高程序运行效率。

互斥锁

保证进程安全的方法

原子操作:

原子的本意是不能进一步分割的最小粒子,而原子操作是指:不可中断的一个或一系列操作。

Q: 大小端的问题

大端模式(BE big-endian):是指数据的低位保存在高位地址中,而数据的高位保存在内存的地地址中

地址 数据
0x0001 12
0x0002 34

那么数值为0x1234;

小端模式(LE little-endian):是指数据的低位保存在内存的低位中,而数据的高位保存在内存的高位中。

https://jocent.me/2017/07/25/big-little-endian.html

https://blog.csdn.net/ce123_zhouwei/article/details/6971544

http://www.ruanyifeng.com/blog/2016/11/byte-order.html

存储结构

  1. 存储结构示意图

img

结构图要点解析:

  1. 金字塔越往上速度越快,价格越高,磁盘是非易失性存储,其他都是易失性存储。
  2. 每次上电,只有磁盘有数据然后根据算法挑选数据进行向上传递。

2 存储结构分布图

img

  1. CPU中包含了CPUcore 、L1高速缓存 、L2高速缓存、L3高速缓存(SRAM)。
  2. 内存部分(DRAM)
  3. 磁盘中包含磁盘缓存与磁盘等区域。

页、页表、块表与MMU

1.虚拟存储器

定义:虚拟存储器是具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储系统。

逻辑上实现的方法:CPU访问虚拟地址,MMU将虚拟地址转化为物理地址,CPU在通过物理地址访问物理内存。

需要解释的:

  1. MMU : CPU的一个硬件模块,专门负责将虚拟地址转换为物理地址。
  2. 虚拟地址:APP访问到的地址;
  3. 内核实际管理的物理地址。

2. 页(page)

页:将APP访问的虚拟地址空间切分为若干个大小相等的页,页的大小通常是4K

页框:把物理内存也按照“页”的大小切分为若干大小的相等片,及是页框。

内存管理就是把物理内存划分为一个一个的页框,进程申请内存的时候,内核就以页为单位把进程一个个(虚拟)页装入多个可能不连续的(物理)页框中。

img

注意:

  1. 一个进程的页并不是全部都映射到物理内存的页框中,linux内核只有在万不得已的情况下才会进程分配物理内存。
  2. 多个进程的页可以映射到共同的物理内存页框中,这些共享的页框一般是动态库。

3. 页表

页表记录了“页”与“页框”的对应关系。

img

  1. 页表为每一个进程维护一份页表,一对一;
  2. 页表记录了进程与内存也框之间的对应关系。
  3. 进程的页不管有没有使用都会记录在页表中即为(1048575),但对于物理内存来说只有迫不得已才会分配给进程。

4. 多级页表

虚拟页数量=4G/4k=1M(1048576)

多级页表是对一级页表需要的4M的连续内存进行再次分页,在使用另一个页表保存分页记录

内核只需要记录最上一层的页表,通过多次页表转换,去的真正的物理页框号。

5. 块表

页表存在于内存中,CPU每次获取数据都需要2次访问内存:

  1. 第一次访问内存的页表,获取物理地址;
  2. 第二次根据物理地址获取真实数据。

为了提高访问表的速度,于是有了块表(TLB,Translation lookside buffer)是单独的一组存储器,也是高速缓存,用于记录页表中正咋频繁使用的页表。

由于程序和数据的访问往往具有局限性(局部性原理)因此据统计块表的命中率达到90%以上。*块表是为了从概率命中的角度加速虚拟地址到物理地址的转换,设计一组告诉存储硬件模块***

6 MMU(Memory Management Uint)

CPU需要访问虚拟地址,于是把虚拟地址发送给MMU,由MMU内的硬件电路实现访问块表、页表、最终得到物理地址。

//TODO:加图:

CPU 寻页的过程

CPU获取数据地址主要有两步骤:

a. 通过虚拟地址获取物理地址

b . 根据物理地址获取数据。

1. 获取物理地址步骤

img

a. CPU向MMU发送虚拟地址;

b. MMU查询块表TLB

c. 从高速缓存中,查询页表

d. 从内存中查询页表

e. 把查询的页表项纪录到高速缓存

f. MMU 从高速缓存中获取也表项

g. 进入却页中断处理函数

h. 为虚拟页分配物理页框

2.根据物理地址获取数据

img

参考链接:

  1. https://www.cnblogs.com/alantu2018/p/9002309.html
  2. https://zhuanlan.zhihu.com/p/73696670
  3. http://airtrack.me/posts/2015/04/27/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%9E%E7%8E%B0%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E5%88%86%E9%A1%B5%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/