进程和线程
cpu
- 计算机的核心是cpu,承担了所有的计算任务
- 单个cpu只能一次运行一个任务
进程
定义
- 进程是具有一定功能的程序关于某个数据集合上的一次运行活动
为什么需要进程
为了提高CPU的效率,人们想把多个程序同时加载到计算机中,并发执行,这些同时存在于计算机内存的程序就称为进程,进程让每个用户自己独占CPU,因此进程是为了在CPU上实现多道编程而出现的概念
简单解释
- 一个程序加载到内存后就变成了进程
- 进程是系统进行资源调度和分配的一个独立的单位
什么是进程
- 从物理内存上:进程是内存的一片内存空间,在任意时刻cpu只能执行一条指令,执行哪条指令由物理程序由程序计数器决定,也就是说,进程共用一个程序计数器
- 从逻辑上:由于进程可以执行,也可以被挂起,还能继续执行,因此从这个角度看,每个进程有着自己的计数器
- 从时间上:进程都是向前推进
进程的管理
进程在计算机上运行,需要让计算机分配合适的内存,让其有一个安身之处,由于多个进程可能同时并存,因此为了解决让多个进程共享同一个物理内存而不发生冲突,操作系统解决这个问题的手段是内存管理;此外进程也需要进行切换,因此计算机为解决这个问题,则有了进程调度
进程表存放进程的一切信息
当一个进程产生的时候,操作系统需要为它创建记录,存储的结构为进程表
进程的创建过程
- 分配进程控制块
- 初始化机器寄存器
- 初始化页表
- 将程序代码从磁盘读进内存
- 将处理器状态设置为用户态
- 跳转到程序的起始地址
特点
- 代表cpu只能处理的单个任务
- 任意时刻,cpu只能运行一个进程
进程的几种状态
就绪状态
当进程分配到除了cpu以外的所有必要的资源,只要获得处理机便可以立即执行
运行状态
进程获得了处理机,其程序正在处理机上执行
阻塞状态
正在执行的进程,由于等待某事件发生而无法执行时,便放弃处理机而处于阻塞状态
状态的转换
执行到就绪
一个进程运行时间太长,操作系统可以将其挂起
执行到阻塞
运行期间执行了某种阻塞操作
阻塞到就绪
一个阻塞的进程等待的资源到达后,就可以随时执行,进入就绪状态
就绪到执行
就绪进程由操作系统调度到cpu上就进入执行状态
阻塞到执行
操作系统在给阻塞分配到资源后,并不会立即执行,因此此转换不成立,操作系统选择执行的进程只会在就绪进程中选择
就绪到阻塞
进程的通信方式
管道
在某种存储空间介质上划出一片空间,赋给其中一个进程写的权力,另一个进程读的权力
类型
普通管道
流管道
记名管道
- 允许无亲缘关系的进程间的流动
特点
- 数据单项流动
- 且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程
SOCKET
信号
为什么还需要用信号进行通信
- 像迫使一方对为我们的通信立即做出回应
- 不想建立任何连接,而是临时突然感觉需要进行通信
- 传输的信息量微小,使用管道或者套接字不划算
信号是什么
- 一个内核对象或者说是一个内核数据结构
- 发送方将数据结构的内容填好,并指明信号的目标进程,发出特定的软件中断
- 操作系统收到特定的中断请求,知道有信号要发送,并进行通知
- 进程收到通知,并对信号进行处理
信号量
- 类比火车的发行,管理铁路的是一个信号量,任何一列火车必须等待表明铁路可以行驶的信号后才能进入轨道
- 在计算机中,信号量的本质为一个整数0或1
- 信号量不仅仅是一种通信机制,更是一种同步机制
共享内存
信息交换量最大
用于进程之间需要共享大量数据
步骤
- 进程首先需要创建一片内存空间专门作为通信用
- 其他进程则将该片内存映射到自己的虚拟地址空间
两端都可进行读写相比较于管道
缺点
- 管理复杂
- 安全性低
消息队列
和管道的不同
- 无需固定的读写
- 可以支持多个进程
- 多个进程可以读写消息队列
进程的缺陷
- 进程只能在一个时间做一件事情
- 进程在执行的过程中,如果发生阻塞,例如等待输入,整个进程就会被挂起,无法继续执行,因此在进程里面有部分工作,不需要使用用户输入数据,也无法推进,因此为了解决这个问题,出现了线程。
线程
解释
- 线程是进程的实体,是cpu调度和分派的基本单位
- 它是比进程更小的能独立运行的基本单位
- 一个进程至少有一个线程
- 多线程的情况先,增加cpu,可以提高进程的执行效率
特点
- 一个进程包含多个线程
- 一个进程的内存空间是共享的,每个线程都可以使用这些共享内存
线程管理
线程控制表
和进程共享的部分
- 地址空间
- 全局变量
- 文件
- 子进程
- 定时器
- 信号
- 占用CPU时间也可以共享
和进程不可共享的部分
- 寄存器
- 程序计数器
- 栈
线程的调度
由进程负责,进程中有一个执行序列
- 用户态
由操作系统负责
- 内核态
线程中用户态到内核态的切换
- 设置处理器内核态
- 保存当前的寄存器(栈指针,程序计数器、通用寄存器)
- 将栈指针设置指向内核栈地址
- 将程序计数器设置为一个视线约定的地址上,该地址存放的是系统调用处理程序的起始地址
线程同步
方式
临界区
- 当多个线程访问问一个独占性共享资源呢的时候,可以使用临界区对象。
- 拥有临界区对象的线程可以访问被保护起来的资源,其他线程如果要访问,必须等待获取临界区对象
事件
一个线程结束后,主动唤醒另外一个线程执行任务
事件的两种状态
- 有信号
- 无信号
事件的两种类型
人工事件
- 获得信号后,释放可利用的线程,直到调用成员函数Reset()才将其设置为无信号状态,这一阶段为手动执行
自动事件
- 在被至少一个线程释放后自动返回到无信号的状态,这一阶段为自动执行
互斥量
- 只有拥有互斥对象的线程才能有访问公共资源的权限,互斥对象只有一个
- 线程在使用每一个内存空间的时候,其他的线程如果想要使用,必须等到该线程结束,这里使用了互斥锁
信号量
即允许多个线程同时访问同一资源
easy explain
- 有些内存只能提供给固定数目的线程使用
- 每个线程在使用的时候,需要取钥匙,进去,出来时在挂回钥匙
目的
- 防止线程共同运行时,对结果产生不确定性
- 不论线程的执行如何穿插,其运行结果都是正确的
两个或多个线程相执行同一段代码或者访问统一资源的现象称为竞争,这个可能造成竞争的共享代码段或者资源称为临界区
总结
多进程形式,允许多个任务同时运行
多线程形式,允许单个任务分成不同的部分运行
协调机制,防止进程和线程之间的冲突,另一方面允许进程之间和线程之间共享资源
线程可以独享