操作系统 您所在的位置:网站首页 linux进程管理与存储管理部分的联系 操作系统

操作系统

2023-09-07 21:47| 来源: 网络整理| 查看: 265

0.进程、线程

在这里插入图片描述

1.线程的定义 1.线程是进程的基本执行单元,一个进程的所有任务都在线程中执行2.进程要想执行任务,必须得有线程,进程至少要有一条线程3.程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程 2.进程的定义 1.进程是指在系统中正在运行的一个应用程序2.每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存 3.进程与线程的区别 1.地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。2.资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。3.一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。4.进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程5.执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。6.线程是处理器调度的基本单位,但是进程不是。 4:多线程的意义 优点 1.能适当提高程序的执行效率2.能适当提高资源的利用率(CPU,内存)3.线程上的任务执行完成后,线程会自动销毁 缺点 1.开启线程需要占用一定的内存空间(默认情况下,每一个线程都占 512 KB)2.如果开启大量的线程,会占用大量的内存空间,降低程序的性能3.线程越多,CPU 在调用线程上的开销就越大4.程序设计更加复杂,比如线程间的通信、多线程的数据共享 5:多线程的原理 单核cpu 同一时间,cpu只能处理 1 个线程。换言之,同一时间只有 1 个线程在执行 多线程同时执行: 是 cpu 快速的在多个线程之间的切换cpu 调度线程的时间足够快,就造成了多线程的“同时”执行效果(并发错觉) 如果线程数非常多 cpu 会在 N 个线程直接切换,消耗大量的 cpu 资源每个线程调度的次数会降低,线程的执行效率降低 1.进程 1.进程间通信

在这里插入图片描述

1.共享存储

在这里插入图片描述

2.管道

在这里插入图片描述

3.消息队列

在这里插入图片描述

2.进程调度 1.进程调度时机

1.主动放弃

1.进程正常终止2.运行过程中发生异常而终止3.主动阻塞(eg.I/O等待)

2.被动放弃

1.分给进程的时间片用完2.有更紧急的事情需要处理(如:I/O中断)3.有更高级的进程进入就绪队列 2.进程调度算法 1.先来先服务调度算法2.基于时间片的轮转调度算法3.优先权调度算法4.多级反馈队列调度算法 3.何时不能进行进程调度 1.处理中断时2.进程在操作系统内核程序临界区3.原子操作过程中 2.内存管理

虚拟内存:我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)

物理内存:实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)。 在这里插入图片描述

在这里插入图片描述

2.虚拟内存

操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。

如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。 在这里插入图片描述

内存管理单元:进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示:在这里插入图片描述

在这里插入图片描述

1.什么是虚拟内存?

在这里插入图片描述

2.如何实现虚拟内存技术——虚拟内存的管理

在这里插入图片描述

1.内存分段

分段机制下,虚拟地址由两部分组成:

1.段选择因子:保存在段寄存器里,里边最重要的是段号,用作段表的索引。段表里保存的是某个段基地址、段的界限、特权等级等。2.段内偏移量:它位于0~段界限之间,如果段内偏移量是合法的,就将段基地址+段内偏移量=物理内存地址。 在这里插入图片描述 由上可知,虚拟地址通过段表与物理地址进行映射,分段机制会把程序的虚拟地址分为4个段,每个段在段表里都有1个项,在这一项里找到段的基地址、再加上偏移量,即可找到物理内存地址。

在这里插入图片描述

分段管理的缺点: 1.会产生内存碎片2.内存交换效率低 1.缺点1:内存碎片问题举例:

在这里插入图片描述 在这里插入图片描述

解决1:外部内存碎片——内存交换

在这里插入图片描述

2.缺点2:内存交换效率低

1.内存分段导致内存碎片; 2.解决内存碎片就要进行频繁内存交换 3.内存交换导致磁盘访问,而磁盘访问速度比内存访问慢的多; 4.尤其是在交换占空间很大的程序时,更是可能会导致卡顿。

在这里插入图片描述

2.内存分页

分页:就是把整个虚拟内存和物理内存切成一段段固定大小的空间,Linux下,每页4kb。 页表:

它存储在内存管理单元(MMU)中;页表会在缺页中断时,在内核态进行更新;页表虚拟内存、物理内存之间通过页表来映射。 在这里插入图片描述 1.内存分页怎么解决内存碎片、内存交换效率低? 解决内存碎片问题:因为内存空间都是按固定大小划分好的,所以不会像内存分段那样产生间隙很小的内存(这也正是内存分段产生内存碎片的原因);分页管理,释放内存都是以页为单位释放的,也就不会产生太小的内存。解决内存交换效率.内存不够时,由MMU更新页表,进行页面置换,所以每次只会写入1个页或少数几个页,不会花太多时间。

在这里插入图片描述 分页机制下,加载程序的时候不必一次性把所有程序内容加载到物理内存,用到什么加载什么(也可以解决内部内存碎片的问题)。

2.分页机制下,虚拟地址、物理地址如何映射?

虚拟地址分为2部分:

页号:他作为页表的索引,页表包含:物理页每页所在的基地址(物理页号)页内偏移。

物理内存地址 = 基地址(物理页号) + 页内偏移

在这里插入图片描述

3.内存分页,内存地址转换的3个步骤: 1.虚拟内存地址,切分成页号、偏移量;2.根据页号,从页表中找到对应的,物理页号;3.物理页号 + 偏移量 = 物理地址。 在这里插入图片描述 2.x.简单的内存分页,有什么问题? 1.有空间上的缺陷。 因为操作系统同时运行着很多进程,这就导致页表非常大。 2.解决方法:多级页表(类似B+树)(一级页表一定有,二级、三级可以只在需要时创建)

有点像B树的结构。 在这里插入图片描述

3.分了2级页表,岂不是占用空间更大了?——不,局部性原理!

在这里插入图片描述

4.为什么不分级页表不能节约内存?

首先,页表必须覆盖所有虚拟内存,否则计算机就不工作了 再者,多级页表的第一级页表,可以覆盖所有的虚拟内存(联想一下mysql的B+树)

在这里插入图片描述

3.段页式管理 1.段页式内存管理实现的方式:

1.先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;

2.接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;

这样,地址结构就由段号、段内页号和页内位移三部分组成。 在这里插入图片描述 在这里插入图片描述

2.段页式须经过3次内存访问:

第1次访问段表,得到页表起始地址;

第2次访问页表,得到物理页号;

第3次将物理页号与页内位移组合,得到物理地址。

可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。

4.Linux 主要采用的是【页式内存】管理,但同时也不可避免地涉及了【段机制】 3.缺页中断

缺页中断时,进入系统内核空间分配物理内存,更新进程页表,再返回用户空间,恢复进程的运行。 在这里插入图片描述

4.页面置换算法与抖动

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

抖动

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有