操作系统篇

进程和线程

1、进程的含义:

进程是运行中的程序,是操作系统进行资源分配和保护的基本单位。

2、进程包含的内容:

程序代码、程序计数器、堆栈段、数据段。

3、进程和程序的联系和区别:

(1)程序是静态的,进程是动态的,程序是代码的集合,进程是程序的执行。
(2)程序是永久的,进程是短暂的。
(3)程序的组成是代码,是指令和数据的有序集合,进程的组成包括程序、数据、进程控制块。
(4)一个程序可对应多个进程,通过调用关系,一个进程也可包括多个程序。
(5)进程可生成其他进程,程序不能生成新的程序

4、进程的状态:

五态模型:新建,运行,等待 / 阻塞,就绪,终止。
这里写图片描述
三态模型
就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
阻塞 / 等待状态: 进程等待某种条件,在条件满足之前无法执行

5、线程

定义:
是CPU使用的基本单元;他由线程ID,程序计数器,寄存器集合和堆栈组成。
由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。

这里写图片描述

多线程模型
(1)多对一模型:将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。允许开发人员随意创建任意多的用户线程,但是由于内核只能一次调度一个线程,当一个线程在使用内核服务时被阻塞,那么整个进程都会被阻塞;多个线程不能并行地运行在多处理机上。所以并不能增加并发性。
这里写图片描述
(2)一对一模型:将每个用户级线程映射到一个内核级线程。提供更大的并发性,但是创建内核的开销会影响应用程序的性能。
这里写图片描述
(3)多对多模型:将 n 个用户级线程映射到 m 个内核级线程上,要求 m <= n。克服了前面两种的缺点。
这里写图片描述

6、进程与线程的区别:

进程是对运行时程序的封装,是系统进行资源调度的基本单位,进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。

线程是进程的子任务,是CPU调度的基本单位,多个线程共享内存,实现进程内部的并发;

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行;

进程更为健壮。一个进程崩溃后,在保护模式下不会对其它进程产生影响;一个进程之间的某个线程死掉了,整个进程就死掉了;

线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

虚拟内存

1、定义

虚拟内存将用户逻辑内存与物理内存分开。虚拟内存的基本思想是:每个进程拥有独立的逻辑地址空间,这个空间被分为大小相等的多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,虚拟内存允许执行进程不必完全在内存中。

2、调页

(1)检查进程的页表,以确定该引用是合法还是非法的地址访问。
(2)如果引用非法,那么终止进程。如果引用有效但尚未调入页面,那末现在应调入。
(3)找到一个空闲帧
(4)调度一个磁盘操作,已将所需要的页调入刚分配的帧。
(5)当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。
(6)重新开始因非法地址陷阱而且中断的指令。

3、页置换算法:

(1)先进先出算法(FIFO):会产生Belady异常现象(分配的页面数增加,缺页中断的次数也可能增加)。
(2)最佳置换算法(Optimal replacement):保证置换出去的是不再被使用的页,或者是在实际内存中最晚使用的算法。
(3)最近最少使用算法(Least recently use):选择上次使用以来所经历时间最长的页面。
(4)最不经常使用算法(Least frequently use)最少使用次数算法:根据使用次数来判断;

4、系统颠簸。

  颠簸本质上是指频繁的页调度行为,具体来讲,进程发生缺页中断,这时,必须置换某一页。然而,其他所有的页都在使用,它置换一个页,但又立刻再次需要这个页。因此,会不断产生缺页中断,导致整个系统的效率急剧下降,这种现象称为颠簸(抖动)。

进程间通信IPC

1、管道(pipe)

管道是一种半双工的通信方式,数据只能单向流动,而且匿名管道只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据。

2、命名管道(named pipe):

命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。命名管道的名字对应于一个磁盘索引节点,有了这个文件名,任何进程有相应的权限都可以对它进行访问。

3、信号(signal):

信号是在软件层次上对中断机制的一种模拟,通知接收进程某个事件已经发生。

信号发送、信号处理、信号阻塞

4、消息队列:

消息队列是消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。

消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。

进程间通过消息队列通信,主要是:创建或打开消息队列,添加消息,读取消息和控制消息队列。

5、共享内存:

共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中。

采用共享内存进行通信的一个主要好处是效率高,因为进程是直接对内存进行存取。

6、信号量:

信号量是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,可以用来控制多个进程对共享资源的访问。

7、套接字:

套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信,也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。

创建socket、绑定、监听、请求连接、接受连接、相互发送接收数据、断开连接

线程同步互斥

同步: 协作关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

互斥:竞争使用共享资源,当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。

1、互斥量 Synchronized/Lock:

确保一个线程独占一个资源的访问,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。

