操作系统基础知识

操作系统的目的是提供一种环境,在该环境中,用户可以方便且有效地执行程序。

对于一个应用程序而言,无论它是以哪种编程语言创建的,最终结果是一个代码文本文件,由于计算机的CPU仅理解二进制指令,在运行程序时,代码文本文件将以二进制形式加载到内存中。

该程序已以二进制形式加载到计算机的内存中之后。

程序需要内存和各种操作系统资源(内存、文件、设备)才能运行。

“操作系统”是分配所有这些资源的大脑。

基本特性

并发:两个或者多个程序在同一时间段内发生(并行是指同一时刻多个事件发生)

共享:系统中的资源可供内存中多个并发执行的进程共同使用

虚拟:利用时分复用和空分复用技术把一个物理实体虚拟成多个

异步:在多道程序环境下,系统允许多个进程并发执行(走走停停,同步可以避免出现死锁,异步可以提高效率,但安全性较低)

主要功能

处理器管理:处理中断事件。处理机分配是以进程为单位,可以理解为对进程的管理,包括进程同步、进程通信和进程调度等

存储器管理:简单理解为内存的管理,主要任务是分配内存空间,保重各作业占用的存储空间不发生矛盾,并使各作业在自己所属存储区中互不干扰

设备管理:管理所有外围设备,包括完成用户的IO请求,为用户进程分配IO设备等

文件管理:管理用户文件和系统文件,方便使用同时保证安全性

系统调用

凡是与系统级别的资源有关的操作(例如设备管理,文件管理,进程控制,内存管理等)都必须通过系统调用方式向OS提出服务请求,并由OS代为完成

 

进程和线程

进程:进程的狭义定义可以理解为,进程是正在运行的程序的实例。

一个程序可以有多个实例,也就是说一个程序可以创建多个进程。

进程是操作系统进行资源分配和调度的一个独立单位。

每个进程都有一个单独的内存地址空间,这意味着一个进程独立运行并与其他进程隔离。它不能直接访问其他进程中的共享数据。

1.进程的常见状态

  • 创建:进程正在被创建。
  • 就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可以立即执行。
  • 执行:进程已获得CPU,程序正在执行状态。
  • 阻塞:正在执行的进程由于发生某事件(如I/O请求,申请缓冲区失败等)暂时无法继续执行的状态。
  • 结束:进程正在从系统中消失。

2.进程通信

进程通信是指进程之间的信息交换。PV操作时低级操作方式。高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方式大概分为以下三类:

a.共享存储:再通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行读/写操作实现进程之间的信息交换。在对共享空间进行写/读操作时,需要使用同步互斥工具(例如PV操作)。

b.消息传递:再消息传递系统中,进程间的数据交换是以格式化的消息为单位的,通过系统提供的发送消息和接收消息两个原语进行数据交换。

c.管道通信:管道指用于连接一个读进程和一个写进程以实现它们之间通信的共享文件,主要是通过文件读写的方式。

3.进程同步

多进程虽然提高了系统资源利用率和吞吐量,但是由于进程的异步性可能造成系统的混乱。

进程同步的任务就是对多个相关进程在执行顺序上进行协调,使并发执行的多个进程之间可以有效的共享资源和相互合作。

同步机制的四大原则:

空闲让进:当没有进程处于临界区,许可其他进程进入临界区申请

忙则等待:当前如果有进程处于临界区,如果有其他进程申请进入,则必须等待,保证对临界区的互斥访问

有限等待:对要求访问临界资源的进程,需要在有限时间内进入临界区,防止出现死等

让权等待:当进程无法进入临界区的时候,需要释放处理机,以防陷入盲等

4.死锁

死锁是指多个进程或线程在运行过程中,因为争夺资源而造成的一种僵局,如果没有外力推进,处于僵局中的进程就无法继续执行,最后被卡死

死锁原因:

a.竞争资源:请求同一有限资源的进程数多于可用资源数

