---
title: "进程线程以及资源分配"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/process-thread-resource-allocation/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/01-系统基础与网络安全/计算机与操作系统/进程线程以及资源分配.md"
content_hash: 54c579e767bd08f2ffed4b237a4c462ab732f3d952bf32e575956ec884f4dbf7
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 进程线程以及资源分配

﻿# 进程线程以及资源分配

> 创建时间：2020/3/22 16:04

参考：https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503?fr=aladdin

https://blog.csdn.net/lvyibin890/article/details/82193900

### 进程

#### 定义

**狭义定义** ：进程是正在运行的程序的实例（an instance of a computer program that is being executed）。
**广义定义** ：进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。

一个进程，它在被执行前其实是一个可执行程序。这个程序是被放在磁盘上的，当它要被执行的时候，它先被加载到内存当中，然后再放入到寄存器中，最后再让cpu执行该程序，这个时候一个静态的程序就变成了进程。

> 进程：分配资源的基本单位
>  线程：独立运行和独立调度的基本单位

进程由 **程序** 、 **数据** 和 **进程控制块** 三部分组成。

#### 进程的内存分配与PCB（progress control block）

每个进程运行的时候，都会拿到4G的虚拟内存，在32位Linux下，其中3G是交给用户的，1G是交给内核的，而task_struct就是存储在这1G的内核系统空间中。

  * 每个进程都有各自的私有用户空间（0-3G），这个空间对系统中的其他进程是不可见的。
  * 最高的1GB内核空间则为所有进程以及内核所共享。
进程需要调用一些系统调用，来交给内核跑，程序的一部分逻辑可能是要交给内核去跑的，所以一部分虚拟地址必须要留给内核使用。

![assets/0003 - 进程线程以及资源分配__resource-001-be726dca7c52.png](/media/23cc60e49c024bf29e58.png)

**我们常说的虚拟地址空间， 其实就是用户空间**

每个进程的PCB都是存在所有进程共享的内核空间的中。
操作系统管理进程，也就是在内核空间中管理的，在内核空间中通过链表管理所有进程的PCB，如果有一个进程要被创建，实际上多分配了这么一个4G的虚拟内存，并在共享的内核空间中的双向链表中加入了自己的PCB。

**PCB** 是一个结构体，Linux下，就是task_struct。

> **PCB中的重要内容**
>  标识相关：pid，ppid等等
>  文件相关：进程需要记录打开的文件信息，于是需要文件描述符表
>  内存相关：内存指针，指向进程的虚拟地址空间（用户空间）信息
>  优先级相关：进程相对于其他进程的调度优先级
>  上下文信息相关：CPU的所有寄存器中的值、进程的状态以及堆栈上的内容，当内核需要切换到另一个进程时，需要保存当前进程的所有状态，即保存当前进程的进程上下文，以便再次执行该进程时，能够恢复切换时的状态，继续执行。
>  状态相关：进程当前的状态，说明该进程处于什么状态
>  信号相关：进程的信号处理函数，以及记录当前进程是否还有待处理的信号
>  I/O相关：记录进程与各种I/O设备之间的交互

#### 特征

动态性：进程的实质是程序在多道程序系统中的一次执行过程，进程是动态产生，动态消亡的。
并发性：任何进程都可以同其他进程一起并发执行
独立性：进程是一个能独立运行的基本单位，同时也是系统分配资源和调度的独立单位；
异步性：由于进程间的相互制约，使进程具有执行的间断性，即进程按各自独立的、不可预知的速度向前推进
结构特征：进程由程序、数据和进程控制块三部分组成。

#### 切换

进行进程切换就是从正在运行的进程中收回处理器，然后再使待运行进程来占用处理器。
**进程收回处理器** ，实质上就是把进程存放在处理器的寄存器中的中间数据存储在进程的私有堆栈中。
**让进程来占用处理器** ，实质上是把某个进程存放在私有堆栈中寄存器的数据（前一次本进程被中止时的中间数据）再恢复到处理器的寄存器中去，并把待运行进程的断点送入处理器的程序指针PC，于是待运行进程就开始被处理器运行了，也就是这个进程已经占有处理器的使用权了。

#### 状态

  1. **就绪状态（Ready）**
进程已获得除处理器外的所需资源，等待分配处理器资源；只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如，当一个进程由于时间片用完而进入就绪状态时，排入低优先级队列；当进程由I/O操作完成而进入就绪状态时，排入高优先级队列。
  2. **运行状态(Running)**
进程占用处理器资源；处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态)，通常会自动执行系统的空闲进程。
  3. **阻塞状态(Blocked)**
由于进程等待某种条件（如 **I/O操作** 或 **进程同步** ），在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程，也无法运行。

#### 线程与进程

通常在一个进程中可以包含若干个线程，它们可以利用进程所拥有的资源，在引入线程的操作系统中，通常都是把进程作为分配资源的基本单位，而把线程作为独立运行和独立调度的基本单位，由于线程比进程更小，基本上不拥有系统资源，故对它的调度所付出的开销就会小得多，能更高效的提高系统内多个程序间并发执行的程度。
操作系统引入线程，以便进一步 **提高系统的并发性** 。

#### 调度算法

实时系统中：FIFO(First Input First Output，先进先出算法)，SJF(Shortest Job First，最短作业优先算法)，SRTF(Shortest Remaining Time First，最短剩余时间优先算法）。
交互式系统中：RR(Round Robin，时间片轮转算法)，HPF(Highest Priority First，最高优先级算法)，多级队列，最短进程优先，保证调度，彩票调度，公平分享调度。

#### 创建过程

  1. 申请空白PCB。为新进程申请获得唯一的数字标识符，并从PCB集合中索取一个空白PCB。
  2. 为新进程分配 **资源** 。为新进程的 **程序和数据以及用户栈分配必要的内存空间** 。
  3. 初始化进程控制块。PCB的初始化包括：
①初始化标识信息，将系统分配的标识符和父进程标识符，填入新的PCB中。
②初始化处理机状态信息，使程序计数器指向程序的入口地址，使栈指针指向栈顶。
③初始化处理机控制信息，将进程的状态设置为就绪状态或静止就绪状态，对于优先级，通常是将它设置为最低优先级，除非用户以显式的方式提出高优先级要求。
  4. 将新进程插入就绪队列，如果进程就绪队列能够接纳新进程，便将新进程插入到就绪队列中。

#### 引起进程终止的事件

  1. 正常结束
**Hold指令** 或终止的系统调用。当程序运行到Hold指令时，将产生一个中断，去通知OS本进程已经完成。
  2. 异常结束
某些错误和故障迫使进程终止。这类异常事件很多，常见的有：越界错误，保护错，非法指令，特权指令错，运行超时，等待超时，算术运算错，I/O故障。
  3. 外界干预
进程因外界的请求而终止运行。这些干预有：操作员或操作系统干预，父进程请求，父进程终止。

### 进程间通信

https://blog.csdn.net/Wilder_ting/article/details/89050233
https://www.cnblogs.com/wangqiong/p/8988333.html
https://blog.csdn.net/weixin_42449534/article/details/97636181
https://blog.csdn.net/qq_39665334/article/details/82914862
https://blog.csdn.net/xiaoguobaf/article/details/52174285
https://www.cnblogs.com/kesimin/p/11351560.html
