操作系统知识速记1

前言

操作系统是计算机专业的核心课程,做程序开发需要对操作系统有深入了解,以便对程序的运行过程有更清晰的认识,以便让程序更高效的运行。

操作系统的四个特性

  • 并发:同一时间内多个程序执行
  • 共享:系统中的资源可以被内存中多个并发执行的进程线程共同使用
  • 虚拟:通过分时复用(分时系统)、以分空复用(虚拟内存)技术把一个物理实体虚拟为多个。
  • 异步:系统进程以一种走走停停的方式执行,进程什么时候以什么速度执行是不可预知的。

进程和线程

  • 进程是一个内存中运行的程序,每个进程都有一块自己独立的内存空间。
  • 线程是比进程更小的执行单位,在进程中使一个独立的控制流,一个进程可以启动多个线程,每个线程并行执行不同的任务。
  • 进程和线程的区别:
    • 调度:进程是资源管理的基本单位,线程是程序执行的基本单位
    • 切换 :线程上下文切换比进程上下文切换要快得多
    • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有资源,可以访问进程的资源。
    • 系统开销:创建或撤销进程时,系统要分配或回收系统资源,如内存空间、IO设备等,操作系统创建或撤销进程时付出的开销显著大于创建或撤销线程的开销,进程切换的开销也大于线程切换的开销。

并发和并行

并发就是在一段时间内,多个任务都会被处理,但是在某一时刻,只有一个任务被执行。单核处理器可以做到并发。
并行是在同一时刻,有多个任务在执行,需要多核处理器才能完成,在微观上就能同时执行多条指令。

多线程相较单线程的好处

并发提升程序的执行效率
提升CPU利用率
更快的响应速度,可以有专门的线程监听请求和专门的线程处理请求

进程通信

进程间通信,可以采用管道通信、消息队列、共享内存、信号量。

什么是死锁

死锁是指两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力作用,他们都无法推进下去。

死锁怎么产生

死锁产生有四个必要条件

  • 互斥:一个资源只能给一个进程使用
  • 请求与保持:一个进程因请求资源而阻塞时,不释放获得的资源
  • 不剥夺:进程已经获得的资源,在未使用之前,不能强行剥夺
  • 循环等待:进程之间相互等待资源。

避免死锁的方法

  • 打破互斥条件:允许多个进程共同访问同一个资源
  • 打破请求与保持:一次性申请所有资源
  • 打破不剥夺:占有一部分资源的进程申请其他资源时,如果申请不到,就释放占有的资源
  • 打破循环等待:按序申请资源

进程调度策略

  • 先来先服务:非抢占式, 按照请求的顺序进行调度,有利于长作业,不利于短作业
  • 短作业优先:非抢占式,按照估计运行时间最短的原则进行调度,长作业可能会一直得不到调度
  • 最短剩余时间优先:短作业优先的抢占式版本,按照剩余运行时间进行调度,当新作业到来时,其整个运行时间与当前作业剩余运行时间比较,如果新进行的需要时间更少,则挂起当前进程,运行新的进程。否则新进程等待。
  • 时间片轮转:所有进程按照FCFS原则排成一个队列,每次调度将CPU时间分配给首进程,该进程执行一个时间片,时间片用完时,计时器发出中断,调度程序停止该进程的执行,送完队尾,同时将CPU时间分配给队首的进程。
  • 优先级调度:为每个进程分配优先级,按照优先级进行调度。

进程有哪些状态

进程一共有5种状态,分别是创建、就绪、运行、终止、阻塞。操作系统知识速记1_第1张图片

内存碎片

内存碎片有内部碎片和外部碎片
内部碎片是采用固定大小的内存分区,当一个进程不能完全使用分配给他的固定内存区域就会产生内存碎片。
外部碎片是由于某些未分配的连续内存区域太小,不能满足任意进程的内存分配请求,不能被进程利用的内存区域。

内存碎片的解决方法

普遍采用段页式内存分配,将内存分为不同的段,再将每一段分成固定大小的页,通过页表机制,使段捏的页可以不必连续处于统一内存区域。

虚拟内存

虚拟内存能从逻辑上对内存容量进行扩充,虚拟内存具有多次性、对换性、虚拟性三个特征,他可以将程序分多次调入内存,使得在较小的用户空间内可以执行较大的用户程序,同时容纳更多进程并发执行,从而提高系统的吞吐量。

什么是分页

把内存空间划分成大小相等且固定的页块,作为主存的基本单位。数据在不同的页,页离散分布在内存中,需要页表记录映射关系,实现从页号到物理块号的映射。访问分页系统的数据需要两次,第一次访问页表得到指定物理块号,加上业内偏移得到实际物理地址,第二次访问第一次得到的地址获取数据。

什么是分段

分段是为了满足程序员编写代码时的逻辑需求,如数据共享、数据保护、动态链接等。分段内存管理中,地址是二维的,一维是段号,二维是段内地址,每个段的长度不一样,但是都从0开始编址。每个段内部是连续分配的,段与段之间是离散的,也存在逻辑地址到物理地址的映射,即段表机制。

页面置换算法

应用程序是分多次装入内存的,运行到一段时间,一定会发生缺页。运行时,如果要访问的页面不存在,就会发生缺页中断。此时操作系统必须在内存中选择一个页把它移出内存,为即将调入的页让出空间。
几种页面置换算法:

  • 最佳置换算法(理想):将当前页面中未来最长时间不会访问的页置换出去。
  • 先进先出:淘汰最早调用的页
  • 最近最久未使用:每个页面上记录上次访问到现在的间隔,每次置换间隔值最大的页。
  • 时钟算法(最近未使用):将页面连接为一个环形列表,每个页有一个访问位0/1,1代表下次指针指向它免除置换,0代表下次指针指向它要被置换,页面被访问时设为1.
  • 改进型时钟算法:加一个修改位,优先替换访问位和修改位都是0的页面
  • 最少使用算法:寄存器记录页面被访问次数,每次替换最少访问的。

用户态和内核态

  • 内核态:cpu可以访问内存的所有数据,包括外围设备,cpu也可以将自己从一个程序切换到另一个程序
  • 用户态:只能首先访问内存,不允许访问外围设备,占用cpu的能力被剥夺,cpu可以被其他程序获取。

最大的区别是权限不同,用户态下的程序不能直接访问操作系统内核数据和程序。

为什么要区分用户态和内核态

内核速度快但是资源有限,能控制的进程数不多,需要速度慢一些的用户态协助,但是为了避免用户态被恶意利用,限制了用户态程序的权限,限制不同程序之间的访问能力,防止他们获得别的程序的内存数据,或者获取外围设备数据。

什么时候转换

  • 系统调用:用户态进程通过操作系统提供的服务程序完成工作。
  • 发生异常:会从当前运行进程转换到处理异常的内核程序中。
  • 外围设备中断:从外围设备读取数据只有操作系统能做,用户程序需要向操作系统请求这些操作。

缓冲区溢出

当前计算机缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖到了合法数据上。会导致程序崩溃或跳转到恶意代码上。

后记

你永远想不到机会会在什么时候出现,而机会都是给有准备的人的,所以,时刻准备。

你可能感兴趣的:(面试,程序人生)