操作系统基础

372 阅读11分钟

基础

进程与线程的本质区别

  • 进程是资源分配的基本单位,线程是调度的基本单位 (但是并不是说进程就不可以被调度,只是线程是更小的可以调度的单位,强调的是分配资源时的对象必须是进程)

  • 进程的个体间是完全独立的,而线程间是彼此依存的

  • 进程的实现是调用fork系统调用:pid_t fork(void);

    线程的实现是调用clone系统调用:int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...);

  • 进程间的通信方式有这样几种: A.共享内存 B.消息队列 C.信号量 D.有名管道 E.无名管道 F.信号 G.文件 H.socket ,有8种

    线程间的通信方式除了以上几种沿用外,还有自己独特的几种: A.互斥量 B.自旋锁 C.条件变量 D.读写锁 E.线程信号 (与上面进程间的信号不一样) G.全局变量,有13种

  • 进程的ID为pid_t类型,实际为一个int型变量,即有限的;线程的ID是一个long型变量

  • 进程间采用的通信方式要么需要切换内核上下文,要么需要与外设访问,相比线程会慢

  • 进程占用的资源比线程要大,一个线程的创建远小于进程的创建

  • 进程创建出进程就为该进程的子进程,线程创建出来的线程是平等的没有上下级

各自的应用场景

  • 需要频繁创建销毁的优先用线程
  • 需要进行大量计算的优先使用线程
  • 强相关的处理用线程,弱相关的处理用进程
  • 多机分布的用进程,多核分布的用线程

进程状态

  1. 运行态:进程占有CPU资源,正在运行。在单处理机系统中任一时刻只能有一个进程处于运行状态

  2. 就绪态: 进程本身具备运行条件,但由于处理机的个数少于进程的个数,暂未投入运行。相当于等待资源

  3. 等待态: 进程本身不具备运行条件,即使给它分配处理机也无法执行,进程正在等待某一个事件的发生,如:等待某一资源被释放、等待与该进程有关的I/O信号完成等

进程调度算法的特点

FCFS--先来先服务和短作业优先调度算法

  • 先来先服务调度算法(FCFS)

    在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行

    优点:公平,实现简单 缺点:不利于短作业

  • 短进程优先(SCBF)

    该算法从就绪队列中选出下一个“CPU执行期最短”的进程,为之分配处理机

    优点:平均等待时间最少,效率最高 缺点:长作业会饥饿,CPU执行时间不易确定

FPF高优先权优先调度算法

  • 基于优先级调度(Priority Scheduling)

    在优先级调度算法中,每个进程都关联一个优先级,内核将CPU分配给最高优先级的进程。具有相同优先级的进程,按照先来先服务的原则进行调度

  • 高响应比优先调度算法

    根据“响应比=(进程执行时间+进程等待时间)/ 进程执行时间”这个公式得到的响应比来进行调度。

    优点:兼顾长短作业 缺点:计算响应比的开销大

基于时间片的轮转调度算法

  • 时间片轮转法(RR)

    与FCFS很像,但是加入了抢占。内核从就绪队列中选去第一个进程,将CPU资源分配给它,并且设置一个定时器在一个时间片后中断该进程,调度就绪队列中的下一进程。

    优点:兼顾长短作业 缺点:平均等待时间较长,上下文切换浪费时间

  • 多级反馈队列调度算法

    1. 设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中, 为每个进程所规定的执行时间片就越小。
    2. 当一个新进程进入内存后,首先放入第一队列的末尾,按FCFS原则排队等候调度。 如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,在同样等待调度…… 如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。
    3. 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1到第( i-1 )队列空时, 才会调度第i队列中的进程运行,并执行相应的时间片轮转。
    4. 如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列, 则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。

    优点:兼顾长短作业,有较好的响应时间,可行性强

调度算法使用场景

  • 批处理系统 该系统中,调度算法目标是保证吞吐量和周转时间

    1. 先来先服务 first-come first-serverd
    2. 短作业优先 shortest job first
    3. 最短剩余时间优先 shortest remaining time next (短作业优先的抢占版本)
  • 交互式系统 该系统中,调度算法的目标是快速地进行响应

    1. 时间片轮转
    2. 优先级调度
    3. 多级反馈队列
  • 实时系统 实时系统要求一个请求在一个确定时间内得到响应

    分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时

