计算机基础
操作系统的四个特性
- 1.并发
- 同一段时间内多个程序执行。
- 2.共享
- 系统中的资源可以被内存中多个并发执行的进线程共同使用。
- 3.虚拟
- 时分复用(如分时系统)
- 空分复用(如虚拟内存)
- 4.异步
- 系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进。
- 并发和共享是操作系统的基本特性。
并发和并行
- 1.并发
- 两个或多个事件在同一时间间隔发生。
- 2.并行
- 两个或者多个事件在同一时刻发生。
同步和互斥
- 1.同步
- 同步亦称直接制约关系。多个进程协作。
- 2.互斥
- 互斥亦称间接制约关系。多个进程竞争临界资源。
线程和进程
- 1.同步方式
- 1.线程同步的方式:临界区、互斥量、信号量、事件。
- 2.进程同步的方式:临界区、互斥量、信号量、事件、管程。
- 1.通信方式
- 1.进程间通信方式主要包括信号量、FIFO、管道、消息队列、共享内存。
- 2.同一进程的线程直接通信,不同进程的线程通过进程通信来进行通信。
操作系统的主要功能
- 1.处理机管理(进程管理)
- 进程控制
- 进程同步
- 进程通信
- 进程调度
- 2.存储器管理(内存管理)
- 内存分配
- 内存保护
- 地址映射
- 内存扩充
- 3.设备管理
- 4.文件管理
进程通信
- 1.管道
- 1.命名管道
- 命名管道可用于非父子进程。
- 2.非命名管道
- 非命名管道只能用于父子进程通讯。
- 管道是先进先出的通讯方式,只允许数据的单向流动。
- 速度慢,容量有限
- 1.命名管道
- 2.消息队列
- 消息队列是用创建文件的方式建立的。
- 3.信号量
- 不能传递复杂消息,只能用来同步
- 4.共享内存
- 能够很容易控制容量,速度快,但要保持同步。
进程同步
- 同步机制需要遵循的原则
- 1.空闲让进
- 2.忙则等待
- 3.有限等待
- 4.让权等待
用户态和核心态
- 用户态切换到内核态的3种方式
- 1.系统调用
- 2.异常
- 3.外围设备的中断
死锁
- 死锁是指多个进程在运行过程中,因为争夺资源而造成的一种僵局,如果没有外力推进,处于僵局中的进程就无法继续执行。
- 死锁原因
- 1.竞争资源:请求同一有限资源的进程数多于可用资源数。
- 2.进程推进顺序非法:进程执行中,请求和释放资源顺序不合理,如资源等待链。
- 死锁产生的必要条件
- 互斥条件
- 请求和保持条件
- 不可剥夺条件
- 环路等待条件
- 死锁处理
- 预防死锁
- 破坏死锁产生的必要条件。
- 避免死锁
- 在资源的动态分配中,防止系统进入不安全状态。(银行家算法)
- 检测死锁
- 资源分配图
- S为死锁的条件是:当且仅当 S 状态的资源分配图是不可完全简化的,该条件为死锁定理。
- 资源分配图
- 解除死锁
- 资源剥夺法
- 撤销进程法
- 进程回退法
- 预防死锁
进程调度算法
- 1.先来先服务调度算法FCFS。
- 2.短作业优先调度算法SJF。
- 3.高相应比算法HRN
响 应 比 = ( 等 待 时 间 + 要 求 服 务 时 间 ) 要 求 服 务 时 间 响应比=\frac{(等待时间+要求服务时间)}{要求服务时间} 响应比=要求服务时间(等待时间+要求服务时间)
- 4.时间片轮转调度RR。
- 5.多级反馈队列调度算法。
- 第一个队列优先级最高,优先级越高的队列分配的时间片越短。
内存分配
- 首次适应(First Fit)算法。
- 最佳适应(Best Fit)算法。
- 最坏适应(Worst Fit)算法。
基本分页储存管理方式
- 两次的内存访问
- 一次是从内存中访问页表。从中找到指定的物理块号,加上页内偏移得到实际物理地址。
- 第二次就是根据第一次得到的物理地址访问内存取出数据。
- 快表
- 快表存储在寄存器中。
- 先查快表,未命中再查页表,同时将该页登记到快表中。
- 页是信息的物理单位,面向操作系统。
基本分段储存管理方式
- 地址是二维的
- 一维是段号
- 另一维是段内地址
- 段是信息的逻辑单位,面向用户。
页面置换算法
- 1.最佳置换算法。
- 2.先进先出置换算法。
- 3.最近最久未使用算法LRU。
- 4.时钟算法clock(也被称为是最近未使用算法NRU)。
- 5.改进型Clock算法。
- 6.最少使用算法LFU。
-
C++源文件到可执行文件的过程
- 1.预处理,产生.ii文件。
- 1.对所有的“#define”进行宏展开。
- 2.处理所有的条件编译指令,比如“#if”,“#ifdef”,“#elif”,“#else”,“#endif”。
- 3.处理“#include”指令,这个过程是递归的,也就是说被包含的文件可能还包含其他文件。
- 4.删除所有的注释“//”和“/**/”。
- 5.添加行号和文件标识。
- 6.保留所有的“#pragma”编译器指令。
- 2.编译,产生汇编文件(.s文件)。
- 编译的过程就是将预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件(.s文件)
- 3.汇编,产生目标文件(.o或.obj文件)。
- 汇编器是将汇编代码转变成机器可以执行的代码,每一个汇编语句几乎都对应一条机器指令。最终产生目标文件(.o或.obj文件)。
- 4.链接,产生可执行文件(.out或.exe文件)。
- 链接的过程主要包括了地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)。
- 1.预处理,产生.ii文件。
-
线程在切换时,需要保存的上下文
- 1.当前线程Id
- 2.线程状态
- 3.堆栈
- 4.寄存器状态
- 1.SP:堆栈指针,指向当前栈的栈顶地址。
- 2.PC:程序计数器,存储下一条将要执行的指令。
- 3.EAX:累加寄存器,用于加法乘法的缺省寄存器。
-
进程在切换时,需要保存的上下文
- 1.用户级上下文:正文、数据、用户堆栈以及共享存储区。
- 2.寄存器上下文:通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP)。
- 3.系统级上下文:进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。
-
系统调用
- 系统调用进行的是模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。
-
中断上下文
- 硬件通过触发信号,向CPU发送中断信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核, 内核通过这些参数进行中断处理。
- 内核进入中断上下文是因为中断信号而导致的中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。
-
进程上下文 VS 中断上下文
- 1.内核可以处于两种上下文:进程上下文和中断上下文。
- 2.在系统调用之后,用户应用程序进入内核空间,此后内核空间针对用户空间相应进程的代表就运行于进程上下文。
- 3.异步发生的中断会引发中断处理程序被调用,中断处理程序就运行于中断上下文。
- 4.内核会限制中断上下文的工作,不允许其执行如下操作:
- 1.进入睡眠状态或主动放弃CPU。
- 由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context)。
- 2.占用互斥体。
- 为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock。
- 3.执行耗时的任务。
- 中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理。
- 4.访问用户空间虚拟内存。
- 因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中断上下文无法访问用户空间的虚拟地址。
- 5.中断处理例程不应该设置成reentrant(可被并行或递归调用的例程)。
- 因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的。
- 6.中断处理例程可以被更高级别的IRQ中断。
- 如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。
- 1.进入睡眠状态或主动放弃CPU。
-
原子上下文
- 内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。
- 凡是上面4个宏返回1得到地方都是原子上下文,是不容许内核访问用户空间,不容许内核睡眠的,不容许调用任何可能引起睡眠的函数。而且代表thread_info->preempt_count不是0,这就告诉内核,在这里面抢占被禁用。
-
中断,异常和系统调用
- 中断:来自硬件设备的处理请求。
- 源头:外设。
- 响应方式:异步。
- 处理机制:持续,对用户应用程序透明。
- 异常:非法指令或者其他原因导致当前指令执行失败。
- 源头:应用程序。
- 响应方式:同步。
- 处理机制:杀死或者重新执行发生异常的程序。
- 系统调用:应用程序主动向操作系统发出的服务请求。
- 源头:应用程序请求操作系统提供服务。
- 响应方式:异步或同步。
- 处理机制:等待和持续。
- 中断:来自硬件设备的处理请求。
-
中断和异常处理机制
- 需要硬件和软件结合处理
- 1.硬件需要完成的部分
- 1.在CPU初始化时设置中断使能标志
- 2.依据内部或外部事件设置中断标志
- 3.依据中断向量调用响应中断服务例程
- 2.软件需要完成的部分
- 1.现场保护(编译器)
- 2.中断服务处理(服务例程)
- 1.硬件需要完成的部分
- 需要硬件和软件结合处理