操作系统

二、操作系统

操作系统

进程
进程的概念

一个进程是某种类型的一个活动,他有程序,输入,输出,以及状态。单个的处理器可以被若干个进程共享,他是用某种调度算法决定何时停止一个进程的工作,并准想另一个进程提供服务。cpu 的每个核每次只能运行一个进程。每个进程都有一个地址空间和一个控制线程

  • 进程的创建
  1. 系统初始化

  2. 正在运行的程序执行了创建进程的系统调用

  3. 用户请求创建一个新锦成

  4. 一个批处理作业的初始化

前台进程:和用户交互完成工作的进程。

后台进程:(守护进程,)一直在后台运行,在需要的时候被调用

  • 什么时候创建进程更加合适

当所要做的事很容易划分为

在unix中,只有一个系统调用(户系统内核交互的命令)fork可以创建新进程;fork后,这两个进程(父进程和子进程)会拥有相同的内存映像,同样的环境字符串和同样的打开文件。子进程执行execve或其他系统调用修改内存映像成为新程序。分为两步的原因是,在execve之前,允许孩子进程处理文件描述符。

在win中,创建新进程,父进程会通过传入参数将需要的信息传递给子进程来创建。

创建进程后父子进程地址空间是不同的。从上可见,unix初始创建进程时,字进程的初始的地址空间是父进程的一个副本,这种情况子进程共享父进程内存,但写操作会复制内存来进行操作。(写时复制

  • 进程的终止

自愿(正常退出和错误退出)和非自愿(严重错误和被其他进程杀死)

正常退出中,unix中调用exit,win调用exitprocess

  • 进程的状态

运行态(正在占用cpu运行),就绪态,阻塞态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AByLrizC-1609681368107)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p31)]

  • 进程的实现

实现进程模型是通过维护进程表(也叫进程控制块)来实现的(一个结构数组)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SChpacMM-1609681368111)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p32)]

进程间通信
  • 原因:竞争条件:在协作的过程中可能会共享一些彼此都能读写的公共存储区,当两个以上进程读写某些共享数据时,最后的结果取决于进程运行的精确时序,成为竞争条件,竞争条件的形成会使程序在运行中出现一些不可思议的错误。

  • 解决:为了保持进程间通信中避免产生竞争条件,就必须确保当一个进程正使用一个共享变量时,其他进程不能这么操作,即保证互斥

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kojFkDJ-1609681368115)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p49)]

保证互斥有以下不同的方案:

  • 忙等待互斥:
  1. 屏蔽中断:进程进入临界区之后立即屏蔽中断,并在离开之前再打开中断。缺点是:屏蔽中断对于操作系统是一种有用的技术,但对于用户进程掌握屏蔽中断并不安全也不适用

  2. 锁变量:设置一个共享锁,初值为0,进程进入临界区时先测试这把锁,为0则设为1 并使用;为1则不能使用。缺点:测试和设置有时间间隙,容易发生问题(参考数据库)

  3. 严格轮换法:

和2类似,但是是使用一个初值为0的变量,每个进程都循环获取该变量的值,当达到该进程想要的值时,该进程使用,使用后变量值+1。这种也成为自旋锁。缺点:进程0之外的进程因循环被阻塞

  1. peterson 解法:

同样使用变量记录临界区使用情况,但是同时获取临界区值时,后者会覆盖前者。

总结:可以看出忙等待互斥有一个特性就是,忙等待,即当一个进程想进入临界区时,先检查是否允许进入,若不允许,则原地等待,直到允许为止。我们希望进程无法进入临界区应该阻塞,而不是忙等待, 睡眠与唤醒:

生产者消费者问题,两个进程共享一个公共固定大小的缓冲区,其中一个是生产者将消息放入缓冲区,另一个是消费者,从缓冲区读取信息。但缓冲区满则生产者睡眠或者消息为空则消费者睡眠(sleep和wakeup)。

  • 管道:

  • 信号量:使用down和up(也成pv原语)对信号量进行操作。当使用down操作时,检查该值是否为0,若为0则进程进入睡眠;若大于0,则将信号量减一并继续。当使用up操作时,唤醒进程并使信号量加一。(检查数值,修改数值的系列操作是原子操作即p或v是原子操作,所以可以保证正确性)。

  • 互斥量:简化的信号量,整数型表示临界区的状态,0表示解锁,其他数值表示解锁,当解锁时,随机选取一个 线程使用

  • 消息队列

  • 套接口