b.进程推进顺序非法:进程执行中,请求和释放资源顺序不合理,如资源等待链

死锁产生的四大必要条件:

互斥条件:进程对所分配的资源进行排他性的使用

请求和保持条件:进程被阻塞的时候并不释放申请到的资源

不可剥夺条件:进程对于已申请到的资源在使用完成之前不可被剥夺

环路等待条件:发生死锁的时候存在一个进程-资源环形等待链

处理死锁方法:

预防死锁:破坏产生死锁的4个必要条件中的一个或多个;实现起来简单,但若限制严格会降低系统资源利用率以及吞吐量

避免死锁:系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略

检测死锁:允许系统运行过程中产生死锁,在死锁发生后,确定与死锁相关的进程以及资源

解除死锁:与检测死锁配合,讲系统从死锁中解脱出来,对检测到的和死锁相关的进程和资源,通过撤销和挂起,释放一些资源并将其分配给处于阻塞状态的进程,是其转变为就绪态。

5.进程调度算法

先来先服务调度算法(FCFS):作业调度算法或进程调度算法,按作业或进程到达的先后顺序依次调度,对于长作业比较有利,但是无法优先处理比较紧急的任务。

短作业优先调度算法(SJF):是作业调度算法,从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行。所以缺点很明显不利于长作业,没有考虑部分作业的重要性。

高响应比算法(HRN):根据响应比决定优先级,响应比=(等待时间+要求服务时间)/ 要求服务时间。

时间片轮转调度(RR):按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放入到队列尾部,以此循环。

多级反馈队列调度算法:设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减,优先级越高的队列分配的时间片越短。进程到达之后按FCFS放入第一个队列,若调度执行后没有完成,那么放到第二个队列尾部等待调度,若第二次调度仍未完成,放入到第三队列尾部……只有当前一个队列为空时才会调度下一个队列的进程。

6.线程

线程可以理解为进程内执行的单元。

线程是每个程序的必要部分,有自己的堆栈和局部变量,但线程之间没有单独的地址空间,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率差。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

a.一个程序至少有一个进程,一个进程又至少有一个线程

b.线程的划给尺度小于进程,使得多线程程序的并发性高

c.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大的提高程序的运行效率

d.每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但线程不能独立执行,必须放在应用程序中,由应用程序提供多个线程执行控制。

存储器和虚拟存储器管理

1.内存连续分配

主要是指动态分区分配时所采用的几种算法。

动态分区分配又称为可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态建立分区,并使分区的大小正好适合进程的需要。因此,系统中分区的大小和数目是可变的。

首次适应算法:从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。

最佳适应算法:从全部空闲区中找出第一个能满足作业要求的,且大小最小的空闲分区,这种方法能使碎片尽量小。

最差适应算法:从全部空闲区中找出第一个能满足作业要求的、且大小最大的空闲分区,从而使链表中的节点大小趋于均匀。

2.分页式存储管理方式

用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。

该方法需要CPU的硬件支持,来实现逻辑地址和物理地址之间的映射。在页式存储管理方式中地址结构由两部构成,前一部分是页号,后一部分为页内地址w(位移量);

页式管理方式的优点和缺点:

优点:

1)没有外碎片,每个内碎片不超过页大比前面所讨论的几种管理方式的最大进步是,

2)一个程序不必连续存放。

3)便于改变程序占用空间的大小(主要指随着程序运行,动态生成的数据增多,所要求的地址空间相应增长)。

缺点:

要求程序全部装入内存,没有足够的内存,程序就不能执行;

3.分段式储存管理方式

在段式存储管理中,将程序的地址空间划分为若干个段(segment),这样每个进程有一个二维的地址空间。在前面所介绍的动态分区分配方式中,系统为整个进程分配一个连续的内存空间。而在段式存储管理系统中,则为每个段分配一个连续的分区,而进程中的各个段可以不连续地存放在内存的不同分区中。程序加载时,操作系统为所有段分配其所需内存,这些段不必连续,物理内存的管理采用动态分区的管理方法。