2、信号量 Semphare:

当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。
信号量提供对共享资源的安全分配。如果存在多份共享资源,在多个线程争抢共享资源的情况下,向线程提供安全分配共享资源的方法。如果共享资源的数量为1,将退化为锁。

3、事件(信号),Wait/Notify:

用事件(Event)来同步线程是最具弹性的。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态。

4、临界区

拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。(临界区只能同一进程中线程使用,不能跨进程使用)

动态链接库

通常被链接的共享代码称为动态链接库(DLL, Dynamic-Link Library)或共享库(shared library)。

动态链接库或共享库本身是已链接的可执行代码,只是它不能独立执行,而需要通过其他程序调用来执行。
使用这种方式调用动态链接库的应用程序将在其文件头中包含一张动态库导入表,表中包含了这个应用程序需要使用哪个DLL(以文件名标识)以及调用了这个DLL中的哪个函数。装入时检查应用程序文件头的这张动态库导入表,并根据导入表中的内容,依次装入每个动态库。同时得到动态库中输出的供应用程序调用的函数的地址,将该地址填回到表中。应用程序调用动态库中的函数时,将调用相应导入表中指明的动态库函数的地址(这个时候将不再通过函数名,然后在动态库中查找这个函数的地址,因为这一工作在应用程序装入的时候已经完成)。

优点:节省内存,部分装入;
缺点:链接开销、管理开销

进程调度

决定哪个进程可获得物理CPU,从就绪进程队列中挑选一个进程并启动执行该进程,可以采用非抢占方式或抢占方式。

1、FCFS(先来先服务)

非抢占式

FCFS策略遵循先来者优先服务的原则。

简单,但是调度性能较差,有可能使短的进程长期等待长的进程

2、短作业优先调度算法(SJF)

抢占式/非抢占式

当CPU 有效时,它将被赋给下一个CPU 间隙最小的进程。

最小的平均等待时间。对短作业或短进程最为有利。
对长作业不利,特别是在抢占方式下,可能会使长作业无限延迟。而且实际上无法预测下一CPU瞬时段的长度。

3、优先级

抢占式/非抢占式

为每个进程赋予一个优先权,把CPU 分配给拥有最高优先权的进程。

优先调度算法可能导致一些低优先权进程无限的等待CPU(即无限阻塞)
解决一个方法是老化(aging))是指逐渐地提高在系统中长时间等待的进程的优先权。

4、时间片轮转(RR)

抢占式/非抢占式

CPU分配给每一个进程一段时间,到时间轮转到下一个进程。

5、多级队列调度算法

就绪队列划分为多个独立的队列。每个队列有自己的调度算法。进程不会在队列间移动。
在队列间进行调度,这种调度通常实现为权限固定的抢占式调度或采用时间片机制。

6、多级反馈

它综合考虑了多种因素,根据进程运行情况的反馈信息动态改变进程的优先级,按优先级别组织设置了规定CPU时间片的各就绪队列;对同一队列中的各就绪进程按FCFS或RR算法调度。

例如:进入就绪队列的进程被放到队列0。队列0 中的进程被指定一个8 毫秒的时间量。如果它不能在这个时间内完成,将被移动到队列1 的队尾。如果队列0 是空的,那么队列1 头部的进程被指定一个16 毫秒的时间量。如果它不能完成,将被抢占并被放入队列2。队列2 中的进程只有当队列0 和1 为空时以FCFS原则运行。

死锁

1、产生死锁的四个必要条件

  • 互斥条件:一个资源一次只能被一个进程使用
  • 占有并等待:一个进程因请求资源而阻塞时,对已获得资源保持不放
  • 非抢占:进程获得的资源,在未完全使用完之前,不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系

2、死锁的处理基本策略和常用方法

  解决死锁的基本方法主要有 预防死锁、避免死锁、检测死锁、解除死锁等。
  
预防死锁:
死锁预防的基本思想是 只要确保死锁发生的四个必要条件中至少有一个不成立,就能预防死锁的发生,具体方法包括:

允许进程同时访问某些资源。但是,有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此,这种办法通常并无实用价值。(破坏互斥条件 )

资源一次性分配:(破坏请求和保持条件)

可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)

资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

避免死锁:

动态地检测资源分配状态,在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。

检测死锁

为每个进程、每个资源制定唯一编号,然后
设定一张资源分配表,记录各进程与占用资源之间的关系
设置一张进程等待表,记录各进程与要申请资源之间的关系

解除死锁:

当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:

资源抢占:按照某种原则逐一抢占足够数量的资源给死锁进程,以解除死锁状态;

撤消进程:可以直接撤消死锁进程或按照某种原则逐一撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值