🤔操作系统引论

⭐操作系统的概念(P1)

操作系统是计算机硬件上的第一层软件,是对硬件的首次扩充。主要作用是管理设备,并为应用程序提供接口。

设计操作系统的目标(P1)

  • 方便性:直接通过OS操作计算机
  • 有效性:提高资源的利用率
  • 可扩充性:可以对功能和模板进行扩充
  • 开放性:应用环境必须更为开放

⭐操作系统的作用(P2-P3)

  • OS作为用户和计算机硬件之间的接口(例如:系统调用)
  • OS作为计算机系统资源的管理者(例如:I/O管理,内存管理,文件管理)
  • OS实现了对计算机资源的抽象(也就是直接为用户提供函数等,隐藏了细节,例如read和write命令)

多道程序的操作系统的基本概念(P8)

也就是并发提高了效率!!!

具体细节🔗

复习题 - 图1

多道批处理操作系统的优缺点(P8)

优点:(联系并发可以知道)

  • 系统吞吐量大
  • 资源利用率高

缺点:

  • 无交互能力
  • 平均周期长

分时操作系统的特征(P10)

解决的多道批处理的用户交互问题。

复习题 - 图2

⭐操作系统的总体的基本特征(P14-P17)

  • 并发和并行
    并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
    并行:两个或多个时间同一时间发生。
  • 共享(都是基于并发再用共享的概念,两者互为存在)
    系统中的资源可供内存中多个并发执行的进程共同使用。
    • 互斥共享方式:例如摄像头,VX和QQ只能有一个能使用。
    • 同时访问方式:例如QQ和VX同时传输文件。
  • 虚拟
    虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。

    例如:虚拟内存,内存只有8G,但能运行40G的游戏,这也就是虚拟内存,32位机器能分配4G的虚拟内存,并不是真实的在内存中的地址,如果访问此内存地址时才会产生缺页中断,分配内存地址。此时也有页面置换,可能从磁盘中调取页面。

  • 空分复用技术:也就是上面举的例子,内存中只会保存会使用的页,不使用的放入磁盘,需要时才置换。
  • 时分复用技术:也就是利用服务某用户服务的空闲时间去服务其他用户,使设备得到充分利用。
    • 异步
      异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

      显然,如果失去了并发性,则系统只能串行地处理各个进程,每个进程的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。

操作系统具有的基本功能有哪些(P18-P21)

  • 处理机管理功能(进程)
  • 存储器管理功能(内存)
  • 设备管理功能
  • 文件管理功能

😋进程的描述与控制

程序顺序和并发执行的特征(P37,P38)

顺序执行:

  • 顺序性:按照程序规定执行
  • 封闭性:此时程序运行占用整机资源
  • 可再现性:无论走走停停运行还是一次性运行完都会获得相同结果。

并发执行:

  • 间接性
  • 失去封闭性:一个程序运行可以被其他程序影响。
  • 不可再现性:每次运行的程序可能不相同。

和顺序执行相反,联系并发的概念解释。

⭐进程控制块(PCB)的基本概念,知道它是进程存在的唯一标志的原因。

复习题 - 图3

进程的唯一标识!!!

⭐进程的定义和特征(P39)

定义:

  • 进程是程序的一次执行过程。
  • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
  • 进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。(强调进程的动态性

特征:

  • 动态性
    由创建产生,调度执行,撤销消亡,有生命周期。程序:就是一个指令序列。存放在某种介质上,时静态的。
  • 并发性
    与其他实体可以并发执行。而程序没有PCB,所以不能并发.
  • 独立性
    进程实体能够获得资源和独立接收调度,而程序没有PCB不能调度和分配资源。
  • 异步性
    进程按照异步方式运行,各自独立,不可预知的速度推进。

复习题 - 图4

进程和程序的区别(见上课的PPT)

程序没有PCB,其他区别见上进程的特征。

进程:由创建产生,调度执行,撤销消亡,有生命周期,是动态的。

⭐知道进程的五种基本状态和各自的含义。(P42)

复习题 - 图5

复习题 - 图6

复习题 - 图7

⭐知道进程中的就绪、执行、阻塞三种基本状态的转换变迁的条件

复习题 - 图8

进程挂起操作后,进程的状态的特征(P41-P42)

挂起状态:暂时调到外存

复习题 - 图9

PCB存储的信息类别和组织方式(P44-P46)

在一个系统中,通常有数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。

复习题 - 图10

链接方式

复习题 - 图11

索引方式

复习题 - 图12

原语操作的概念和特点,原子性的特点(P47)

原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断。

进程间两种形式的制约关系(P52-P53)

同步和互斥🔗

同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。

互斥就是对临界区的资源访问必须互相抑制。

临界资源和临界区的概念(P53)

临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

临界区:访问临界资源的那段代码。

同步机制遵循的四条准则(P55)

复习题 - 图13

⭐信号量的概念(P57)

用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。

信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量) ,可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1 的信号量。

