0.进程、线程
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424164540784.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
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.进程间通信
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233144206.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
1.共享存储
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233010740.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
2.管道
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233058592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
3.消息队列
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233128213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
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)。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233423448.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424151024542.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
2.虚拟内存
操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。
如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424151056330.png)
内存管理单元:进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233638950.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
1.什么是虚拟内存?
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233534138.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
2.如何实现虚拟内存技术——虚拟内存的管理
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233618891.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
1.内存分段
分段机制下,虚拟地址由两部分组成:
1.段选择因子:保存在段寄存器里,里边最重要的是段号,用作段表的索引。段表里保存的是某个段基地址、段的界限、特权等级等。2.段内偏移量:它位于0~段界限之间,如果段内偏移量是合法的,就将段基地址+段内偏移量=物理内存地址。 由上可知,虚拟地址通过段表与物理地址进行映射,分段机制会把程序的虚拟地址分为4个段,每个段在段表里都有1个项,在这一项里找到段的基地址、再加上偏移量,即可找到物理内存地址。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021042415215684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
分段管理的缺点:
1.会产生内存碎片2.内存交换效率低
1.缺点1:内存碎片问题举例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424153636176.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
解决1:外部内存碎片——内存交换
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424153816294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
2.缺点2:内存交换效率低
1.内存分段导致内存碎片; 2.解决内存碎片就要进行频繁内存交换 3.内存交换导致磁盘访问,而磁盘访问速度比内存访问慢的多; 4.尤其是在交换占空间很大的程序时,更是可能会导致卡顿。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424154100999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
2.内存分页
分页:就是把整个虚拟内存和物理内存切成一段段固定大小的空间,Linux下,每页4kb。 页表:
它存储在内存管理单元(MMU)中;页表会在缺页中断时,在内核态进行更新;页表虚拟内存、物理内存之间通过页表来映射。
1.内存分页怎么解决内存碎片、内存交换效率低?
解决内存碎片问题:因为内存空间都是按固定大小划分好的,所以不会像内存分段那样产生间隙很小的内存(这也正是内存分段产生内存碎片的原因);分页管理,释放内存都是以页为单位释放的,也就不会产生太小的内存。解决内存交换效率.内存不够时,由MMU更新页表,进行页面置换,所以每次只会写入1个页或少数几个页,不会花太多时间。
分页机制下,加载程序的时候不必一次性把所有程序内容加载到物理内存,用到什么加载什么(也可以解决内部内存碎片的问题)。
2.分页机制下,虚拟地址、物理地址如何映射?
虚拟地址分为2部分:
页号:他作为页表的索引,页表包含:物理页每页所在的基地址(物理页号)页内偏移。
物理内存地址 = 基地址(物理页号) + 页内偏移
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424161543947.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
3.内存分页,内存地址转换的3个步骤:
1.虚拟内存地址,切分成页号、偏移量;2.根据页号,从页表中找到对应的,物理页号;3.物理页号 + 偏移量 = 物理地址。
2.x.简单的内存分页,有什么问题?
1.有空间上的缺陷。
因为操作系统同时运行着很多进程,这就导致页表非常大。
2.解决方法:多级页表(类似B+树)(一级页表一定有,二级、三级可以只在需要时创建)
有点像B树的结构。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424162444363.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
3.分了2级页表,岂不是占用空间更大了?——不,局部性原理!
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424162714360.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
4.为什么不分级页表不能节约内存?
首先,页表必须覆盖所有虚拟内存,否则计算机就不工作了 再者,多级页表的第一级页表,可以覆盖所有的虚拟内存(联想一下mysql的B+树)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424163135352.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
3.段页式管理
1.段页式内存管理实现的方式:
1.先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制; 2.接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;
这样,地址结构就由段号、段内页号和页内位移三部分组成。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210424163734298.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
2.段页式须经过3次内存访问:
第1次访问段表,得到页表起始地址; 第2次访问页表,得到物理页号; 第3次将物理页号与页内位移组合,得到物理地址。
可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。
4.Linux 主要采用的是【页式内存】管理,但同时也不可避免地涉及了【段机制】
3.缺页中断
缺页中断时,进入系统内核空间分配物理内存,更新进程页表,再返回用户空间,恢复进程的运行。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415233852916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
4.页面置换算法与抖动
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415234039968.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415234123168.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
抖动
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415234236952.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM4MDU3OTQx,size_16,color_FFFFFF,t_70)
|