线程的实现方式

内核支持线程KST(Kernel Supported Threads)

  • 描述

    内核支持线程是在内核的支持下运行的,创建、阻塞、撤销、和切换等,都是在内核空间实现。为了对内核线程进行控制和管理,在内核空间也为每一个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并对其加以控制。

  • 实现

    系统在创建一个新进程的时候,便为其分配一个任务数据区PTDA(Per Task Data Area),其中包含若干个线程控制块TCB空间,这些TCB及其所在的任务数据区被保存到内核中,每当进程创建一个线程时,便为线程分配PDTA中的一个TCB,将有关信息填入到该TCB中,并为其分配其运行时所需的必要资源

用户级线程ULT(User Level Threads)

  • 描述

    用户级线程是在用户空间中实现的。线程的创建、撤销、同步、通信等功能,无需内核支持,即用户级线程与内核无关,这些线程的任务控制块都是设置在用户空间,而线程所执行的操作无需内核的帮助,因而内核完全不知道用户线程的存在

  • 实现

    用户级线程是在用户空间实现的,所有的用户级线程都具有相同的结构,它们都运行在一个中间系统上,当前有两种方式实现中间系统,即运行时系统和内核控制线程

协程的作用

  • 描述

    协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的

  • 优点

    1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到

    2. 协程可以顺序地写异步代码:维护一组局部状态,在重新进入协程前,保证这些状态不被改变,能顺利定位到之前的位置

    3. 协程更加高效。多个协程可以共用一个线程。一个 App 可以运行的线程数是有限的,但是可以运行的协程数量几乎是无限的

常见进程同步问题(往后补充)

生产者-消费者问题

读者-写者问题

哲学家进餐问题

进程通信方法的特点以及使用场景

  • 根据进程通信时信息量大小的不同划分

    1. 控制信息的通信(低级通信)

    2. 大批数据信息的通信(高级通信)

      方式有:管道通信,消息缓冲通信,共享内存通信等

  • 管道通信

    概念:

    两个进程利用管道文件进行通信,发生信息的进程称为写进程,接收信息的称为读进程,管道文件就像一根管道将写进程和读进程连接在一起

    分类:

    利用系统调用PIPE()创建一个无名管道文件,称为无名管道 (只能用在具有家族联系的进程之间,是非永久性的管道通信机构)

    利用系统调用MKNOD()创建一个有名管道文件,称为有名管道 (提供给任意关系的进程调用,长期存在于系统之中)

  • 消息缓冲通信

    概念:

    多个独立的进程之间可以通过消息缓冲机制来相互通信,是以消息缓冲区为中间介质来实现,通信双方的发送和接收操作均以消息为单位

    原理:

    消息缓冲区被组织成队列,通常称之为消息队列。消息队列一旦创建后即可由多进程共享,发送消息的进程可以在任意时刻发送任意个消息到指定队列上,并检查是否有进程在等待它所发送的消息,有则唤醒;而接受消息的进程可以在指定的消息队列上获取消息

  • 共享内存通信

    概念:

    允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存端进行通信

    特点:

    没有中间环节,直接将共享的内存通过附接,映射到相互通信的进程各自的虚拟地址空间中

  • 优缺点

    1.无名管道简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。

    2.消息缓冲可以不再局限于父子进程.而允许任意进程通过共享消息队列来实现进程间通信.并由系统调用函数来实现消息发送和接收之间的同步.从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题.使用方便,但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合。

    3.共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享。不方便网络通信。

死锁必要条件、解决死锁策略,能写出和分析死锁的代码,能说明在数据库管理系统或者 Java 中如何解决死锁。

  • 死锁必要条件

虚拟内存的作用,分页系统实现虚拟内存原理。

页面置换算法的原理,特别是 LRU 的实现原理,最好能手写,再说明它在 Redis 等作为缓存置换算法。

比较分页与分段的区别。

分析静态链接的不足,以及动态链接的特点

Linux

文件系统的原理,数据恢复原理

硬链接与软链接的区别

常用Linux命令

僵尸进程与孤儿进程的区别