操作系统
操作系统的定义
操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。- 操作系统的功能和目标
(1)作为系统资源的管理者
(2)作为用户和计算机硬件之间的接口
a.联机命令接口=交互式命令(说一句做一句)
b.脱机命令接口=批处理命令接口(说一堆做一堆)eg:.bat批处理文件
c.程序接口=系统调用=广义指令(通过程序调用间接使用的,右一组系统调用组成)eg: .dll文件
(3)作为最接近硬件的层次 - 操作系统的特征
a.并发和并行的区别 - 操作系统的运行机制和体系结构
a.两种指令:CPU能够识别、执行的最基本的命令;内存清零->特权指令;加减乘除->非特权指令;
b.处理器状态:
c.内核程序&应用程序
d.运行机制
e.操作系统的内核
大内核=(时钟+中断+原语)+(进程管理+存储器管理+设备管理)
小内核=(时钟+中断+原语) - 中断和异常
- 系统调用
(一)总览
(二)什么是系统调用?
是操作系统提供给应用程序使用的接口,可以理解成一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务
(三)系统调用的作用和分类?
系统调用需要在核心态进行执行;凡是和资源有关的操作,都会影响其他进程的操作,一定需要操作系统的接入,就会需要通过系统调用来进行实现。
系统调用背后的操作:(发起是从用户态+执行是在核心态) - 进程的定义、组成、组织方式、特征
(1)进程的定义
进程是具有独立功能的程序在数据集合上运行的过程。进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。进程实体是静态的,进程是动态的。
(2)进程的组成
程序段、数据段、PCB三部分组成了进程实体。创建进程=创建PCB;PCB是进程存在的唯一标志。
(3)进程的组织(多个进程间的管理)
(4)进程的特征 - 进程的状态和转换
(1) 进程的5种状态
(2)进程状态的转换
外界干预可能将就绪态、运行态、阻塞态--->终止态(eg:kill进程) - 进程的控制
(1)什么是进程控制?
实现进程间状态的转换就是进程的控制
(2) 原语实现进程控制。
原语的特点是不允许中断,即进行原子操作。原子采用关中断指令+开中断指令,保证原语不会被中断。
进程控制的原语有:进程的创建、终止、阻塞、唤醒、切换 - 进程间的通信
类型 说明 管道/匿名管道pipe
(1)管道是半双工的、单向的,双方通信需要两个管道;(2)只能用于父子或兄弟进程;(3)管道的实质是内核缓冲区;(4)管道传输的是无格式字节流;(5)管道是没有名字的;有名管道(FIFO) 匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO)。
有名管道不同于匿名管道之处在于它提供了一个路径名与之关联,以有名管道的文件形式存在于文件系统中,这样,即使与有名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信,因此,通过有名管道不相关的进程也能交换数据。值的注意的是,有名管道严格遵循先进先出(first in first out),对匿名管道及有名管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。有名管道的名字存在于文件系统中,内容存放在内存中。共享内存
(1)进程对共享空间的访问是互斥的信号 信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态 Linux系统中常用信号:
(1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。
(2)SIGINT:程序终止信号。程序运行过程中,按Ctrl+C
键将产生该信号。
(3)SIGQUIT:程序退出信号。程序运行过程中,按Ctrl+\\
键将产生该信号。
(4)SIGBUS和SIGSEGV:进程访问非法地址。
(5)SIGFPE:运算中出现致命错误,如除零操作、数据溢出等。
(6)SIGKILL:用户终止进程执行信号。shell下执行kill -9
发送该信号。
(7)SIGTERM:结束进程信号。shell下执行kill 进程pid
发送该信号。
(8)SIGALRM:定时器信号。
(9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。信号量 信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。
为了获得共享资源,进程需要执行下列操作:
(1)创建一个信号量:这要求调用者指定初始值,对于二值信号量来说,它通常是1,也可是0。
(2)等待一个信号量:该操作会测试这个信号量的值,如果小于0,就阻塞。也称为P操作。
(3)挂出一个信号量:该操作将信号量的值加1,也称为V操作。为了正确地实现信号量,信号量值的测试及减1操作应当是原子操作。为此,信号量通常是在内核中实现的。Linux环境中,有三种类型:Posix(可移植性操作系统接口)有名信号量(使用Posix IPC名字标识)、Posix基于内存的信号量(存放在共享内存区中)、System V信号量(在内核中维护)。这三种信号量都可用于进程间或线程间的同步。
消息队列 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。 与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。 另外与管道不同的是,消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。 消息队列特点总结:
(1)消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识.
(2)消息队列允许一个或多个进程向它写入与读取消息.
(3)管道和消息队列的通信数据都是先进先出的原则。
(4)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。
(5)消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。
(6)目前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列,系统V消息队列目前被大量使用。系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除。套接字 套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。 套接字特性
套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。
(1)套接字的域
它指定套接字通信中使用的网络介质,最常见的套接字域有两种:
一是AF_INET,它指的是Internet网络。当客户使用套接字进行跨网络的连接时,它就需要用到服务器计算机的IP地址和端口来指定一台联网机器上的某个特定服务,所以在使用socket作为通信的终点,服务器应用程序必须在开始通信之前绑定一个端口,服务器在指定的端口等待客户的连接。
另一个域AF_UNIX,表示UNIX文件系统,它就是文件输入/输出,而它的地址就是文件名。
(2)套接字的端口号
每一个基于TCP/IP网络通讯的程序(进程)都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的端口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口,这样形成的整体就可以区别每一个套接字。
(3)套接字协议类型 因特网提供三种通信机制,
一是流套接字,流套接字在域中通过TCP/IP连接实现,同时也是AF_UNIX中常用的套接字类型。流套接字提供的是一个有序、可靠、双向字节流的连接,因此发送的数据可以确保不会丢失、重复或乱序到达,而且它还有一定的出错后重新发送的机制。
二个是数据报套接字,它不需要建立连接和维持一个连接,它们在域中通常是通过UDP/IP协议实现的。它对可以发送的数据的长度有限制,数据报作为一个单独的网络消息被传输,它可能会丢失、复制或错乱到达,UDP不是一个可靠的协议,但是它的速度比较高,因为它并一需要总是要建立和维持一个连接。
三是原始套接字,原始套接字允许对较低层次的协议直接访问,比如IP、 ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW。 - 线程的概念
(1)什么是线程?为什么引入线程?
可以把线程理解成“轻量级的进程”;线程是一个基本的CPU执行单元,也是程序执行流的最小单位;引入线程后,不仅进程之间可以并发,线程之间也可以并发,进一步提升了系统的并发度。引入线程后,进程只作为除CPU之外的系统资源的分配单元。
(2)线程机制带来的改变?
线程和进程都可以都可以并发进行;线程的运行环境的切换的开销低于进程的运行环境的切换;引入线程后,并大的成本降低了。
(3)线程的属性?
(4)线程的实现方式(用户级线程&内核级线程)
内核级线程才是处理机分配的单位
(5)多线程模型(多对一、一对一、多对多) - 处理机调度的概念和层次
(1)调度:一堆任务需要处理时,由于资源有限,需要确定某种规则来决定顺序,这就是调度。
处理机调度:从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行。
(2)
【1】高级调度(作业调度):按一定原则从外存上处于后备队列的作业中挑选一个或多个作业,给他们分配内存等资源,并创建PCB,使其获得竞争处理机的权利。高级调度是外存与内存之间的调度。每个作业只调入、调出一次。调入时创建创建的PCB、作业调出时撤销PCB。
【2】中级调度(内存调度):(引入进程的7状态模型)
【3】低级调度(进程调度)
按照某种方法和策略从就绪队列中选择一个进程分配处理机。是操作系统中最基本的一种调度,频率高,几十毫秒一次。
【三层调度的联系与对比】 - 进程调度(处理机的低级调度)的时机、切换与过程、方式
(1)时机(什么时候可以切换&什么时候不能切换)
(2)进程调度的方式?
a.非剥夺调度方式(非抢占方式)。只允许进程主动放弃处理机。
b.剥夺调度方式(抢占方式)。可以优先处理更紧急的进程,也可以实现让各个进程按时间片轮流执行。
(3)进程的切换与过程 - 调度算法
(1)评价调度算法的指标
CPU利用率=CPU忙碌时间/总时间
系统吞吐量(单位时间内完成的作业数)=总完成作业数/总时间
周转时间(作业提交到完成的时间)=完成时间-提交时间
平均周转时间=总周转时间/作业数
带权周转时间=作业周转时间/作业实际运行时间
平均带权周转时间
等待时间(作业处于等待处理机状态时间之和)
响应时间=从用户提交请求到首次产生响应所用的时间
(2)调度算法(批处理系统)
a.先来先服务
b.短作业优先
c.高响应比优先
【调度算法总结】
(3)调度算法(交互式系统)
a.时间片轮转调度算法
b.优先级调度算法
c.多级反馈队列调度算法
【总结】 - 进程同步和进程互斥
(1)什么是进程的同步和互斥
(2)进程互斥的软件实现办法
(3)进程互斥的硬件实现
(4)信号量机制(实现进程互斥、进程同步、前驱关系)
信号量实现进程互斥
信号量实现进程同步 - 进程、线程、协程
(1)基础概念进程和线程、协程的区别
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句 柄等)比较大,但相对比较稳定安全。
线程是进程的一个实体,是CPU调度的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
(2)对比-
1、进程多与线程比较
-
线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
-
1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
-
2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
-
3) 线程是处理器调度的基本单位,但进程不是
-
4) 二者均可并发执行
-
5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
-
2、协程多与线程进行比较
-
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。
-
2) 线程进程都是同步机制,而协程则是异步
-
3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
-
- 同步、异步、阻塞、非阻塞、并发、并行、CPU调度策略
- 线程同步、进程同步的方式
(1)线程同步
(2)进程同步 - 管程
20.死锁
(一)概念
(二)死锁的条件
(三)什么时候会发生死锁
对不可剥夺资源的不合理分配,可能导致死锁
(四)死锁的解决办法
a.预防死锁【不允许死锁发生、静态策略】
(1)破坏互斥条件
(2)破坏不剥夺条件
(3)破坏请求和保持条件
(4)破坏循环等待条件
b.避免死锁【不允许死锁发生、动态策略】
c.死锁的检测和解除【允许死锁发生】
21.内存
(一)内存的基础知识
内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。
内存地址是从0开始,每个地址对应一个存储单元,(a)如果“按字节编码”,每个存储单元的大小为1字节,1B,8个二进制位。(b)如果“按字编码”,则每个存储单位为1个字,每个字的大小为16/32/64个二进制位。
常用单位:2¹⁰B=1kb;B=Byte 字节
(二)内存管理
(1)内存空间的扩充
覆盖技术
交换技术
(2)内存的空间的分配与回收
动态分区分配算法
非连续分配管理方式
(1)基本分页存储管理
单级页表存在的问题
(2)基本分段存储管理
(3)段页式
(三)内存空间的扩充——虚拟存储技术
(1)传统的存储管理方式的特征
(2)请求分页管理方式
a.页表机制b.缺页中断机构
缺页中断属于内中断的-故障
c.地址变换结构
(3)页面置换算法
a.最佳置换算法(OPT)
每次选择淘汰的页面是以后永不使用,或者最长时间内不再被访问的页面。【前提是已经知道了各个页面的访问序列】不现实
b.先进先出置换算法(FIFO)
每次淘汰的是最早进入内存的页面
c.最近最久未使用置换算法(LRU)
性能好 开销大 需要硬件支持
d.时钟置换算法(CLOCK)(NRU)最近未用算法
e.改进型时钟置换算法(4)页面分配策略
a.页面分配、置换策略
b.何时调入页面
c.何处调入页面 d.抖动(颠簸)现象 &工作集