进程的调度

定义:当两个以上进程竞争cpu时,CPU选择要运行的进程的顺序叫做调度

使用调度算法的环境分类:批处理,交互式,实时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S78snim0-1609681368118)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p44)]

进程调度算法

  • 批处理的调度算法:
  1. 先来先服务:就绪进程有一个单一队列,按照他们请求CPU的顺序顺序使用CPU。(非抢占式)

  2. 最短作业优先:选择运行时间最短的进程使用CPU,此算法的周转时间最短(但是运行时间必须预知)(非抢占式)。

  3. 最短剩余时间优先:新来的进程若剩余运行时间最短则抢占cpu,正在使用cpu的进程挂起(抢占式)

  • 交互式系统中的调度:
  1. 轮转调度:每个进程被分配到一个时间片,如果在该时间片结束时,进程还没有运行完则切换下一个进程。时间片的长度不应太大或太小,在20ms-50ms比较适合

  2. 优先级调度:每个进程被分配一个优先级,按照优先级的顺序执行 。为了避免时间恶化,为正在运行的进程设置最大时间片或者减少优先级

  3. 最短进程优先:

  4. 保证调度:

  5. 彩票调度:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIC9v3z5-1609681368119)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p43)]

线程
进程和线程的区别与联系

1,进程类似于使用某种方法将相关的资源集中在一起。进程有存放程序正文和其他数据和资源的地址空间

进程拥有一个执行线程。线程中有程序计数器(用来记录执行哪一个命令),寄存器(保存线程当前工作变量),唯一的堆栈(记录执行历史)。

2,进程是独立的,统一进程中的线程之间可以互相影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKhGPYG9-1609681368120)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p34)]

  • 看待多进程和多线程

在同一个进程运行多线程,是一种同一台计算机运行多进程的一种模拟。不同的是,进程中的多线程共享同一个地址空间和其他资源。多进程是共享计算机中的内存,磁盘和其他资源。因此线程也叫轻量级进程

  • 为什么使用线程

多线程可以是并行的实体拥有共享同一地址空间个所有可用数据的能力,而多进程模型无法表达

线程比进程更轻量级,线程的创建和撤销更快

多线程在宏观上加快了程序的执行速度

  • 线程如何工作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKotC4jw-1609681368121)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p35)]

在用户空间中,和在内核中实现线程

协程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oC01YnBb-1609681368122)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p51)]

协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源

但协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

来看例子:传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高

进程,线程,协程
  • 进程是系统进行资源分配和调度的一个独立单位,进程由以下元素组成:程序段,数据,进程控制块(包含进程描述符,进程状态,优先级,程序计数器,内存指针,上下文数据,io状态信息,记账信息)

线程是cpu处理的基本单位,每个线程包括线程状态,一个执行栈,私有的数据区,寄存器集。

每个进程都有一个进程控制块和用户地址空间,每个线程都有一个独立的栈和独立的控制块,都有自己一个独

协程是用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。用户控制协程中断,能保留协程上一次执行结果

对于需要cpu大量参与的业务场景来说,使用多进程。

比如密集I/O任务使用多线程合适。

经典IPC问题
  • 哲学家就餐算法

描述:哲学家坐在圆形桌子旁就餐,每人面前有一份饭,在两份饭中间摆放着一把叉子,每个人必须使用两把叉子才能吃饭,吃饭过程中可以放下休息。怎么才能合理安排吃饭顺序

解决:首先对于每个人都拿起左手边叉子,并看右手边的叉子是否有使用,没有则就餐,有则放下左手边叉子。

优化:但是会出现死锁情况,即同时拿左手叉子又同时放下的情况,法1:放下叉子时间随机,则可以避免。缺点是随机算法不好掌控。法2:使用一个二元的互斥信号量,每次拿放叉子都进行up和down操作。此法理论可行但实际效率太低。法3:使用数组跟踪每一位哲学家状态(状态有:进餐,思考,准备拿叉子),只有左右都不在进餐时(且不准备拿叉子时)才获取叉子。结构为对象,进餐,思考,准备拿叉子,左右邻居都使用属性存储