信号量机制中wait操作(Р操作)、signal操作(V操作)执行的过程。

整型信号量

复习题 - 图14

记录型信号量

解决了忙等,因为放入了队列。

复习题 - 图15

操作中对信号量变量修改的变化情况,以及知道通过信号量变量值的变化引起进程状态变化的条件。

S.value 的初值表示系统中某种资源的数目。对信号量S 的一次P 操作意味着进程请求一个单位的该类资源,因此需要执行S.value— ,表示资源数减1,当S.value < 0 时表示该类资源已分配完毕,因此进程应调用block 原语进行自我阻塞(当前运行的进程从运行态 ——> 阻塞态),主动放弃处理机,并插入该类资源的等待队列S.L 中。可见,该机制遵循了“让权等待”原则,不会出现“忙等”现象。

对信号量S 的一次V 操作意味着进程释放一个单位的该类资源,因此需要执行S.value++,表示资源数加1,若加1后仍是 S.value <= 0,表示依然有进程在等待该类资源,因此应调用wakeup 原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态 ——> 就绪态)。

⭐利用记录型信号量机制的PV操作解决生产者/消费者问题的同步代码。(P66)

消费者生产者问题分析🔗

  1. // 消费者问题(一对一)
  2. // 一对一模型的P,V操作不能交换
  3. semaphore mutex = 1; // 互斥信号量,实现对缓冲区的互斥访问
  4. semaphore empty = n; // 同步信号量,表示空闲缓冲区的数量
  5. semaphore full = 0; // 同步信号量,表示产品的数量,也即非空缓冲区的数量
  6. public consumer() {
  7. while(true) {
  8. P(full);
  9. P(mutex);
  10. // 消费东西
  11. V(mutex);
  12. V(empty);
  13. }
  14. }
  15. public product() {
  16. while(true) {
  17. P(empty);
  18. P(mutex);
  19. // 生产东西
  20. V(mutex);
  21. V(full);
  22. }
  23. }

PV不能交换

复习题 - 图16

① -> ② -> ③
若此时缓冲区内已经放满产品,则empty=0,full=n。

则生产者进程执行①使mutex变为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞。由于生产者阻塞,因此切换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞。这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。

③ -> ④ -> ①
同样的,若缓冲区中没有产品,即full=0,empty=n。按③④① 的顺序执行就会发生死锁。

因此,实现互斥的P操作一定要在实现同步的P操作之后。V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

⭐利用记录型信号量机制的PV操作解决读者/写者问题的同步代码。(P71)

解析🔗

  1. semaphore rw=1; // 用于实现对共享文件的互斥访问
  2. int count = 0; // 记录当前有几个读进程在访问文件
  3. semaphore mutex = 1;// 用于保证对count变量的互斥访问
  4. writer(){
  5. while(1) {
  6. P(rw);
  7. // 写数据
  8. V(rw);
  9. }
  10. }
  11. reader(){
  12. while(1) {
  13. P(mutex);
  14. if(count == 0)
  15. P(rw);// 加写锁,读写互斥
  16. count++;
  17. V(mutex);
  18. // 读数据
  19. P(mutex);
  20. count--;
  21. if(count == 0)
  22. V(rw);// 没有人读,释放写锁
  23. V(mutex);
  24. }
  25. }

⭐哲学家就餐问题

奇数拿左边筷子,偶数拿右边筷子

  1. semaphore chopstick[5]={1,1,1,1,1};
  2. semaphore mutex = 1; // 互斥地取筷子
  3. Pi() {
  4. while(1) {
  5. P(mutex);
  6. P(chopstick[i]);
  7. P(chopstick[(i + 1) % 5]);
  8. V(mutex);
  9. // 干饭,其他拿不到筷子会阻塞
  10. // 放筷子不用互斥
  11. V(chopstick[i]);
  12. V(chopstick[(i + 1) % 5]);
  13. }
  14. }

⭐线程的基本概念(P81)

  • 引入线程前,进程既是资源分配的基本单位,也是调度的基本单位。
  • 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。线程也有运行态、就绪态、阻塞态。
  • 在多CPU环境下,各个线程也可以分派到不同的CPU上并行地执行。
  • 线程几乎不拥有资源,只拥有极少量的资源(线程控制块TCB、寄存器信息、堆栈等)

⭐线程和进程的主要区别(P82-P83)

  • 调度的基本单位
    进程上下文切换开销很大,线程切换只需要保存和设置少量寄存器内容,所以开销较小。且线程调度不会影响进程调度。
  • 并发性
    线程也可以并发执行。
  • 拥有资源
    进程可以拥有资源,是分配资源的单位,线程本身不拥有资源,只有必不可少的TCB,寄存器和堆栈。但线程共享进程的资源。
  • 独立性
    线程独立性比进程独立性低的多,应为共享了进程的资源。
  • 系统开销
    线程开销比进程低,上下文切换也比较低。