操作系统小白
进程之间的通信方式
-
管道通信
固定缓冲区,在管道未填满之前不允许读,同理管道未读出之前不允许写,这就类似于网络通信一样,客户端发送消息,需要等待服务端接收才能继续发。上传文件到服务器的上载速度取决于双方的写入和读入速度,同时我们可以发现实际上服务器接收到请求时,回复大容量文件时由于服务器写入速度慢,导致客户端迟迟没有响应。
-
消息传递
-
直接消息传递
直接传递格式化的文件,相当于计算机网络通信的报文。
-
间接消息传递
消息通过中转站进行转发,即类似于邮件传输一样,网易邮箱需要存储用户短期内的文件。
-
-
共享内存
-
基于数据结构的共享
低级通信方式,类比于线程之间的共享变量shared
-
基于共享内存区域的共享
高级通信方式,速度较快
-
线程
-
线程的定义
线程是一个基本的CPU执行单元,也是程序执行流的最小单元
-
线程引入之后系统环境变化
- 资源分配仍以进程为基本单位,但是线程成为了处理机调度的基本单位,不同线程共享系统资源,会引发资源争夺问题
- 进程并发需要切换系统环境,但是线程的并发只需要一个系统环境即可,少去了多余的开销
- 线程之间的通信不需要操作系统的干预即可完成通信
- 同一个进程之间线程切换不需要切换系统环境,开销小;但是不同进程之间进行线程切换需要切换系统环境,开销大。因此,尽量避免使用QProcess同步执行。
-
线程分类
-
内核级线程
内核级线程是处理机分配的基本单位,用户级线程是程序分配的,其只在用户才可以看见,操作系统无法看见,用户级线程是多批道处理系统处理多个程序的关键思想在线程上的实现。
-
用户级线程
用户可以分配大于本机核心和线程数的总线程,在用户看来虽然分配了许多线程,但是实际上如果操作系统能够观察到的内核级线程只被分配了一个,即内核级线程才是程序并行执行的关键。
-
调度层次
-
高级调度(作业调度)
专注于外存与内存之间的调度。由于内存空间有限,无法将用户提交的作业全部放入内存,从外存后备队列的作业中挑选一个或多个作业,给他们分配内存等必要资源,建立相应的PCB。创建态->就绪态
-
中级调度(内存调度)
基于虚拟存储技术,可以将此时未执行任务的进程调至外存等待,提高内存利用率和系统吞吐量。调入外存等待的进程状态处于挂起状态。操作系统对PCB监控管理,实现对挂起状态的线程中重新载入内存。中级调度的发生频率高于高级调度。
-
进程的挂起态
- 就绪挂起(创建态进程转化为就绪挂起,运行态进程也可转化为就绪挂起)
- 阻塞挂起(阻塞态进程转化为阻塞挂起,阻塞挂起可以直接激活回到阻塞态,也可以转化为就绪挂起,再转化为就绪状态)
-
七状态模型
进程标准的五个状态,再考虑进程的就绪挂起和阻塞挂起
-
-
低级调度(进程调度)
主要任务时按照某种方法从就绪队列中选取一个进程,分配CPU时间片
-
禁止进程调度的情形
-
处理中断的过程(进程从运行态转化到阻塞态),硬件资源复杂,很难做到在中断处理的过程中进行进程切换
-
操作系统内核临界区
临界资源:一个时间段内只允许一个进程使用的资源(变量),各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码
内核临界区:访问系统内核数据结构(变量),比如就绪进程PCB队列
-
原子操作过程中(原语)
-
-
进程同步与异步
-
进程异步
-
互斥共享:基于临界资源建立互斥共享关系
- 进入区(检查是否可以进入临界区,可进入设置正在访问临界资源的标志)
- 临界区(访问临界资源)
- 退出区(解除正在访问临界资源的标志,解锁标志)
- 剩余区(做其他处理)
临界资源互斥共享的同时保证系统整体性能需要遵循如下原则:
- 空闲让进
- 忙则等待
- 有限等待(不会饥饿)
- 让权等待(不占用处理机)
软件实现方法
- 单标志法
- 先检查后上锁双标志法
- 先上锁后检查双标志法
硬件实现方法
- 中断屏蔽:在某进程开始访问临界区到结束访问为止不允许被中断(单个CPU有效),此时该CPU就不会强行切换到另外一个进程继续执行(关中断->临界区->开中断【内核态】)
- TestAndSetLock:测试并检查,该指令是一个硬件指令,在执行的过程中不允许中断,所以可以语义化为同时检查和上锁。软件中断的方法在中途检查和上锁的过程并不是一气呵成的,都会被进程切换导致出错。
- SWAP指令(XCHG)与TSL指令类似,适用于多处理机,不满足让权等待(硬件)
信号量实现方法
- 信号量对每一个系统资源设置一个标志(2个打印机->信号量为2)
- 避免了软件实现方法的检查和上锁可能被中断的问题,信号量基于原语进行实现(检查和上锁一起完成)
- 可以实现硬件实现方法不能够满足的让权等待原则,若系统资源如打印机分配完毕,则让该进程进入阻塞,主动让出处理机
- 不同的资源需要采用不同的信号量,P(上锁)和V(解锁)必须成对出现,V操作负责唤醒处于阻塞的进程,P操作保证资源的正确分配
-
-
进程同步
-
信号量机制实现进程同步
-
针对需要执行同步的代码块,共有一个信号量,semaphore初始化为0,在需要同步的代码执行前释放锁,在另外一个进行需要同步的代码块执行上锁
P1(){ P2(){code line1; P(S);// 主动阻塞,放弃处理机code line2; code line4;V(S);// 唤醒 code line5;code line3; code line6; } }
-
-