内存管理
存储器抽象
  • 地址空间

原因:为了使多个应用程序同时处于内存中而且不相互影响,需要解决两个问题:保护和重定位。办法是创造一个新的存储器抽象:地址空间

定义:地址空间为程序创造了一套抽象的内存,用于进程寻址内存的一套地址集合。

实现:动态重定位,使用及地址寄存器和界限寄存器。每个程序运行时,程序的其实物理地址装在到基址寄存器,程序的长度装载到界限寄存器,(每次进程访问内存,取指令,读数据字,cpu都会把基地址的值加在地址上,再返回给内存总线)

缺点:每次访问内存都需要进行加法和比较运算

  • 交换技术

原因:内存大小有限制,进程数量很多,全部进程加载进内存,内存很容易超载。为了解决内存超载,办法是交换技术。

定义:把一个进程完整调入内存,是该进程运行一段时间,然后把它存回磁盘,需要是唤醒调回内存

实现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Di3rMfKG-1609681368123)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p37)]

交换在内存中产生多个空闲区,通过把所有进程尽可能向下移动,将笑的空闲区合并成一大块,该技术交内存紧缩(内存紧缩和耗费时间

  • 空闲内存管理

原因:在动态分配内存是,操作系统必须对其进行管理,追踪内存使用情况,

实现:会使用位图和空闲区链表

位图:内存被划分为按字节分配的分配单元,每个分配单元对饮位图中的一位,o表示空闲,1表示占用。

链表:维护一个记录已分配内存段和空闲内存段的链表,链表的每个节点包含空闲区(H)或进程§的指示标志,起始地址,程度和指向下一个节点的指针

首次适配(找到第一个大于等于需要内存空间的内存空闲区),下次适配(…并记录位置,方便下次寻找),最佳适配(搜索整个链表,寻找最接近需要内存空间的最小空闲区)

虚拟内存

原因:随着应用的发展,程序大小超过内存的情况越来越多,交换技术解决方案存在问题(交换方案需要将内存中程度换回磁盘,但是磁盘读取速度并不快,大的程序可能需要几秒才能换回)

定义:虚拟内存:每个程序拥有自己的地址空间,这个空间被分为多个块,每个块乘坐一个也或者页面。每一页有连续的地址范围。这些页被映射到物理内存中,但并不是所有页都必须在内存中程序才能运行,当程序引用到在内存上的页时,通过硬件映射找到运行,当引用不在内存上的页时,操作系统会将缺失的页装入内存中重新执行指令。(虚拟内存的作用像是地址寄存器和界限寄存器的综合)

  • 分页

虚拟内存中的分页技术:再使用虚拟地址的情况下,虚拟地址先被送到内存管理单元MMU),它负责把虚拟地址映射为物理内存地址

实现:页表,虚拟地址到物理地址的映射:虚拟地址被分为虚拟页号(高位)和偏移量(低位)

虚拟页号可作为页表的索引,寻找到对应的页表项

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTjnik4y-1609681368124)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p38)]

页面置换算法

原因:当发生缺页中断时(内存中没有需要的页面或内存饱和无法容纳),操作系统必须在内存中选择一个页面将其换出内存。需要注意的是,如果换出的页面被修改过,则必须写回磁盘,否则可以不写

(页面置换算法也发生在高速缓存和web的缓存中)

  • 最优页面置换算法:

每个页面以首次被访问前的指令数为标记,置换出标记最大的页面

  • 最近未使用(NRU):

在页表项中有两个状态位,页面被访问时设置R位,页面被写入时设置M位。

当一个进程启动时,他的所有页面两个位设置为0;当每次中断时,所有R为被设置为0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGBq52FG-1609681368125)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p40)]

NRU就是随机从类编号最小的类中淘汰一个页面

  • 先进先出(FIFO):

维护一个当前内存中页面的链表,最新进入放在页面表位,最早进入的在表头。当页面发生中断时,淘汰表头

  • 第二次机会:

