- 基本特征
- 并发:在一段时间内能同时运行多个程序
(并行:在同一时刻能运行多个指令) - 共享:系统中的资源可以被多个并发进程共同使用
- 虚拟:把一个物理实体转换为多个逻辑实体
(时分复用:进程可以轮流占用处理器和空分复用:虚拟内存的应用) - 异步:进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进
大内核:将操作系统功能作为一个紧密结合的整体放倒内核中,由于各模块共享信息,因此具有很高的性能
微内核:将一部分操作系统功能移出内核,移出的部分根据分层的原则划分成若干服务相对独立
- 基本功能
-
进程管理
进程控制、进程同步、进程通信、死锁处理、处理机调度等。 -
内存管理
内存分配、地址映射、内存保护与共享、虚拟内存等。 -
文件管理
文件存储空间的管理、目录管理、文件读写管理和保护等。 -
设备管理
完成用户的 I/O 请求,方便用户使用各种设备,并提高设备的利用率。
主要包括缓冲管理、设备分配、设备处理、虛拟设备等。
- 中断分类
-
外中断
由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。 -
异常
由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等。 -
陷入
在用户程序中使用系统调用。
- 进程与线程
- 进程是资源分配的基本单位
进程控制块(PCB) 描述进程的基本信息和运行状态,所谓的创建和撤销进程,都是对PCB的操作.
- 线程是独立调度的基本单位
是进程的子任务,cpu调度和分配的基本单位,实现进程内部并发
- 进程与线程的区别
- 拥有资源: 进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源
- 调度:线程是独立调度的基本单位,在同一进程中线程的切换不会引起进程切换,从一个进程切换到另一个进程中的线程,会引起进程切换
- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小
- 通信方面:线程之间通信可以直接读写同一进程中的数据进行通信,但是进程通信需要借助ipc(进程间通信)
- 进程优点
可靠性高,进程之间不会相互影响;适用于多机分布式
- 线程优点
易于调度;有效实现并发;开销小;有利于发挥多核处理器的功能
- 进程状态的切换
就绪状态(ready):等待被调度
运行状态(running)
阻塞状态(waiting):等待资源
-
进程同步
- 临界区 对临界资源进行访问的那段代码称为临界区
(临界资源:每次仅允许一个进程访问的资源) - 同步 多个进程按一定顺序执行
- 互斥 多个进程在同一时刻只有一个进程能进入临界区
- 信号量 是一个整型变量,可以对其执行down和up操作(P|V) 减减为负就阻塞,加加不正就唤醒
- 管程 使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。
- 临界区 对临界资源进行访问的那段代码称为临界区
-
经典同步问题
- 读者-写者问题
允许多个进程同时对数据进行读操作,但是不允许读和写以及写和写操作同时发生。
一个整型变量 count 记录在对数据进行读操作的进程数量,一个互斥量 count_mutex 用于对 count 加锁,一个互斥量 data_mutex 用于对读写的数据加锁。
- 哲学家进餐问题
五个哲学家围着一张圆桌,每个哲学家面前放着食物。哲学家的生活有两种交替活动:吃饭以及思考。当一个哲学家吃饭时,需要先拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子。造成死锁
进程同步与进程通信很容易混淆,它们的区别在于:
进程同步:控制多个进程按一定顺序执行;
进程通信:进程间传输信息。
- 进程间通信
- 管道:只支持半双工通信,只能在父子进程中使用
- FIFO(命名管道):去除了管道只能在父子进程中使用的限制(常用于客户-服务器应用程序中)
- 消息队列: 消息的链接表,具有写权限的进程可以按照一定的规则向消息队列添加信息,读也一样
- 信号量:是一个计数器,用于为多个进程提供对共享数据对象的访问
- 共享存储:允许多个进程共享一个给定的存储区.因为数据不需要再进程之间复制
- 套接字:它可用于不同机器之间的进程通信
- 进程调度算法
- 先来先服务FCFS:按照请求的顺序进行调度
- 最短优先SJF:按估计运行时间最短的顺序进行调度
- 最短剩余优先SRTN:按剩余运行时间的顺序进行调度
- 时间片轮转:将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
- 优先级调度:为每一个进程分配一个优先级,按优先级进行调度
- 死锁
- 必要条件:
- 互斥:每个资源要么分配给一个进程,要么就是可用
- 占有且等待:已经得到某资源的进程可以再请求新的资源
- 不可抢占:已经分配给一个进程的资源不能强制性的被强占,它只能被占有它的进程释放
- 循环等待:若干进程形成一种头尾相连的等待
- 处理方法:
- 鸵鸟策略:处理死锁问题的办法仅仅是忽略它。
- 死锁检测与恢复:不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。
- 死锁预防:在程序运行之前预防发生死锁。
- 死锁避免:在程序运行时避免发生死锁。
(银行家算法:动态检测资源分配的状态,如果进程对某个顺序执行分配资源可以完成则是安全的)
- 内存管理
- 虚拟内存
虚拟内存的目的是为了让无力内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存.虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。
- 页面置换算法
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
1. 最佳:所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。
2. 最久最近未使用:需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。
3. 最少使用:记录被访问的次数,置换当前最少访问
4. 先进先出:选择页面是最先进入的页面
5. 时钟算法: 使用环形链表将页面连接起来,再使用一个指针指向最老的页面。
- 分段
虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。
分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
4. 段页式
程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。
- 分页与分段的比较
-
对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段。
-
地址空间的维度:分页是一维地址空间,分段是二维的。
-
大小是否可以改变:页的大小不可变,段的大小可以动态改变。
-
出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
-
-
同步:在发生一个调用时,没有得到结果就不返回,必须一件件事情做
-
异步:调用时,这个调用直接返回没有返回结果,被调用通过状态来通知调用者其结果。
-
阻塞:调用结果返回之前,当前线程会被挂起,只有在得到结果之后才会返回
-
非阻塞:在不能立刻得到结果之前,被调用不会阻塞当前线程
-
同步阻塞IO:进程发起一个IO操作,必须等待io完成后才能继续运行
-
异步阻塞IO 进程发起一个IO操作,不等待内核IO完成,等内核完成以后会通知进程
-
同步非阻塞IO 进程发起一个IO操作,可返回做其他事情,但需要不断询问IO操作是否就绪(造成cpu资源浪费)
-
异步非阻塞IO 进程发起一个IO操作,立即返回,等io完成以后程序将会得到一个通知。此时进程只要处理数据,不用实际io操作