一. 操作系统的四个特性
并发:同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件)
共享:系统中的资源可以被内存中多个并发执行的进线程共同使用
虚拟:通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进
二.进程
进程是操作系统中进行保护和资源分配的基本单位。
1.进程的状态
- 就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行。
- 执行:进程已经获得CPU,程序正在执行状态。
- 阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。
进程挂起:解决死锁,不分配资源,不参与调度。
2.进程的组成
程序段、相关的数据段和PCB三部分构成进程实体。
进程控制模块(PCB)
系统为每个进程定义了一个数据结构,进程控制块PCB。包括:
进程有多个子进程,只有一个父进程,父进程撤销,子进程可以不被撤销,此时子进程将成为孤儿进程,由于进程不可能脱离进程树而独立存在,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
3.进程特征
动态性:是一次执行过程,创建,调度执行,撤销等动态的。
并发性:多进程同时存在内存,一段时间内同时运行。
独立性:进程是独立运行的基本单位,也是资源分配和调度的独立单元。
异步性:各进程各自独立,不可预知的向前推进。
结构化:每个进程配PCB,程序段,数据段。
4.进程切换
进程切换:保存旧进程的上下文到PCB数据结构,加载新进程的上下文。每个进程有对应的内存映射,防止多个进程同时加载到内存之间相互影响。
作业调度:是指作业从外存调入到内存的过程
进程调度:是指进程从内存到分配cpu执行的过程
周转时间: 从开始申请执行任务,到执行任务完成
响应时间: 从开始申请执行任务到开始执行任务
进程调度算法
先来先服务调度算法FCFS:按作业或者进程到达的先后顺序依次调度;(平均周转时间可能会很长 )
短作业优先调度算法SJF:算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行(周转时间短,但是响应时间长 )
最短剩余时间优先:进程调度总是选择预期剩余时间最短的进程。
高相应比算法HRN:响应比=(等待时间+要求服务时间)/要求服务时间;
时间片轮转调度RR:按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 ;(响应时间可以得到保证)
多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法,队列之间采用固定优先级抢占调度。其中,一个进程根据自身属性被永久地分配到一个队列中。
多级反馈队列调度算法:目前公认较好的调度算法;设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。
5.进程通信
管道pipe:管道只能用于亲缘关系的父子进程,命名管道非父子进程间通信。半双工通信。
(1)、如果管道为空,从管道读取数据的一方会阻塞。直到管道中有新的数据为止
(2)、管道的数据通信具有FIFO特性
消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。管道中的数据并没有分割为一个一个的数据独立单位,在字节流上是连续的。然而,消息队列却将数据分成了一个一个独立的数据单位,每一个数据单位被称为消息体。每一个消息体都是固定大小的存储块儿,在字节流上是不连续的。
共享内存SharedMemory:各个进程都能够共同访问的共享的内存区域;是独立于所有的进程空间之外的地址区域。
信号量Semaphore:表示的是一种共享资源(空闲)的个数,对共享资源的访问规则。用一种数量去标识某一种共享资源的个数(空闲)。当有进程需要访问对应的共享资源的时候,则需要先查看(申请),根据资源对应的当前可用数量进行申请。(申请所需要使用的资源个数)
信号 ( sinal ) :信号又被称之为中断,需要处理什么对应的是中断处理函数,此时设置断点,形参入栈,保存现场信息,然后去执行中断处理函数,当处理完成之后,恢复现场信息,程序继续往下执行
套接字Socket:网络之间不同进程间通信。
三.线程
线程是操作系统进程中能够独立执行的实体,是处理器调度和分派的基本单位。不分配资源,没有内存映射,多线程共同使用进程资源。
线程有自己的TCB(thread control block线程控制块), 只负责这条流程的信息,包括PC程序计数器,SP栈,State状态,和寄存器,线程id。
线程有内核级线程和用户级线程,我们一般说的都是用户级线程,线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。内核级线程由内核管理,应用程序没有进行线程管理的代码,只能调用内核线程的接口。只有内核级线程才能发挥多核性能,因为内核级线程共用一套MMU(即内存映射表),统一分配核1核2(即有多个CPU,可以一个CPU执行一个内核级线程)。进程无法发挥多核性能,因为进程切换都得切MMU。