tmachc's notes

Stay Hungry, Stay Foolish.

0%

操作系统知识点概述

进程状态转换


就绪等待CPU资源,阻塞等待CPU之外的资源,如I/O

进程和线程

进程是资源分配的单位,线程是CPU调度基本单位,进程有独立的内存空间,线程没有,但是线程有寄存器,独立的栈,程序计数器等)

一个进程可以包含多个线程,进程不能直接访问另一进程的变量和数据结构,必须通过进程通信,同一进程的多个线程可以共享部分进程内存

进程通信方式

管道(Pipe)及有名管道(Named Pipe)—-无格式字节流、缓冲区大小受限
报文(Message)队列(消息队列)—消息链接表(Posix及System V消息队列)克服了管道的不足,有足够权限向队列写入消息,被赋予读权限的进程读走队列消息
信号(signal)–通知进程有事情发生共享内存–最快,与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore)–主要作为进程间以及同一进程不同线程之间的同步手段
套接字(Socket)–可以用于不同机器的进程通信

线程同步的几种方式

临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)
临界区–通过对多线程的串行化来访问公共资源或一段代码,只能一个线程访问,其他线程被挂起,等待释放在抢占
互斥量–互斥对象,加锁
信号量–同一时刻允许多线程访问访问, 但限制最大数目,其他线程等待
事件–通知操作保持同步,方便多线程的优先级比较

线程实现方式

用户线程(User-Level Thread)和内核线程(Kernel-Level Thread,轻量级进程)

1) 用户线程是不需要内核支持在用户程序中实现的线程,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。速度快,不需要用户态/核心态切换。处理器时间片以进程为单位分配,线程时间相对减少。
2)内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。
用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

用户态和内核态

在讲述用户态和核心态的区别之前,我们先要说说“特权级”的概念。

创建一个子进程时,是通过调用fork函数来实现的。事实上,fork的工作实际上是以系统调用的方式完成进程创建功能的,具体的工作是由sys_fork负责实施。

对于任何操作系统来说,创建一个新的进程都是属于核心功能,需要分配物理内存,从父进程拷贝相关信息,拷贝设置页目录页表等等

最关键性的权力必须由高特权级的程序来执行,这样才可以做到集中管理,减少有限资源的访问和使用冲突。

Intel x86架构的CPU共有0~3四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查,相关的概念有CPL、DPL和RPL等

对于Unix/Linux来说,只使用了0级特权级和3级特权级。也就是说在Unix/Linux系统中,一条工作在0级特权级的指令具有CPU能提供的最高权力,而3级特权级的指令具有CPU提供的最低或者说最基本权力。

内核态与用户态是操作系统的两种运行级别,3级特权级上,就可以称之为运行在用户态;0级特权级上时,为运行在内核态。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的。通常来说,以下三种情况会导致用户态到内核态的切换

  • 系统调用–用户态主要要求切换到核心态。用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际执行了一个创建新进程的系统调用。
  • 异常–当用户态程序运行时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
  • 外围设备的中断–从用户态程序切换到中断处理程序,被动切换

用户栈和内核栈

每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。
当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,寄存器里面的内容是内核栈空间地址,使用内核栈。
内核栈保存中断现场以及操作系统进程的信息,用户栈保存用户进程子程序的信息
只使用用户栈不能给予CPU和系统程序处于内核态时的保护,只使用系统栈,不能完整保存用户程序信息

内存池、线程池、线程池

池化技术一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用。 主要解决用户态/内核态,内存申请释放,进程线程创建销毁等一系列耗时耗能的操作
进程池、线程池—-提前启动若干线程并睡眠,当需要开辟线程时,唤醒某一个执行操作, 然后继续处于睡眠状态,而非销毁
内存池—-程序首先申请一大块内存作为内存池,当程序需要申请内存时从内存池中获取, 使用完后返回内存池,退出程序或特殊操作释放内存池中内存。

死锁

产生原因:1)资源不足 2)程序执行顺序不当 3)资源分配不当
产生条件:
1)互斥条件,只能一个使用
2)请求与保持条件,请求资源被阻塞,保持已有资源
3)不剥夺条件,请求资源未使用完不能强行使用
4)循环等待
动态检查资源,防止等待状态的资源占用等从上述四条件入手解决死锁问题

进程调度算法

1)先来先服务FCFS
2)短作业优先
3)最高优先权优先(FPF)
4)高响应比优先调度算法
5)时间片轮转法
6)多级反馈队列调度算法(按优先权多队列,越高时间片越小,一个时间片未运行完向下一队列排队,长作业进入第N队列,先执行完第一队列)

Windows内存管理算法

1)块式,内存浪费
2)页式
3)段式,程序片段太多,计算段地址浪费资源
4)段页式最常用
内存分配方式:单一连续分配、固定分区分配、动态分区分配以及动态重定位分区分配。四种方式

动态链接和静态链接

动态链接在程序运行获加载时动态加载需要的动态库,可以多程序共享库,但是影响前期加载性能。
静态链接是在编译时已经将需要的代码放到调用处,运行时不依赖库。程序独立运行,但可能体积偏大

基本分页、请求分页储存管理方式。

基本分页储存管理—-1)一次性,作业全部装入才能运行,内存浪费 2)驻留性,作业装入后一直在内存中。
请求分页储存管理—-装入当前需要运行的页面,过程中页面已满,通过算法动态调整页面空间硬件支持:页表机制、缺页中断机构、地址变换机构

基本分段、请求分段储存管理方式(略)

分段分页方式的比较各自优缺点

分段和分页其实都是一种对地址的划分或者映射的方式
1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。

2)页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

3)分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符(线性地址的16进制表示),即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名(比如数据段、代码段和堆栈段等),又需给出段内地址。

4)页和段都有存储保护机制。但存取权限不同:段有读、写和执行三种权限;而页只有读和写两种权限。

页面置换算法

1)最佳置换算法(OPT) 2)先进先出置换算法(FIFO) 3)最久未使用置换算法(LRU)

虚拟内存的定义及实现方式

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

操作系统的四个特性

1)并发(concurrence) 2)共享(sharing) 3)虚拟(Virtual) 4)异步(asynchronism)

DMA

直接存储器访问(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它允许某些计算机内部的硬件子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU)。在同等程度的处理器负担下,DMA是一种快速的数据传送方式。很多硬件的系统会使用DMA,包含硬盘控制器、绘图显卡、网卡和声卡。

Spooling

SPOOLing(即外部设备联机并行操作),即Simultaneous Peripheral Operation On-Line的缩写,它是关于慢速字符设备如何与计算机主机交换信息的一种技术,通常称为“假脱机技术”。

外存分配的几种方式,及其优劣

1)连续分配—顺序存取,随机存取,速度快,磁盘操作少,但是文件不能动态增长,不利于文件插入,外部碎片等等
2)链式分配—提高利用率,有利于文件插入删除,动态扩充,但是速度较慢,从头指针查询,可靠性成疑,链接指针占用空间,按簇分配占用内存空间
3)索引分配—FAT中存储文件索引,包含每个分区入口。解决链式问题,继承其优点但是寻道次数和时间偏高,索引表本身会带来部分开销