总的来说,段式存储管理的优点是:没有内碎片,外碎片可以通过内存紧缩来消除;便于实现内存共享。缺点与页式存储管理的缺点相同,进程必须全部装入内存。

4.分页分段方式的区别

页是信息的物理单位,是出于系统内存利用率的角度提出的离散分配机制;

段是信息的逻辑单位,每个段含有一组意义完整的信息,是出于用户角度提出的内存管理机制。

页的大小是固定的,由系统决定;

段的大小是不确定的,由程序员开发决定;

分页是为了提高内存利用率,而分段更多的是满足编写代码时的逻辑需求。

段页式管理:结合段式和页式管理的优点,先将内存分成若干段,然后将每一段再分成若干页。

虚拟内存

1.逻辑地址和物理地址

逻辑地址由操作系统决定,例如C语言的指针,里面存储的数值就是逻辑地址

物理地址是指真实物理内存中的地址,更具体来说是指内存地址寄存器中地址。

2.CPU寻址方式

现代的处理器使用的都是一种叫做虚拟地址寻址的寻址方式

内存管理单元(MMU):CPU内部的一个硬件,负责完成虚拟内存地址到物理地址的转换

3.为什么需要虚拟地址

在没有虚拟地址的空间中,程序都是直接访问的实际物理地址,这会导致用户程序可以任意访问内存,任意寻址内存的每个字节,没有顺序,没有规则,容易造成OS崩溃;同时也无法同时运行多个程序,导致程序崩溃。

4.虚拟地址的优点主要有

a.程序可以用一系列相邻的虚拟地址访问实际物理内存中不相邻的大内存缓冲区

b.程序可以用一些列虚拟地址访问大于可用物理内存的内存缓冲区

c.不同进程操作的虚拟地址分隔开

5.虚拟内存的优点

虚拟内存可以让程序拥有超过系统实际物理内存大小的可用内存空间。

虚拟内存可以为每个进程提供一个一致的,私有的地址空间,它让每个进程都拥有一片连续完整的内存空间,这样能更加有效管理内存并减少出错。

虚拟内存使得程序认为它拥有连续可用内存,然而实际上,这个空间通常被分为多个物理内存碎片,甚至有的部分存储再外部磁盘存储器上,需要的时候进行数据交换。

6.虚拟内存的局部性原理

在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存就可以启动程序执行。在执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际大得多的虚拟存储器。

7.虚拟存储器的特征

a.多次性:一个作业可以分成多次被调入到内存中。

b.对换性:作业运行过程中存在换进换出的过程。

c.虚拟性:虚拟性体现在其从逻辑上扩充了内存的容量。

页面置换算法

最佳置换算法:将当前页面中在未来最长时间内不会被访问的页面置换出去

先进先出置换算法:每次置换最早调入的页面

最近最久未使用算法:算法赋予每个页面一个访问字段用来记录上次页面被访问到现在所经历的时间,每次置换将时间最久的页面置换出去

时钟算法(最近未使用算法):页面设置一个访问位,并将页面链接设置为一个环形队列,页面被访问的时候访问位设置为1.页面置换时,若当前指针所指页面访问为0,则置换,否则将其置为0,循环直到遇到一个访问位为0的页面。

最少使用算法:设置寄存器记录页面被访问次数,每次置换时置换当前访问次数最少的。

守护、僵尸、孤儿进程的概念

  • 守护进程:运行在后台的一种特殊进程,独立于控制终端并周期性地执行某些任务

  • 僵尸进程:一个进程 fork 子进程,子进程退出,而父进程没有wait/waitpid子进程,那么子进程的进程描述符仍保存在系统中,这样的进程称为僵尸进程。

  • 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,这些子进程称为孤儿进程。(孤儿进程将由 init 进程收养并对它们完成状态收集工作)

 

 

posted @ 2020-08-03 18:50  infinite_h  阅读(420)  评论(0编辑  收藏  举报