在FIFO的基础上,检查老页面的R为,如果是0,则淘汰,如果哦是1,则置为1,放置链表末尾。所以说该算法是寻找一个在最近的时钟间隔内没有被访问过的页面

  • 时钟页面置换算法:

和第二次机会算法相同,不同的是,是环形链表。

  • 最近最少使用(LRU):

在缺页中断发生时,置换出最长时间未使用的页面

  • 工作集页面置换算法

设法跟踪进程的工作集(一个进程当前正在使用的页面的集合)确保进程运行以前,工作集在内存中

  • 工作集时钟页面置换

和工作集页面置换算法不同的是,数据结构是一个以页框

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuXo5s3S-1609681368126)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p39)]

分段
  • 分段

原因:在分页技术中,当程序中变量数目很多或者其他原因,符号表填满,使表扩张太大,与另一个表相碰,出现一些问题

解决办法:使用分段技术,页是表现为一维的表,段则表现为二维,段是逻辑实体(即通过多种方法的数据结构实现),有多个相互独立的地址空间,每个段可以独立增大和减小而不会影响其他段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqyuaEmk-1609681368126)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p46)]

  • 分页和分段区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXZehlub-1609681368127)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p45)]

  • 分页和分段结合

x86 处理器中虚拟内存的核心是两张表,LDT(局部描述符表)和GDT(全局描述符表)。每个程序都有自己的LDT,同一台计算机唯一的每个程序公用一个GDT。

每个运行程序都有一个由1024个32位表项组成的页目录。通过全局寄存器来定位,每个目录性也包含1024个32位页表,这个线性地址被分为三个与,目录,页面,偏移量。目录域作为索引在页目录中找到指向正确页表的指针,然后页面域作为索引在也飙中找到页框的物理地址,最后偏移量加到页框地址上得到需要的字节或物理地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lNfN0skA-1609681368128)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p48)]

小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qNcxx4IN-1609681368128)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p47)]

文件系统
文件和目录

文件是持久的,不会因为进程的创建或终止而消失,除非文件所有者要求删除才会消失

  • 文件命名:子母数字和一些特殊字符,(unix区分大小写,MS-DOS不区分大小写(有win95 98))

  • 分类:FAT-16,FAT-32(基于子母数字字符),NTFS(基于Unicode编码的文件名)。文件名

  • 文件结构:

无结构的字节序列(unix和win采用)即操作系统严重的文件都是字节

记录序列

树,树形结构,有“建”,按照“建”进行排序和查找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AGZrjFmP-1609681368129)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p50)]

  • 文件类型

分为普通文件和目录

  1. 普通文件:包含用户信息的文件。 普通文件分为ASCII文件,和二进制文件

ASCII文件,由多行正文组成。每行用回车符或换行符结束

二进制文件,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a3yZq2UD-1609681368129)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p41)]

unix的存档文件是二进制文件

  • 文件访问:顺序访问(在磁带中只能顺序访问)随机访问文件(磁盘支持)win荷藕unix都是用一个特殊的seek操作设置当前位置,然后从这个位置开始顺序读取文本

  • 文件属性:文件除了文件名和数据外还有一些属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhzoiYuW-1609681368130)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p42)]

  • 文件操作:使用文件的目的就是存储信息并方便检索。

  • 目录:管理文件系统结构的系统文件

  • unix还有 字符特殊文件,块特殊文件

  • 目录

大部分操作系统都是层次目录系统。win \ ,linux /

绝对路径(从根目录到文件的路径)和相对路径(相对于当前目录的路径)

目录操作:创建目录create,delete删除目录

文件系统的实现

磁盘分为MBR,分区表,各个磁盘分区。磁盘的0号分区为主引导记录(MBR)。分区表给出了每个磁盘的其实和结束地址。磁盘一般被划分为多个分区,每一个分区都已一个独立的文件系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nFMgWA2V-1609681368131)(evernotecid://997274DB-5796-41BC-8683-0CC751CD0C4B/appyinxiangcom/21253932/ENResource/p52)]

死锁
  • 死锁

  • 产生必要条件

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, …, pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有,如图2-15所示。

linux

linux常用命令

vim,grep,find,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值