iCurry
2023/04/06阅读:20主题:默认主题
作业
操作系统
什么是操作系统?
我们可以把操作系统理解成介于底层硬件和应用层软件之间的中间件。有了操作系统我们可以不必直接于硬件打交道,而是通过操作系统提供的接口 ,实现对硬件的操作。因此操作系统可以看成是管理硬件资源、控制程序运行、分配内存资源、改善人机交互的一种系统软件。
最早的计算机采用的是纸带打孔的方式,所有的程序都是直接操作硬件,且一段时间内只能一个人使用。经过一段时间的发展,计算机开始采用批处理的方法处理输入输出,这种处理方法虽然比打孔要好,但是效率还是很低,而且很难做到人机交互。
随着时间流逝,计算机的操作系统不在局限于串行,开始有了并行的概念。CPU在多道程序间切换,使得人们感觉程序好像在同时运行。随后发展而来的就是现代操作系统。现代操作系统不仅能让CPU在程序间切换,而且还共享文件、数据库等信息。并且图形界面的发展大大降低了人们使用计算机的难度。
什么是系统调用?
系统调用可以理解成是操作系统的内核调用。由于内核具有最高的权限,因此在用户态没办法完成的操作就需要进入内核态由内核完成调用。每次内核调用都会发生进程上下文的切换。
系统调用是计算机的内核在为计算机的程序提供服务时所进行的事件。比如管理内存资源,访问硬件资源,创建进程、进程调度等。因此系统调用是进程与操作系统之间的重要接口。
什么是虚拟内存?
当直接操作物理内存时候,会有许多麻烦。比如:进程之间会相互影响,且数据有被篡改的风险。若一个进程所需内存过大,后续进程由于缺少足够的内存,只能等待该进程结束。为了解决上述问题就诞生了虚拟内存的技术。所谓虚拟内存就是假的内存,实际中并不存在。但是在进程眼里,虚拟内存是存在的。不仅存在,而且还有单一进程完全独享。这样就把不同进程隔离了起来,不同进程之间也就不再相互干扰。
虚拟内存实现的原理就是拿出一部分物理内存与虚拟内存建立起映射关系。进程在访问虚拟内存时,通过转换实际就是在访问物理内存。可见虚拟内存是操作系统物理内存与进程之间的中间层。它隐藏了物理内存这一概念,为进程提供了更加简洁易用的接口。同时,根据局部性原理,也使得进程所能使用的内存可以比实际内存大。因为根据局部性原理,我们可以把不经常使用的数据先从内存换出,等到需要时候,再从磁盘换入到内存。
进程与线程
进程可以认为是运行中的程序。线程可以认为是轻量级的进程。一个进程内可以有多个线程,线程之间可以公用进程的虚拟内存等资源。因此线程在进行上下文切换的时候,要比进程更快,因为不需要切换虚拟内存。
每个进程都有一个进程控制块(PCB),这里面维护者进程的各种信息。包括进程状态、进程号等。
进程有不同的状态。包括进程创建、进程终止、进程就绪、进程阻塞、进程运行等。
进程之间的通信。同一台主机之间的进程通信可以利用管道、消息队列、共享内存、Socket等进行通信。管道和消息队列的通信都有局限性,比如,通信不及时、通信内容的大小也有限制。对于共享内存,就是两个进程都拿出一部分虚拟内存,都映射到同一物理内存上。这样就实现了进程间的通信。但是随着两个进程都可以操作同一块物理内存,就会出现进程竞争内存资源,以及数据被篡改的问题。进而引出了锁和信号量的概念。
所谓的锁就是对进程访问内存时加以限制。只有进程拿到锁的时候,才能访问共享内存。访问完成后即释放锁。根据锁类型的不同又分为互斥锁,自旋锁、读写锁。所谓互斥锁就是进程A在访问资源时,进程B不能访问。自旋锁就是进程A在访问时,进程B一直在等待,并且每隔固定时间就询问是否能够获得锁。直到最后获得锁,进程B才停止自旋。读写锁限制了读写的权限,可以多人一起读,但不可多人一起写。写的时候不可读,读的时候不能写。
除了锁之外,还有信号量可以协调共享资源之间的访问方法。信号量分为P、V操作。进程在进入共享内存区域之前先进行P操作,离开共享内存时、进行V操作。如果想让两个进程是互斥关系,可以将初始信号量设置为1,如果想要让两个进程是同步关系可以将初始信号量设为0。
不同主机进程想要通信就需要Socket。过程大致如下:客户端和服务端初始化Socket。得到文件描述符;服务端调用bind(),绑定ip地址与端口;服务端调用listen(),进行监听;服务端调用accept(),等待客户端连接;客户端调用connect(),向服务器端的地址和端口发起连接请求。服务端accept()返回用于传输的Socket的文件描述符。接下来客户端和服务端就可以读写数据。最后服务端和客户端调用close()断开连接。
进程间为什么要进行通信?
1、如果进程间不能通信,那处于不同位置的两台主机之间的就无法发送消息。也就无法实现信息的共享。
2、计算加速。如果进程之间不能通信,当有一个需要很大内存才能处理的事件的时候,如果让单一进程处理,就有可能挤爆内存。而进程间如果能够通信,就可以把需要大内存的事件分解成几个小事件,让多个进程共同处理。
3、方便划分模块。进程间能够通信,就可以将事件划分模块,让进程专注于执行某一模块,在事件逻辑上也更清晰。
进程调度
上面提到进程有不同的状态,就是为了方便进程调度。现在的操作系统大都使用时间片机制,一个时间片到了,无论进程是否执行完,都要进行切换。而所谓的进程调度,就是CPU在一个时间片之后,选择下一个要执行的进程。其目的就是最大化CPU的利用率,不让CPU空闲。
进程调度算法大致如下:
FIFO :非抢占式调度。先来先服务。优点就是公平。缺点就是死板效率低。如果某一个进程需要大量的时间,后面的进程就不得不等待该进程执行完之后才能执行。
SJF 最短作业优先。好处是短进程可以很快的执行完,但是长进程有可能永远也执行不上。还有一种,如果短进程来的太晚,还是有可能会在长进程之后执行。
Round Robin 时间片机制。给每个进程分配一个时间片。当时间片用完,进程切换。该方法属于抢占式调度。
页面置换算法
最佳页面置换算法。该算法是一种理想算法,现实中无法实现。其基本思路就是置换未来最长时间不访问的页面。该算法的作用是用来衡量其他算法的效率,越接近最佳页面置换算法。说明算法越优秀。
先进先出置换算法。选择在内存驻留时间最长的页面进行置换。该算法效率低。
最近最久未使用置换算法。该算法理论上可以实现,但单价很高,需要在内存中维护一个所有页面的链表。开销很大,实际使用较少。
时钟页面置换算法 :该算法把所有的页面都保存在一个类似时钟的环形链表中,一个表针指向最老的页面。当发生缺页中断时,首先检查表针指向的页面:如果访问为是0,就置换该页面。如果访问为是1,就把访问为置为0,并把指针前移一个单位,直到能找到访问位为0的页面为止。该算法兼顾了最近最久未使用算法和先进先出算法,是当前使用最多的页面置换算法。
最不常用算法。该算法是选择访问次数最少的那个页面将其淘汰。实现方式就是在页面内设置一个访问计数器,每当一个页面被访问,该计数器就加一,在发生缺页中断时,就置换计数器最小的页面。该算法的开销以及链表在查询时的耗时都非常大。该算法可能会误置换当前访问频率很高,但访问 次数还不高的页面。
作者介绍