目录
操作系统
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
一个应用程序的运行,是靠操作系统进行对各部分的调配,多个程序的运行,就要操作系统对这些程序进行管理
进程/任务(Process/Task)
1、概念
一个运行起来的程序就是进程,进程是操作系统对正在运行的程序的抽象;
这就是一个可执行文件(程序),当它运行起来就会在系统中形成一个进程
进程和程序的区别
进程 | 程序 | |
定义 | 正在运行的程序,具有独立的地址空间和资源 | 有一系列指令和数据组成的可执行文件 |
资源 | 需要分配和管理系统资源,如:内存、CPU时间和I/O | 不需要系统资源,只是一组静态的指令和数据 |
状态 | 可以处于就绪、运行、阻塞或终止等不同状态 | 没有状态,只有程序代码和数据 |
线程 | 可以包含多个线程,共享线程的资源 | 没有线程,是单线程执行 |
通信 | 可以通过进程间通信(IPC)来进行数据交换 | 没有内置的通讯机制,需要通过操作系统提供的API来实现 |
可见性 | 可以被操作系统和其他进程看到和管理 | 只有程序员能开到和管理 |
生命周期 | 创建、运行、阻塞、唤醒和终止等不同阶段 | 没有生命周期,只有程序代码和数据 |
2、进程管理
当进程多了,就需要 进程管理;
- 描述一个进程:使用结构体/类 将进程的信息表示出来
- 组织进程:使用数据结构(通常是双向链表),讲这些 结构体/类 放在一起,同一调度
3、进程的结构体里的属性
进程的 结构体也被成为 PCB — 进程控制块
PCB是一种数据结构,用来存储进程信息,PCB可以通过链表或数组的形式进行组织
3.1 PID(进程标识符)
在操作系统中,每个进程都有一个唯一的进程标识符(Process ID,简称PID),用于区分不同的进程。
PID是一个整数,通常从1开始递增,操作系统通过PID来管理进程的运行和资源分配,比如对进程进行调度、信号传递、进程间通信等。
程序一运行就会被系统自动分配一个标识,进程终止就会被回收
3.2 内存指针
是指向进程地址空间中特定位置的指针,它可以用来访问进程的内存空间。
在进程运行的时候,记录使用了那些内存上的资源
3.3 文件描述符表
每个进程都可以打开多个文件,文件描述符表用来记录进程打开的所有文件机器状态
文件:硬盘上存储的数据,就是以文件为单位进行整理
进程每打开一个文件,就会产生一个“文件描述符(标识这个被打开的文件)”,一个进程可能会打开多个文件,对应产生了一组文件描述符;这些文件描述符放到了类似于顺序表这样的一个数据结构中,就构成了文件描述符表!
每个进程都有一个相应的进程描述符表,用于存储操作系统在管理进程时所需的各种信息,如进程状态、进程标识符、进程优先级、进程上下文等等。
进程运行的时候,记录使用了那些硬盘资源
由 内存指针(记录内存资源)和文件描述符表(记录硬盘资源),得出进程的运行需要从操作系统这里申请资源;
进程是操作系统进行资源分配的基本单位
3.4 进程调度
调度 就是 对进程运行的时间管理
程序的运行,依靠的是CPU处理数据,程序是一组“二进制指令”集合,CPU来处理
CPU有核心数 相当于 一个车队,4个核心数 == 4辆车,每辆车配两个员工
但是电脑要运行多个程序,有几十个进程,但是CPU就这点处理器,怎么办;
这就是有工厂来下单,要他们来处理货物,但是车队就这点车、人,怎么处理订单?
3.4.1 并行
同一时刻,4个核心,同时执行4个进程,这四个进程就是 并行 处理
车队的4辆车,每辆车负责一个工厂
那么,这就要求要求硬件的支持,核心(车)数量决定处理的速度
3.4.2 并发
并发指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中’同时’存在多个运行的程序,因此具有处理和调度多个程序同时执行的能力。
在操作系统中再多道程序环境下,一段时间内宏观上在“同时”执行,微观下进程是交替执行,操作系统的并发性是通过 分时 实现的
在订单少的时候可以一辆车负责一个工厂,超出了车队的数量,那就要对工厂进行分时完成;
1、4、6 | 2、5 | 3、7 |
线程A(工厂A) | 线程B(工厂B) | 线程C(工厂C) |
主要就可以实现CPU 4 核心可以调度 100多进程,通过 并行+并发 的形式;
通常 并行+并发 合并成为 并发
3.5、进程调度的属性
3.5.1 进程状态
- 就绪态:该进程已经就绪,可以随时上CPU执行
- 阻塞态:该进程暂时无法上CPU执行
线程B(工厂B)的机器进行调整,一段时间不能出货;B就处于阻塞态,A、B就是就绪态可以随时出货
3.5.2 进程优先级
进程之间的调度不一定是公平的,存在优先差异;。
线程A(工厂A)的订单比较贵,它的出货就要优先于B、C
3.5.3 进程上下文
上下文描述当前进程执行到那部分,就会产生一个“记录文档”
进程在离开CPU时就要把当前的运行的中间结果进行“存档”,等下次进程回到CPU上,再恢复之前的”存档“,从上次执行的结果向后执行
这些存档会存储到 “寄存器”中
- 存档:进程离开cpu就需要将寄存器的值保存在PCB上下文字段中
- 读档:进程下次回来,cpu再把PCB中的值恢复到寄存器中.
线程C(工厂C)说这个订单剩下的部分要到下个月再交货,到下个月的时间再来,CPU(车队)就要记下已经运了多少货,还剩下多少下个月来继续
3.5.4 进程的记账信息
统计 每个进程在CPU上执行了多久;
记录每个线程(工厂)在CPU(车队)下了多久订单
3.6 操作系统的常用数据结构
操作系统往往使用 双线链表 的就够 来组织 PCB
- 创建一个线程,就是创建一个 链表的节点
- 销毁一个线程,就是把链表的节点给删除
- 遍历进程列表,就是遍历链表
内存分配 —— 内存管理(Memory Manage)
操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
操作系统给进程分配的内存,是以“虚拟地址空间”的方式进行分配的,每个进程的访问的内存地址,都不是真实的物理内存的地址
一个进程无法直接干预另一个进程额度内存内容,“进程的独立性“——”每个进程都有自己独立的地址空间“,大大提升了操作系统的稳定性
例:
进程A万一代码BUG,出现了错误的地址,因为是虚拟地址空间,无法找到实际的物理内存,这就不会对其他的进程的内存数据造成干扰
进程间通信
有的时候需要 进程之间的交互,但是虚拟的地址空间,无法让两个进程交互影响,在这种隔离性的前提现下,找出一个公共区域,让两个进程借助这个区域来完成数据交换
主流操作系统提供的进程交互机制:
- 管道
- 共享内存
- 文件
- 网络
- 信息量
- 信号
网络是一种特殊的IPC机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上进程间的通信
线程是什么?
进程,是比较“重量的”,速度慢/消耗资源多;创建、销毁、调度 成本都很高;主要体现在 资源分配上
多进程编程,可以解决并发的问题,但是不高效;那么就出现了线程,
线程就是 更轻量的进程(轻量级进程)
工厂(进程)想提高生产,一种是开辟新场地,新机器,耗时耗力;
另一种就是在原先地方 在加上新机器,这个新机器就是 线程
进程可以包含多个线程