目录
操作系统
操作系统本质上就是一个软件。它是一个搞管理的软件。对于软件,操作系统要给软件提供一个稳定的环境;对于硬件,要管理好硬件设备。
进程
进程就是一个运行起来的程序。进程也叫做任务,打开电脑上的任务管理器就可以看到有哪些进程。程序一运行起来,肯定是要用一些东西的,比如内存等。也就是说进程会占用一些资源,操作系统就会根据每个进程分配相应的资源。所以进程也是操作系统分配资源的基本单位。 这些资源有很多打开任务管理器,可以简单的看到资源分配。
其中的内存,磁盘等都很好分,你用多少给你多少即可。可以看到,进程有很多,但是CPU资源有限,现在的CPU通常为多核,但对于几百个进程来说还是太少了。对于进程的同时进行,CPU内核是通过并行和并发这两种方式解决的。
并行
在微观上,两个进程在两个CPU上同时执行。
并发
在微观上,多个进程在一个CPU上执行,虽然不能同时执行,但是它对于线程之间切换的速度是很快的。这样在宏观上还是感觉它们是同时进行的。
上面这两种方式我们无法分辨出来,通常除非特意申明,否则把并行和并发统称为并发。
操作系统管理进程
一个结构体(PCB)对应一个进程,操作系统通过双向链表(化简为这样的结构,实际更要复杂)把这多个结构体给串起来进行管理。
PCB
PCB就是描述一个进程的结构体。它的内容非常的多,以下只介绍一些比较重要的。
1.pid 这是进程的标识符(数字),每个进程的都是不一样的。类似人的身份证号。
2.内存指针 该指针描述了此进程使用了哪些内存。
3.文件描述符 描述了该进程使用的硬盘上的文件等其他资源。
4.进程调度的相关属性 这里介绍重要的。本质上是为了解决大量进程在少量CPU上运行的问题。
a. 进程的状态
①就绪状态 表示进程已经准备好了,随时可以到CPU上去工作。
②运行状态 表示进程正在CPU上工作。 很多操作系统并不会区分以上两种状态。
③阻塞状态 表示进程该进程无法短时间到CPU上工作。
b. 进程的优先级
操作系统进行调度时,并不是平等的对待每一个进程。有些进程的优先级高,就会先调用。
c. 进程的上下文
进程如果被中断,过一段时间重新启动时,进程还能保持原先中断前的状态就靠进程的上下文。
本质上是中断前保存CPU中各个寄存器的值,恢复后把这些值重新恢复回去。
d. 记账信息
统计进程在CPU上占用的时间和执行的指令数目,从而决定下一阶段如何调度。
进程的虚拟地址
进程之间使用的地址都是经过物理地址抽象后的虚拟地址。为什么不直接使用真实的物理地址呢?通过这个例子就知道了。
对于上面的情况,一个线程出现了问题,同时连带其他线程出现问题,这不是一个好的情况。所以针对进程使用的内存空间,我们引入了一个硬件设备——MMU(能够加速把物理地址转为虚拟地址)。MMU和操作系统一起完成地址的转换。
此时一旦有某一个线程越界访问,操作系统内核就会发现这个问题,然后直接向进程反馈一个错误,让线程崩溃,从而不会影响其他线程。
进程间的通信
进程之间总是要有一些交互信息的,但上面才刚把进程之间隔离了,那么如何进行进程之间的交互呢。方法很多,但是核心思路都是一样的,就是划分出来一块公共空间,多个进程都可以进行访问这块空间,这样进程间就可以进行交互了。(后续文章在细说)
线程
线程是可以简单的理解为是进程的简化版,它是存在于进程里的。对于上文所描述的进程,可以理解为里面只有一个线程,但实际上一个进程至少有一个线程。
同一个进程里的多个线程共用内存资源和文件描述符,pid也是一样的;对于进程调度的相关属性,每个线程都是不一样的。所以一个进程里就会有多个PCB。
操作系统调度时,只是单独调度一个线程,而不是调度整个进程。所以进程时操作系统分配资源的基本单位,线程是操作系统调度执行的基本单位。
线程优点
线程的有点就是“轻”。(相较于进程)
1.创建线程开销小;
2.销毁线程开销小;
3.调度线程开销小。
线程缺点
由于同一个进程中的线程是不隔离的,所以如果有一个线程崩了,处理不好可能会导致这个进程的其他线程也崩了。但是进程之间就不会出现这样的问题。
多线程的代码在下篇。
文章希望可以帮到你,有什么问题评论区指出。