进程的认识

简介: 进程的认识

什么是进程/任务

每个应用程序运行于现代操作系统之上时,系统会提供一种抽象,好像系统上只有这个程序正在运行,所有的硬件资源都被这个程序使用.这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一.

而现在所用的都是多任务操作系统.也就是同一时刻,可运行多个任务,这些正在运行中的程序,就可以称为任务,也叫进程.

重要概念

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看作程序的依次运行过程;同时,在操作系统内部,每一个任务执行过程中,都需要分配一定的进程资源,换言之,可以认为计算机中的每个进程,在运行时,需要分配一定的系统资源,因此,进程又是操作系统进行资源分配的基本单位.

进程控制块抽象(PCB Process Control Block)

计算机内部要管理任何现实的事物,都需要将其抽象成一组有关联的,互为一体的数据.在Java语言中,我们可以通过类/对象来描述这一特征.

//以下是Java代码的伪码形式,重在说明,无法直接运行
class PCB {
    //进程的唯一标识 -- pid
    //进程关联的程序信息,例如哪个程序,加载到内存中的区域等
        //分配给该资源使用的各个资源
    //进度调度信息(下面讲解)
}

进程管理

1.先描述:使用类/结构体的方式, 把实体的属性都列出来

2.再组织:使用一定的数据结构,把这些结构体/对象串在一起.(eg.在Linux系统中,是使用链表将若干task_struct串起来的--表示进程信息的结构体PCB(进程控制块),如果运行一个新的程序,于是系统上会多一个进程,多的这个进程就会构造一个新的PCB,放在链表上)

这样,每一个PCB对象,就代表着一个实实在在运行着的程序,也就是进程.

操作系统再通过这种数据结构,例如线性表,搜索树将PCB对象组织起来,方便管理时进行增删查改的操作.

CPU分配-进程调度(Process Scheduling)

操作系统对于CPU资源的分配,采用的是时间模式--不同进程在不同时间段去使用CPU资源.

CPU少量逻辑核心要进行大量进程--需要分时复用(并发).

如果将CPU比喻成一个舞台的话,要执行的命令(进程)就是演员.分时复用(并发)就可以看作多演员轮流登台的过程.        

如果CPU是多核的话,就等于有多个舞台,有许多演员在同一时间段在不同舞台上进行表演,这即是并行.

现在时代的计算机的执行过程,往往是并行并发同时存在(现在的CPU基本都是多核).往往将并行/并发统称为并发.对应的编程方式就叫做并发式编程(解决一个问题,同时搞多任务执行,共同协作解决).

内存分配-内存管理(Memory Manage)

操作系统对内存资源的分配,采用的是空间模式--不同进程使用内存中的不同区域,互相之间不会干扰,因为每个进程都必须使用自己申请到的内存.

进程执行的过程中,需要消耗一定资源的,内存就是一种重要的资源

核心结论:每个进程的内存,是彼此独立的,互不干扰的.

进程间通信(Inter Process Communication)

如上所述,进程是操作系统中进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的(进程具有独立性),这就是操作系统抽象出进程这一个概念的初衷,这便带来了进程之间互相具备"隔离性".

但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行"信息交换"的需求.进程间通信的需求就应运而生.

即系统提供公共的空间(多进程都可访问),让这两个进程借助这种公共空间来交互数据.

目前,主流系统提供的进程通信机制有如下:

1.管道

2.共享内存

3.文件

4.网络

5.信号量

6.信号

主要使用的进程间的通信的方式是文件和网络.网络,是可以支持同一个主机的不同进程(适用性更高).后端这里,很可能是一组服务器,这一组服务器间进行通信.

PCB的核心属性

pid

进程的身份标识,通过简单不重复的整数进行区分的(同一机器,同一时刻,一定是唯一的),针对进程进行操作,就可以用pid区分

内存指针

进程使用的内存在哪,哪部分就放代码/指令,哪里放数据.

文件操作符表

由于进程需要经常访问硬盘.操作系统通过硬盘这样的硬件设备,将其封装为文件.

一个进程想要操作文件,就必须要先打开文件(让你的进程在文件描述符表中分配一个表(构造一个结构体),文件描述符表就出现了.

每个进程的文件描述符表是一个数组.用于存放指针,指针指向内核中表达打开文件的结构体.

文件描述符表就包含了进程使用的硬盘的相关信息.

状态

用于描述某个进程是否能去cpu上执行.

有的时候,某个进程,这会不太方便.比如:某个进程,通过Scanner等待用户输入内容(用户啥时候输入的?->这完全是不可控的事情)

就绪状态:随时准备好去cpu上执行,操作系统一打招呼就上了.

阻塞状态:这个进程,当前不方便去cpu上执行,不应该调度它.(直观理解就是代码不能往下走了,比如,进程在等待IO,来自控制台的输入输出/硬盘输入输出/网卡的输入输出).

优先级

多个进程等待系统调度,多个进程之间调度的先后关系,不是平均的.先调度谁,后调度谁,谁长谁短都是可以进行调控的(系统api可以设置).

记账信息

针对每个进程,占据了夺少CPU时间,进行一个统计,会根据这个统计结果来进一步调整调度的策略.因此就需要在下一轮次进行调整.确保每一个进程都不至于出现完全捞不到CPU的情况的.

上下文

是PCB中的数据结构,是相当于在内存上的.支撑进程调度的重要属性.就是相当于游戏中的读档和存档.每个进程在运行中,就会有很多优先结果,在CPU的寄存器中.

(1)存档(保存上下文):在进程调度出CPU之前,把当前寄存器中的信息,单独保存在一个地方

(2)读档(恢复上下文):在下次再去CPU上执行的时候,再把这些寄存器的信息给恢复回来.

相关文章
|
7月前
|
Linux
进程
在linux中 每个执行的程序都称为一个进程,每个进程都分配一个id号 每个进程都有可能以两种方式存在的,前台与后台。 显示系统那些进程在执行 ps -a 显示当前终端的所有进程信息 ps -u 以用户的格式显示进程信息 ps -x显示后台进程运行的参数 %men 占用物理内存 vsz 占用虚拟内存 rss 占用物理内存 tty 终端信息 stat 运行状态 s睡眠 r运行时间 n 比普通进程优先级低 r正在运行 d短期等待 z 僵死进程 t 被跟踪或停止 command 进程名 ps -ef 是以全格式显示当前所有的进程 -e 显示所有进程 -f全格式 uid 用户id pid 进程i
34 0
|
8月前
|
网络协议 调度 Python
进程小练习
进程小练习
|
5天前
|
Linux API 调度
进程,任务
进程,任务
12 1
|
5天前
|
存储 Linux
【linux进程控制(二)】进程等待--父进程是如何等待子进程死亡的?
【linux进程控制(二)】进程等待--父进程是如何等待子进程死亡的?
|
5天前
|
C语言
进程的初步实现
进程的初步实现
50 0
|
9月前
|
存储 调度
进程和进程的调度
进程和进程的调度
|
10月前
|
存储 缓存 安全
Linux进程理解【进程认识】
Linux进程概念理解与创建操作详细讲解,干货满满!
4345 2
Linux进程理解【进程认识】
|
Linux 程序员 Shell
【Linux进程】一、什么是进程?什么是PCB?进程都有哪些状态?
【Linux进程】一、什么是进程?什么是PCB?进程都有哪些状态?
171 0
【Linux进程】一、什么是进程?什么是PCB?进程都有哪些状态?
|
存储 调度
关于进程的那些事
关于进程的那些事
69 0
|
存储 算法 程序员
一定要知道的进程知识
一定要知道的进程知识
114 0
一定要知道的进程知识