操作系统是管理计算机硬件和软件的程序,主要有6大功能
-
进程和线程的管理:进程的创建、撤销、阻塞、唤醒,进程间通信等
-
存储管理:内存的分配和管理、外存的分配和管理等
-
文件管理:文件的读写、创建、删除等
-
设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放、以及设备启动等
-
网络管理:管理计算法网络的配置、连接、通信、安全等
-
安全管理:用户的身份认证、访问控制、文件加密等
用户态和内核态
1.定义
在操作系统中,内核态是运行操作系统程序、操作硬件的状态,具有最高权限;而用户态是运行用户程序的状态,拥有有限的权限;当用户程序需要操作系统帮助完成一些它没有的权限所能完成的事情时,就会发生用户态和内核态的切换。这两种状态是操作系统为了安全和管理而设计的。
2.为什么
安全性:将操作系统和用户程序的运行环境分开,防止用户程序对系统造成不可修复的破坏。
稳定性:如果一个用户程序崩溃或出现错误,不会影响整个系统的稳定性。
性能:将一些特权操作限制在内核态有助于提高系统的性能。
3.怎么切换
用户态切换到内核态有三种方式
-
系统调用Trap:用户态主动要求切换到内核态的一种方式。当用户程序需要访问操作系统底层资源例如文件、网络、设备时,发起系统调用,发生中断。然后CPU中断正在执行的程序,跳转到中断处理程序,开始执行内核程序。系统调用完成后,操作系统切换回用户态,继续执行用户程序。
-
中断Interrupt:当外围设备完成用户请求的操作后,会向CPU发出中断信号,CPU会中断正在执行的程序,转而执行中断处理程序。
-
异常Exception:当CPU在执行运行在用户态的程序时,发生了某些不可知的异常,会触发当前正在运行的进程切换到处理此异常的内核相关程序中,比如缺页异常。

进程和线程
进程是资源管理的最小单位,线程是程序执行的基本单位。
进程
PCB进程控制块
是操作系统用来管理和跟踪进程的数据结构,包含了进程的描述信息、调度信息、资源使用等等。
进程的状态
创建、就绪、运行、阻塞、结束。

进程间通信IPC
进程间通信IPC的方式通常有管道(无名管道、命名管道)、消息队列、信号量、共享内存、Socket等,Socket支持不同主机上的两个进程通信。
管道
无名管道:
管道通常是UNIX系统最古老的形式,特点是半双工(数据只能在一个方向上流动);只能用于有亲缘关系的进程间通信(父子、兄弟);管道中的数据是无结构的字节流,缺乏消息边界;可以看做是特殊的文件,但不是普通的文件,不属于任何文件系统,只存在于内存中。

命名管道:
为管道指定名字,可以在无关的进程之间交换数据;以一种特殊设备文件的形式存在于文件系统中。

消息队列
消息队列是消息的链接表,存放在内核中,由标识符标识;支持结构化的消息,每条消息有明确的边界;可以为消息分配优先级;支持按类型接收消息,而不仅仅是FIFO
信号量
信号量可以看做是计数器,可用于进程间的同步,而不能用于进程间通信数据,需要结合共享内存。
共享内存
共享内存是最快的一种IPC,进程直接对内存进行存取;多个进程同时操作时,需要结合信号量进行进程间同步。
进程调度算法
-
先到先服务调度算法(FCFS,First Come, First Served) : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
-
短作业优先的调度算法(SJF,Shortest Job First) : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
-
时间片轮转调度算法(RR,Round-Robin) : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
-
优先级调度算法(Priority):为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
-
多级反馈队列调度算法(MFQ,Multi-level Feedback Queue) :前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
僵尸进程和孤儿进程
-
僵尸进程:子进程终止,父进程仍在运行,且父进程没有调用wait()或waitpid()来获取子进程状态和释放子进程占用的资源,导致子进程的PCB仍然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为僵尸进程。通过Top命令查看,zombie标识僵尸进程的数量
-
孤儿进程:一个进程的父进程已经终止或不存在,但是该进程仍在运行。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。
线程
线程同步的方式
线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。
-
互斥锁Mutex:只有拥有互斥对象的线程才有访问公共资源的权限,比如Java中的synchronized关键字和各种Lock
-
读写锁:允许多个线程同时读取共享资源,但是只有一个线程可以对共享资源写
-
信号量Semaphore:计数器,允许同一时刻多个线程访问同一资源,但是控制访问的线程数量
-
屏障Barrier:屏障是一种同步原语,用于等待多个线程到达某个点后再一起继续执行,比如Java中的CyclicBarrier
-
事件:wait/notify机制,通过通知的方式保持多线程同步,可以方便地实现多线程优先级。
死锁
产生死锁的四个必要条件
互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。
占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
循环等待 :有一组等待进程 {P0, P1,..., Pn}
, P0
等待的资源被 P1
占有,P1
等待的资源被 P2
占有,......,Pn-1
等待的资源被 Pn
占有,Pn
等待的资源被 P0
占有。
参考:blog.csdn.net/LEON1741/ar...