操作系统
前言
本篇文章的内容结合了哈工大李治军老师操作系统课程,王道考研操作系统的资料以及学习了B站CodeSheep的一次知识梳理,并且为了便于理解学习,增加了个人的一些解释。总之,概括而言对于开发人员来说,操作系统需要下四个方面进行学习:进程/线程;并发/锁;内存管理与调度;I/O原理,本文也将围绕这几点逐渐深入。
一、常用术语总结
| 名词 | 概念 |
|---|---|
| PCB | 进程控制块(PCB Process Control Block),系统中存放、管理和控制进程信息的数据结构称为 |
| TCB | 线程控制块 |
| FCB | 文件控制块 |
| PID | 进程ID(Process ID) |
| PSW | 程序状态字寄存器,用于存放PC、IR等的信息 |
| PC | 程序计数器,存放下一条指令地址 |
| IR | 指令寄存器,存放到当前进行的指令 |
| 半双工 | 半双工和全双工是计算机网络中的概念,意思是通讯同一时间只允许一方发送数据(对讲机) |
| 全双工 | 通信允许两方向上同时传输数据(电话) |
| P操作 | 来自荷兰语proveren,代表wait原语,通常使用P(S)代替wait(S) |
| V操作 | 来自荷兰语verhogen,代表原语signal,通常使用V(S)代替signal(S) |
| 用户态 | 一般的操作系统对执行权限进行分级,分别为用保护态和内核态。用户态相较于内核态有较低的执行权限,很多操作是不被操作系统允许的,从而保证操作系统和计算机的安全。 |
| 内核态 | 内核态相当于一个介于硬件与应用之间的层,可以进行硬件的调度、使用,可以执行任何cpu指令,也可以引用任何内存地址,包括外围设备, 例如硬盘, 网卡,权限等级最高。 |
| 用户态内核态切换 | 三种情况下,用户态会转换到内核态,系统调用、程序异常(例如/0,内存资源耗尽等)、来自外围设备的中断 |
| 系统调用/程序接口 | 用户程序通过系统调用的方式才能对硬件进行使用,或者说操作系统将使用硬件的接口提供给用户程序 |
| 中断 | 中断是操作系统内核程序夺取cpu的唯一途径,或者说用户程序调用内核代码的唯一途径,因为在一般情况下,操作系统会将cpu使用权交给应用程序。 |
二、进程、线程
在进程、线程这一章节除了会讲进程、线程的概念,也会穿插,并发,锁。
2.1 进程
进程由PCB(进程控制块)组成,包含了PID、资源分配情况、进程运行情况。
对用户而言,我们能看到一个个PID,而对操作系统而言,底层需要处理的是一个个PCB。
下图是通过任务管理器的用户视角下的进程。

2.1.1 进程控制
进程控制相关的原语:创建、终止、阻塞、唤醒、切换。也就是说我们通过原语进行进程控制,原语的执行具有原子性,不允许被中断,原语的实现可以通过“关中断指令”和“开中断指令”实现。
进程状态:运行态,就绪态,阻塞态
进程状态转换的条件:
运行 -> 阻塞 等待I/O或事件完成
运行 -> 就绪 进程的CPU时间片用完
就绪 -> 运行 获得了CPU的时间片
阻塞 -> 就绪 I/O或事件完成
下图为进程控制的流程图。

2.1.2 进程的组织形式
在一个系统中,通常有数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。
进程的组织形式分为两种:链接式和索引式

根据进程状态的不同,创建不同的索引表,可以通过指针可以通过索引表指到个PCB。

2.1.3 程序的执行
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VX347d1F-1606404338289)(操作系统.assets/屏幕截图 2020-09-23 181006.png)]](/https://i-blog.csdnimg.cn/blog_migrate/f61b64ee7851bce660ad7bb6ee159621.png#pic_center)
程序的状态字寄存器 PSW用来存放两类信息:一类是体现当前指令执行结果的各种状态信息,如有无进位(CY位),有无溢出(OV位)等;另一类是存放控制信息,如允许中断(IF位),跟踪标志(TF位)等。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXDtOa3X-1606404338292)(操作系统.assets/屏幕截图 2020-09-23 181023.png)]](/https://i-blog.csdnimg.cn/blog_migrate/027cbb368f1a8f7b6f2ed271bf33f664.png#pic_center)
相较于程序,进程是动态的而程序是静态的
2.1.4 进程通信
进程通信是指进程之间的信息交换。进程是分配系统资源的单位,因此各个进程拥有的内存地址相互独立,为了保证安全,一个进程不能直接访问另一个进程的地址空间,为了实现进程通信,操作系统提供了以下方法
进程通信方法:共享存储、信号量、消息队列/信箱、管道通信、套接字(这个在计算机网络有涉及相关知识,可以把套接字理解为一个窗口)
共享存储
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYPkQ2gg-1606404338293)(操作系统.assets/屏幕截图 2020-09-23 211625.png)]](/https://i-blog.csdnimg.cn/blog_migrate/2cdc65703c3ff10f401036cf01ea37af.png#pic_center)
消息传递
通过原语控制,进程1发送消息到消息缓冲队列或者信箱中,进程2从消息队列或者信箱中接收消息。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdUDqzUU-1606404338294)(操作系统.assets/屏幕截图 2020-09-23 211822.png)]](/https://i-blog.csdnimg.cn/blog_migrate/c73026fe625a86185717a19574507854.png#pic_center)
管道通信
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hnja55Ba-1606404338295)(操作系统.assets/屏幕截图 2020-09-23 212152.png)]](/https://i-blog.csdnimg.cn/blog_migrate/3f49e77e92cd6b59abe6517c018510fb.png#pic_center)
2.2 线程
进程是资源分配的基本单位,线程是调度的基本单位,往往一个进程包含多个线程。线程并发,系统开销小,不需要切换系统资源。
线程可以分为用户级线程和内核级线程,早期如Unix只支持进程,不支持线程,所以当时的线程是由"线程库"实现的,用户将进程分为多个线程,放入线程库,但操作系统仍然是按照进程进行处理的。
这种用户级线程是由程序负责管理的,包括进行切换。这种切换方式开销小,效率高,但下图当一个用户级线程被阻塞后,整个进程都将会被阻塞。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9yv0EID-1606404338296)(操作系统.assets/屏幕截图 2020-09-24 081549.png)]](/https://i-blog.csdnimg.cn/blog_migrate/d1b87e9c61591029907ffef4a872122c.png#pic_center)
多线程模型
内核级线程是由操作系统完成调度的。
将n个用户级线程映射到m个内核级线程上( n >= m),优点是克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内
核级线程,开销太大的缺点。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zcBnYCVw-1606404338297)(操作系统.assets/屏幕截图 2020-09-24 081838.png)]](/https://i-blog.csdnimg.cn/blog_migrate/9d8e59962bee512504d4e981a57fede1.png#pic_center)
2.3 进程调度
2.3.1 三种调度方式
调度的产生是因为系统资源有限,没办法同时处理所有进程,需要特定的规则分配执行顺序,从而有了调度
操作系统调度层次分为三类:高级调度、中级调度、低级调度。
高级调度:从外存的后备作业中挑选一个(多个),建立相应的PCB,获得竞争处理的权力。
后面会讲到的虚拟内存技术出现后,为了提高系统的利用率和吞吐量,会将暂时等待的进程挂起到外存。
中级调度:能够决定哪个被挂起的进程重新回到内存


498

被折叠的 条评论
为什么被折叠?



