什么是进程/任务
每个应用程序运行于现代操作系统上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程。
进程可以视为操作系统进行资源分配的基本单位。
进程控制块抽象(PCB Process Control Block)
计算机内部要管理任何现实事务,都需要将其抽象成一组有关联的、互为一体的数据。在java语言中,我们可以通过类和对象来进行描述这一特征。
PCB进程控制块描述进程
//以下代码是Java代码的伪码形式,重在说明,无法执行
class PCB{
//进程的唯一标识 ——pid;
//进程关联的程序信息,例如哪个程序,加载到内存中的区域。
//分配给该资源使用的各个资源。
//进程调度信息
}
这样,每一个PCB对象,就代表着一个实实在在运行着的程序,也就是进程。
操作系统在通过这种数据结构,例如线性表、搜索树等将PCB对象组织起来,方便管理时进行增删改查的操作。
管理进程
先描述:PCB控制块描述进程。
后组织:链表把多个PCB串起来。
1.任务管理器中查看进程列表。
遍历链表中的每个节点,并获取显示对应的信息。
2.创建新的进程
新的进程创建出一个对应的新的PCB,并且添加达到链表中。
3.销毁某个进程
把链表上对应的PCB结点删掉。
PCB的核心属性
1.pid 进程的ID/标识符。
2.内存指针 依赖的指令和数据的位置。
进程运行时,需要消耗一定的硬件资源。一组指针,告诉操作系统该进程要运行的指令在内存的那些房间里。
3.文件描述表 通过一个“顺序表”这样的数据结构,记录这个进程都打开了那些文件。
4.PCB中提供了几个属性,支持进程调度。
(1)状态 等待IO的时候会进入阻塞状态。 “随叫随到”是就绪状态。
(2)优先级 处理的事件不同。
(3)上下文 存档,以备下次继续。
(4)记账信息 延续刚才的优先级。
(5)tgid 同一个进程的tgid是同一个。
CPU分配——进程调度(Proccess Scheduling)
为了便于讨论和理解,我们大部分的场景下假设是单cpu单核的计算机。
操作系统对cpu资源的分配,采用的是时间模式——不同的进程在不同的时间段去使用cpu资源。
内存分配——内存管理(Memory Manage)
操作系统对内存资源的分配,采用的空间模式——不同进程使用内存中的不同区域,互相之间不会干扰。
进程间通信(Inter Process Communication)
如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备“隔离性”。
但现代的应用,奥完成一个复杂的业务需求,往往无法通过一个进程来独立完成,总是需要进程和线程进行配合的达到应用的目的,如此,进程之间需要进行“信息交换”的需求。进程间通信的需求就应运而生。
目前,主流操作系统提供的进程通信机制有如下:
1.管理
2.共享内存
3.文件
4.网络
5.信号量
6.信号
其中,网络是一种相对特殊的IPC机制,它除了支持同主机两个进程间通信,还支持同一网路内部非同一主机上的进程间进行通信。