用户态:用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。当应用程序需要执行某些需要特殊权限的操作,例如读写磁盘、网络通信等,就需要向操作系统发起系统调用请求,进入内核态。
内核态:内核态运行的进程几乎可以访问计算机的任何资源包括系统的内存空间、设备、驱动程序等,不受限制,拥有非常高的权限。当操作系统接收到进程的系统调用请求时,就会从用户态切换到内核态,执行相应的系统调用,并将结果返回给进程,最后再从内核态切换回用户态。
用户态切换到内核态的三种方式:
系统调用:用户态进程主动要求切换到内核态。
中断:收到中断信号后,切换到中断处理程序。
异常:切换到处理异常的内核相关程序。
进程:运行的程序。
线程:进程当中的一条执行流程,是程序执行的最小单位。共享进程的堆和方法区,独享自己的程序计数器、虚拟机栈和本地方法栈。
并行:同一时刻,多个任务在处理器上执行。
并发:在一个时间段内,多个任务一起执行。(同一时刻只有一个任务执行)
线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。
互斥锁:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
读写锁:允许多个线程同时读取共享资源,但只有一个线程可以对共享资源进行写操作。
信号量:允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
屏障:是一种同步原语,用于等待多个线程到达某个点再一起继续执行。当一个线程到达屏障时,它会停止执行并等待其他线程到达屏障,直到所有线程都到达屏障后,它们才会一起继续执行。
事件:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
描述信息:名称、标识符等
调度信息:阻塞原因、进程状态(就绪、阻塞等)、进程优先级等
资源需求:CPU时间、内存空间、I/O设备等
打开的文件信息:文件描述符、文件类型、打开模式等
处理机的状态信息:处理机的各种寄存器的内容
创建:正在被创建 ,未就绪
就绪:已经准备运行,获得了除处理器外的所需的所有资源
运行:正在处理器上运行
阻塞:等待某一事件(资源或I/O操作)
结束:正常结束或其它原因中断退出运行
管道(匿名管道):父子进程或兄弟进程间通信,存在内存中的文件
有名管道:遵循先进先出,以磁盘文件的方式存在,可以实现本机任意两个进程通信
信号:用于通知接受进程某个事件已经发生
消息队列:消息的链表,存在内核中,可以随机查询消息,不一定先进先出
信号量:是一个计数器,用于多进程对共享数据的访问
共享内存:多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程对共享内存数据中的更新,依赖与某种同步操作
套接字:主要用于客户端和服务器之间通过网络进行通信,可以看做是不同主机之间的进程进行双向通信的端点
先来先服务(FCFS):从就绪队列中选择最先进入该队列的进程
短作业优先(SJF):选择估计运行时间最短的进程
时间片轮转调度(RR):每个进程分配一个时间段
多级反馈队列(MFQ):既能使高优先级的作业得到响应又能使短作业迅速完成
优先级调度:为每个进程分配优先级,限制性优先级高的进程;优先级相同时,遵循FCFS方式
僵尸进程:子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。
孤儿进程:一个进程的父进程已经终止或者不存在,但是该进程仍在运行。这种情况下,该进程就是孤儿进程。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。
互斥:资源处于非共享模式
持有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有
不可剥夺:资源不能被剥夺。只能在持有资源的进程完成任务后,该资源才会被释放
循环等待:资源的等待形成一个循环
预防:破坏死锁的第二和第四个条件
静态分配:先申请,再执行
层次分配:避免出现环
避免:将系统的状态分为安全状态和不安全状态,分配资源前测试系统状态,只给安全状态分配资源
检测:系统状态用进程-资源分配图表示,检测系统是否处于死锁状态。
解除:
结束所有进程,重启操作系统。
撤销设计死锁的所有进程,解除死锁后继续运行。
逐个撤销设计死锁的进程,回收资源直到死锁解除。
抢占资源,从涉及死锁的一个或多个进程中抢占资源,将其再分配给涉及死锁的进程直到死锁解除。
内部内存碎片:已经分配给进程但未被使用的内存。(使用固定比例分配,如2的幂次方分配)
外部内存碎片:未分配的连续内存空间太小,不能满足任意进程所需要的内存分配请求。
连续内存管理:为一个用户程序分配一个连续的内存空间。
非连续内存管理:允许程序使用的内存分布在离散或不相邻的内存中。
块式管理:将内存分为固定大小的块,每个块中只包含一个进程。存在内部碎片和外部碎片。
段式管理:以段(一段连续的物理内存)的形式管理/分配物理内存。应用程序的虚拟地址空间被分为大小不等的段。
页式管理:把物理内存分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页。
段页式管理:结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。
操作系统一般通过 CPU 芯片中的一个重要组件 MMU(Memory Management Unit,内存管理单元) 将虚拟地址转换为物理地址,这个过程被称为 地址翻译/地址转换(Address Translation) 。
MMU 将虚拟地址翻译为物理地址的主要机制有两种: 分段机制 和 分页机制 。
分段机制:以段(一段连续的物理内存)的形式管理/ 分配物理内存。通过段表映射虚拟地址和物理地址。
段号:标识着该虚拟地址属于整个虚拟地址空间中的哪一个段。
段内偏移量:相对于该段起始地址的偏移量。
分页机制:把物理内存分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页。通过页表映射虚拟地址和物理地址。
页号:通过虚拟页号可以从页表中取出对应的物理页号。
页内偏移量:物理页起始地址+页内偏移量=物理内存地址。
多级页表:一级页表项等于一个二级页表。
快表:高速缓存。
硬性页缺失:物理内存中没有对应的物理页。
软性页缺失:物理内存中有对应的物理页,但虚拟页还未和物理页建立映射。
当发生硬性页缺失时,如果物理内存中没有空闲的物理页面可用的话。操作系统就必须将物理内存中的一个物理页淘汰出去,这样就可以腾出空间来加载新的页面了。
先进先出(FIFO):淘汰最先进入内存的页面。存在Belady现象(分配的页面数增多但缺页率反而提高)。
最佳置换(OPT):优先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面。
最近最久未使用(LRU):淘汰最久未被使用的页面。
最少使用置换(LFU):之前一段时间最少使用的页面。
时钟置换(Clock):循环遍历所有页面,访问位位1将其置0;访问位为0则淘汰。
对磁盘访问请求进行排序和调度的算法,其目的是提高磁盘的访问效率。
先来先服务(FCFS):按照请求到达磁盘调度器的顺序进行处理。
最短寻道时间优先(SSTF):优先选择距离当前磁头位置最近的请求进行服务。存在饥饿问题。
扫描(SCAN):磁头沿着一个方向扫描磁盘,如果经过的磁道有请求就处理,直到到达磁盘的边界,然后改变移动方向,依此往复。
循环扫描(C-SCAN):只在磁盘的一侧进行扫描,并且只按照一个方向扫描,直到到达磁盘边界,然后回到磁盘起点,重新开始循环。
边扫描边观察(LOOK):如果磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向,依此往复。
均衡循环扫描(C-LOOK):如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。