操作系统概述
1.定义:操作系统是管理计算机硬件和软件资源的计算机程序。
注意了!!!虽然说操作系统可以管理硬件资源,但是它其实是一个软件系统。总而言之,操作系统就是管理硬件,提供用户交互的软件系统,是硬件层和软件层的适配层
2.为什么要用操作系统这东西:
-
我们对于硬件不能够直接的去操作,因此选择通过操作系统
-
像这些电脑,手机品牌很多,设备种类十分繁杂,操作系统则统一了界面,避免了这些繁杂的影响
-
操作系统的使用肯定可以带来极大的简便性,能够让更多的人去使用计算机,因此操作系统的出现也极大地促进了电脑,手机的普及
3.那操作系统有什么功能呢?
-
可以统一的去管理计算机资源,比如说处理器资源,存储器资源,文件资源,IO设备资源。
-
可以实现计算机资源的抽象,即能够把那些所谓我们平时看不见的资源,抽象到各种软件接口上面去,比如说IO设备管理软件,文件管理软件,并且提供操作,读写文件的接口,能够让用户操作起来更加方便
-
可以提供用户与计算机的接口:图像窗口形式,命令形式(CMD),系统调用形式(编程)
操作系统相关概念
- 并发性:这里所说的并发性就得和我们常听到的并行性给区分开来了。
并行 | 两个或者多个事件在同一时刻发生 |
---|---|
并发 | 两个或者多个事件在同一时间间隔发生 |
在操作系统当中的并发性就体现在多道程序在同一时间间隔内交替运行。
- 共享性:也就是说操作系统当中的资源可以供多个并发的程序共同使用(即进行资源共享),程序A和程序B可以一起使用主存资源。
当然,资源共享也有两种不同的形式:
互斥共享 | A占用资源的时候,其它程序只能等待,只有A释放后,其它进程才能使用 |
---|---|
同时访问 | 资源可以在一段时间内并发地被多个程序访问,不需要释放 |
- 虚拟性:把物理实体转变为若干个逻辑体,前者真实存在,后者是虚拟化的。而虚拟化的过程中涉及到两种虚拟技术,一种是时分复用技术,一种是空分复用技术:
1.时分复用技术:即资源在时间上进行复用,不同的程序并发使用,多道程序分时使用计算机硬件资源,提高资源利用率。这里也涉及到两种技术:
虚拟处理器技术 | 借助多道程序设计为每个程序建立进程,多个程序分时复用处理器 |
---|---|
虚拟设备技术 | 就是把物理设备分为多个逻辑设备,每个程序占用一个逻辑设备,程序通过逻辑设备并发访问资源 |
2.空分复用技术:实现虚拟内存和虚拟磁盘:
虚拟内存 | 逻辑上扩大程序的存储容量(其实比实际存储大),来提高编程效率 |
---|---|
虚拟磁盘 | 就是我们平时见到的D盘,C盘等等,它本质上是一个物理磁盘,只不过分为多个虚拟磁盘而已,为了起到安全作用,D盘文件损坏不会影响到C盘数据 |
续上述几个概念
- 异步性:多道程序设计的环境下,允许多个进程并发执行,而进程在使用资源的时候,不是一直执行下去,而是断断续续的,中途可能会等待,放弃。
操作系统之进程管理
进程实体
1.我们为什么需要进程?
-
进程是我们的系统进行资源调度和分配的基本单位
-
进程可以隔离环境,资源,能够让程序独立运行,保证程序的正常运行
-
这也可以使资源利用率大大提升
进程实体
1.主存当中的进程状态:在主存当中,进程其实就是一段连续的存储空间,(至于为什么会连续的存储,那就涉及到局部性原理了,局部性原理博主已经在博客**《吃透计算机组成原理》**当中讲的比较清楚了,大家感兴趣可以去看看。)这一段存储空间也称为进程控制块。
说到进程控制块,博主就展开叙述它的常用具体内容:
-
标识符(Identifier):就是相当于给进程去一个名字ID,让我们认识这是哪一个进程,并且标记是唯一的。
-
状态(State):标记进程的状态,比如说是否在运行
-
程序计数器(Program Counter):指向进程即将执行的下一条命令的地址,就是让进程的指令有序的进行。
-
内存指针(Memory Pointers):指向程序代码和进程数据
-
上下文数据(Context Data):就是存储进程执行时的处理器的数据
-
IO状态信息(IO Status Information):被进程IO状态信息占用的文件列表
-
记账信息(Accounting Information):记录使用处理器的实际,或者时钟的总数等等
以上便是进程控制块的具体常用内容,当然,还有其他的,就不一一叙述了,根据上面的内容我们可以大概分成四个部分:分别为进程标识符,处理器状态,进程调度信息,进程控制信息。
接下来咱们再谈谈进程控制块的其它概念:
2.进程控制块(PCB):
进程控制块是干什么的?
-
其是描述和控制进程的通用数据结构,就是有效并且高效地存储进程信息的
-
它可以记录进程状态,并且控制进程的全部信息
-
PCB是操作系统在进行资源的调度的常家客,进程会被读取
3.进程与线程:
对进程和线程我们必须区分开来,进程包括很多线程,一个进程对应一个或者多个线程,可以说进程是线程的爸爸。一个进程好比一个程序,而线程就相当于这个程序当中的每个任务(界面展开,菜单选择,打开,关闭,执行等等),那我们来了解一下进程与线程的关系:
-
线程是系统进行运行调度的最小单位,而进程是基本单位
-
线程是进程当中实际运行并且工作的单位,可以想象成进程为线程提供了庇护所和资源,让线程自己去工作。
-
一个进程可以并发执行多个线程,每个线程执行的任务不同
-
进程当中的线程共享进程资源
五状态模型
进程总共分为五个状态,分别为创建状态,就绪状态,执行状态,阻塞状态和终止状态。博主就一一展开叙述了。
1.创建状态:进程被分配了PCB,即分配了进程控制块,但是其它资源并未准备就绪。
2.就绪状态:其就是比创建状态多了点东西,就是其它资源已经都准备好了(比如说内存,堆栈空间等等),此时只是缺少CPU的使用权,一旦获得便可执行。此时就绪状态的进程都插入到就绪队列当中了。
3.执行状态:进程获得CPU使用权,使得程序执行。
4.阻塞状态:因为某种原因进程放弃了CPU,而进入阻塞状态。比如说进程需要使用打印机,但是发出请求以后,打印机并未准备就绪,此时无法执行,进入阻塞状态。
5.终止状态:进程执行完毕,此时系统会清理进程内存,并且归还PCB。
五个状态之间的关系:
进程同步
两种模型
在了解进程同步之前,我们需要了解两种模型,来加深对进程同步的理解,以及了解为什么会要求进程同步:
1.生产者-消费者模型:
模型概述: 生产者每生产一个进程便把进程都放入到仓库,即缓冲区里面,此时仓库进程数量加一,然后消费者需要执行某一个进程的时候,便会把对应的进程取出来,此时仓库里进程数量减一,其中缓冲区位于缓存Cache当中。
模型过程(特殊情况下):
假设register表示某个部分(生产者或者消费者)的进程的数量,count表示缓存当中进程的数量。
生产者过程:
register = count //1
register = register+1 //2
count=register //3
消费者过程:
register = count //1
register = register-1 //2
count = register //3
假设缓冲区里面有10个进程,此时若是生产者生产一个进程,消费者也消费一个进程,那么按理来说,最终缓存区的进程还是十个,是不是这也呢,我们来模拟一下。
由于操作系统当中是并发性执行操作的,因此不一定是按照顺序来,有时候进程会断断续续,比如说生产操作的进程
1.生产者执行生产者的第一步,register=count此时,register生产=10,count=10
2.生产者执行第二步,register=register+1,此时register生产=11,count=10
3.由于并发,此时可能是生产者断了,消费者开始执行第一步,register消费=count,此时,register消费=10,count=10
4.消费者执行第二步,register消费=register消费-1,此时register消费=9,count=10
5.消费者执行第三步,count=register消费,此时register消费=9,count=10
6.生产者又开始了,执行它的第三步,count=register生产,此时count=11,register生产=11
咦,奇怪了,我们按理来说这个缓冲区进程数量应该是10,为什么实际过程当中却变成了11呢,好,问题暂时留在这里。
2.哲学家进餐模型:
概述:有五个哲学家,他们在一张大圆桌上吃饭,总共有五个叉子,每个哲学家左右手各一个,规定当左右手都拿到叉子时,才能够进餐。
两种情况:
理想情况下:
拿左边的叉子->右边没有叉子,等待->右边哲学家释放叉子->拿起右边叉子->进餐
实际特殊情况下:
5个人同时拿起左边的叉子->都发现右边没有叉子->等待->一直没有叉子,都在等待->最终饿死
为什么会这样呢?他们之间没有进行通信,没有互相告诉对方我干了什么,好像有点道理,是会这样发生,为了解决这个问题以及上面的生产者-消费者模型,我们来学习进程同步吧。
进程同步
1.目的:
-
在多进程进行资源竞争的时候,进行使用次序的协调
-
使并发执行的多个进程之间能够相互通信,有效的使用资源,有效地进行合作
2.进程同步的原则:
-
空闲让进:资源没有被占用的时候,允许使用资源
-
忙则等待:资源被占用的时候,请求进程进行等待
-
有限等待:进程不会总是等待,而是会在有限的等待时间内能够使用被占用的资源,避免进程像哲学家问题一样等待僵死。
-
让权等待:等待的时候,进程需要让出CPU,进入阻塞状态
3.实现进程同步的方法:
-
消息队列
-
共享存储
-
信号量
具体大家可以网上查询资料,博主后面的实践环节也会进行相应的讲解。
4.线程同步:既然进程需要同步,那么作为进程的实际执行者线程也需要同步。
5.线程同步的实现方法(博主后面会细讲):
-
互斥量:保证多线程互斥共享资源
-
读写锁:解决多读少写或者少读多写的情况
-
自旋锁
-
条件变量
Linux的进程管理
Linux系统当中进程的相关概念
1.进程类型:
-
前台进程:具有终端并且能够和用户进行交互的进程,就是用户能够在终端上面看到进程的具体执行过程,并且这个进程会占用终端,而使得我们不能在终端中输入命令,除非退出进程
-
后台进程:不会占用终端,基本上不会和用户交互,优先级比前台进程低,而且具体执行过程在终端上面看不到,如果我们要去结束这个进程,将需要执行的命令以&符号结束。
-
守护进程:属于特殊的后台进程,大部分是在系统启动的时候就已经运行了,直到系统关闭,一般进程名字以d字符结尾的都是后台进程,比如说crond进程。
2.进程的标记:
- 进程ID:就和我们之前说过的标识符差不多,它是进程的唯一标识符,每个进程的ID都不一样,一般都是非负整数,至于ID最大值都由操作系统限定
扩展:
父子进程:就是进程当中创建进程,前者为父进程,后者为子进程。Linux系统当中一般调用pstree命令查看
特殊进程:ID为0的idle进程,是系统创