文章目录
1.1浅谈操作系统
操作系统:首先操作系统是一个搞管理电脑软件的软件
。
对上:要提供一个提供软件稳定运行的一个工作环境。
对下:要管理好各种硬件资源。
如图:
2.进程
2.1 进程相关概念
什么是进程呢?
其实进程就是一个跑起来的程序(被执行的程序)。
我们可以打开电脑中的任务管理区器,选择进程,就可以看到此时电脑执行的程序。
同时我们也可以在一个软件安装包中,看到.exe文件,该文件就是一个可执行文件.
- 如果我们此时没有双击打开该文件,那么此时它就在磁盘上。
- 如果我们双击打开该文件,此时
操作系统就会把.exe文件加载到内存中,并且让cpu执行.exe文件中的一些二进制指令
。
2.2 操作系统是如何管理进程的?
- 先描述一个进程(明确一个进程中的一些相关属性)
操作系统使用c/c++实现的,这里的进程描述其实就是c语言中的一个结构体,成为PCB(process control block)进程控制块。
PCB中的一些属性:
- pid(进程id):进程的身份标识。
- 内存指针:指明了该进程要执行的哪些代码,指令内存在哪里,以及这个进程执行中依赖的数据在哪里。(当运行一个.exe文件,此时操作系统就会把.exe文件加载到内存中,变成一个线程)
- 文件描述符表:在程序执行的时候,经常要和文件打交道(文件在磁盘上)(打开文件,读写文件,关闭文件),进程每打开一个文件,就会在文件描述符表中多添加一项。(这个文件描述符表就相当于一个数组,里面的每个元素又是一个结构体,每个结构体描述一个文件的相关信息),只要一个进程一旦启动,不管是否有没有写打开操作文件的代码,系统都会默认打开3个文件(标准输入System.in,标准输出System.out,标准错误System.err),文件描述符表的下标被称为文件描述符。
- 在组织若干个进程(使用一些数据结构,把进程描述的信息串起来,方便进行增删查改)
使用双向链表,把每个PCB跟穿起来。方便进行增删查改。
所谓的创建进程,就是先描述出一个PCB,然后将PCB添加到双向链表中。
所谓的删除进程,就是在双向链表中找到该进程对应的PCB描述,然后进行删除。
所谓的查看任务管理器,实则就是遍历双向链表。
如何让一个进程正常工作?
进程调度:
进程调度: 操作系统在考虑CPU资源如何给各个进程如何分配。
所谓的进程调度,针对的是多任务操作系统(同一时间,多个进程在执行个各自进程中的代码),而单任务操作系统,同一时间只能执行一个线程中的代码,对于单任务操作系统来说不存在进程调度。
进程调度分为:状态,优先级,上下文,记账信息
。
状态: 描述当前进程接下来应该怎样进行调度。
就绪:随时可以去CPU上执行。
阻塞/睡眠状态:暂时不可以去CPU上执行。
优先级:先给那个进程分配时间,后给那个进程分配时间,以及分配时间的多少。
记账信息: 统计每个进程执行了多久,每个进程执行了那些指令,每个进程的排队时间有多久。给进程调度提供依据。
上下文: 表示的是 上次进程在被CPU调度之后,当时进程的执行状态。下次进程在CPU上执行的时候,就可以恢复上次的状态,然后继续向下执行,这就好比是有童鞋在玩手机上的单机游戏,游戏打完之后进行存档,以便于在下次在玩游戏的时候,以前游戏中的数据还在。在第二次玩游戏的时候,就相当于读档。
存档: 在进程被调出之前,把CPU上所有寄存器中的数据全部保存在内存中(PCB的上下文字段中)
读档: 下次进程在被CPU调度的时候,就可以把刚才内存中的数据恢复到CPU中的寄存器中
2.3 并行和并发
以上所说多任务操作系统,指的是在同一时间可以调度多个进程,其实也就是并行,并发。
并行: 指的是在同一时刻,多个指令在多个处理其中执行。
并发: 指的是在同一时刻,只有只有一条指令在执行,但是多条指令快速轮转进行执行,这样就从宏观的角度上,看做是同一时间,多条指令在执行。例如,从微观上,一个CPU核心,向执行任务1一会,在执行任务2一会,在执行任务3一会,在执行任务2一会。只要CPU核心执行任务,切换的做够快,就好像同一时刻,执行多条任务。
并行和并发在宏观上区分不了,在微观上是操作系统自行调度的结果。
就好比有6个CPU核心,6个任务。有些是并行关系,有些是并发关系,有的可能任务A和任务B一会是并发,一会是并行。
2.4 进程的独立性
在多任务操作系统中,同一时刻,多个进程造执行各自的代码。
如果某个进程在执行的时候出现了bug,那么其他的进程是否会受到影响?
其实是不会的,这正是因为进程具有独立性。两个进程之间是相互隔离的,不可以直接进行交互 。
如图:
进程的独立性,就依仗了虚拟内存空间。
如果进程1出现了bug,那么进程2,和进程3不会受到影响,继续执行各自进程中的代码。
2.5 进程间通信
两个进程之间是相互隔离的,不可以直接进行交互。
但是操作系统中提供了一个“公共空间”
进程A可以把数据先放到公共空间,当线程B执行的时候,在取走公共空间中线程A中的某些数据。
主要的进程间通讯方式:文件操作,网络操作。
3.线程
3.1 为什么要使用线程
那么如何解决这个问题呢?
方法一:
方法二:
3.2 为什么线程要比进程更加轻量
3.3 线程和进程的联系和区别
- 线程包含在进程中,一个进程可以有一个线程,也可以有多个线程。
- 进程和线程都是为了处理并发这样的场景,但是进程,资源被频繁的创建和时释放的时候,效率低下。相比之下进程中的线程就更加轻量(少了申请释放资源的过程)
- 操作系统创建进程,要给进程分配资源,进程是操作系统分配资源的基本单位。操作系统创建线程,是在CPU调度执行的,线程是操作系统调度执行的基本单位。
- 进程具有独立性,每个进程都有自己的虚拟内存空间,一个进程挂了,不会影响其他的进程执行代码
- 线程不是独立的,一个进程中的线程,共用一块资源,一旦一个线程挂了,可能会影响带其他的线程,甚至可能让整个进程崩溃。