文章目录
1. 操作系统
1.1 概念
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等
1.2 功能
- 管理各种硬件设备
- 给各种软件提供稳定的运行环境
1.3 进程
类似一个静态的".exe"文件,
当我们双击运行时,操作系统就会把这个可执行文件中的关键信息加载到内存中,并运行其中的代码,形成进程.
例如任务管理器中的显示,都是进程.
在操作系统内部,进程又是操作系统进行资源分配的基本单位。
2.操作系统的进程管理
进程管理是操作系统内核的基本功能
- 先描述,使用结构体,描述进程的特征
- 在组织,若干个进程使用一些数据结构,把很多描述进程的信息放到一起,方便增删改查
操作系统里面主要是通过 C/C++ 来实现对一个进程的描述,所以这里的描述就是用:结构体 来描述的,结构体功能更简单。操作系统当中描述进程的结构体,叫做:PCB(进程控制块)
2.1 PCB当中的信息
- pid(进程id):进程的身份标识。
- 内存指针: 描述了进程中要执行的代码在内存的哪里,也描述了进程中的数据在内存的哪里
- 文件描述符表:表示了当前进程都打开了哪些文件。每次打开一个文件,就会在文件描述符表上多增加一项。
2.2 进程的调度
当前计算机CPU的能力是有限度的,而进程数量又非常多,所以操作系统要做到尽可能的公平,对每个进程分配资源,完成调度.
进程调度的信息:
1.进程的优先级
先给谁分配时间,后给谁分配时间。以及给谁分配的多,给谁分配的少。
2.进程的状态
描述了当前的进程接下来应该怎么调度。就绪:随时可以到 CPU 上去执行。阻塞/睡眠 状态:暂时不可以去 CPU 上执行。
3.进程的上下文
表示上次进程被调度出 CPU 的时候,当时程序的状态,下次进程进入 CPU 的时候,就恢复到之前的状态,然后继续往下执行。 就类似于存档和读档。
4.进程的记账信息
统计每个进程都分别被执行了多久,分别都执行来哪些指令,分别都排队等了多久,给进程调度提供指导依据。
2.3 并发执行与并行执行
2.3.1 并发执行
微观上,一个 CPU 先执行一会儿任务1,再执行任务2,再执行任务3这样来循环。宏观上来看,切换的快,就好像很多任务在同时执行。
2.3.1 并行执行
CPU的多个核心同时执行不同的进程
3. 进程的虚拟地址空间
隔离性
我们期待每个进程拥有自己的内存空间,不相互打扰. 但是在C中的解引用操作时,很可能将指针指向错误的内存,
为了让各个进程之间不要相互干扰,操作系统就引入了"虚拟地址空间"这样的概念每个进程都只能访问到自己的地址空间,相互之间不会有影响了,哪怕你指针指错,操作系统也能及时发现,不会影响到其他的进程.
进程间通信
运用公共资源来完成进程间的通信.
4. 线程
理论上 进程已经可以运用好CPU的多核条件来完成并发操作
但是在面对需要进程频繁创建销毁的情况时,显然低效.
创建/销毁进程,本身就是一个比较低效的操作:
1.创建PCB
2.分配系统资源(尤其是内存资源)分配资源,就比较消耗时间了
3.把 PCB加入到内核的双向链表中
此时我们就引入了多线程 线程就相当于一条条生产线
1.进程包含线程
2.一个线程可以拥有一个PCB,故而一个进程拥有多个线程,就拥有了多个PCB.
3.同一个进程中的线程,共用一份资源.
因此,创建线程只需要:
1.创建PCB
2.把 PCB加入到内核的链表中
使用多线程是能提高效率,前提是多核资源是充分的.随着线程数增加,CPU核心逐渐都被吃满了,此时再增加线程,也就没有意义了.
但是多个线程访问同一个变量时,可能会发生冲突,同一个进程中的线程会相互影响,一个线程的崩溃,可能会使整个进程崩溃.