作者:~小明学编程
文章专栏:JavaEE
格言:热爱编程的,终将被编程所厚爱。
今天给大家分享几个关于进程的小问题
1.什么是进程?
2.进程是怎么管理的?
3.进程里面的PCB里都有啥?
4.进程的调度是怎么进行的?
5.什么是进程的独立性?
6.进程之间如何通信?
目录
什么是进程
进程是如何管理的
PCB里面都有些啥
PID
文件描述符表
内存指针
什么是进程的调度
进程的优先级
进程的状态
进程的上下文
进程的记账信息
进程的独立性
进程之间如何通信
下面我们就来谈谈我对这些问题的理解:
什么是进程
所谓的进程就是一个跑起来的程序,一个exe的可执行文件我们点开它就相当于开了一个进程然后进行执行。
在我们的任务管理器中可以查看我们的进程,这里的腾讯视频,微信都属于一个进程。
进程是如何管理的
我们操作系统是通过描述+组织的方式对进程进行管理的。
所谓的描述就是描述一个进程中含有哪些属性。通过类/结构体来进行描述。这里的结构体我们也成为PCB,即(process control block)——代码控制块,在linux中每个进程都用task_struct数据结构来进行定义,每一个进程都有一个PCB。
所谓的组织就是通过一些数据结构将这些进程给组织起来,比如我们的Linux是通过双向链表的方式将若干个进程给组织到一起的,然后进行一系列增删查改的操作。
PCB里面都有些啥
前面我们说到描述一个进程是通过类似结构体的模型进行描述的,这个结构体叫做PCB,那么具体的PCB里面都有些啥呢?
PID
相当于我们每个人的身份证,是用来标识我们进程的身份的,我们每个进程都有一个PID。
文件描述符表
文件描述表是用来记录我们打开了哪些文件的,一般情况我们操作系统会默认打开三个文件分别是:标准输入,标准输出,标准错误。其底层是一个数组。
内存指针
内存指针主要是用来记录.exe文件加载到内存对应的二进制指令和重要的数据在内存的哪个位置
pcb里面还有进程的优先级,进程的状态,进程的上下文,进程的记账信息这七个。
什么是进程的调度
我们前面说到我们的进程会有很多个但是我们的cpu的内核数量是有限的,我们cpu的核数一般就双核,四核,八核 等等,不会太多,但是我们的进程数量却是上百了,就算我们啥也不打开光打开电脑就有几十个进程了,远远多于我们的cpu内核数量,那我们我们怎么能让这么多的进程一起工作呢?
这就需要我们的进程调度了,就拿我们单核的cpu举例,虽然我们的进程有很多,我们可以让他们排队来执行,让a进程执行一会,然后再去让b进程执行一会。
进程的优先级
既然大家排队那么肯定就有插队的人,哪些人排在前面哪些人排在后面,每个进程都有相应的优先级。优先级高的优先执行。只有高优先级的进程不运行时,才调度低优先级进程运行
进程的状态
就绪状态: 即线程可以随时到CPU上面去执行。
阻塞状态:进程暂时不能到CPU上面去执行。
进程的上下文
当一个进程被调出CPU的时候,CPU会将当前的数据写回内存当中。当这个进程重新到CPU执行的时候,会将内存中的数据读到CPU的寄存器当中,类似于我们的存档和读档。
进程的记账信息
前面说到进程的优先级优先级低的排在后面,那就有可能一直等,前面一直有大哥,那么这个进程一直就执行不到,这个时候我们的操作系统会记录时间,有的进程长时间没有被执行就会通过调度让其反插队,然后执行它。
进程的独立性
我们知道我们一个cpu(单核)可以通过进程的调度来执行多个进程,这个时候万一我们的其中一个进程发生了故障该怎么办,是不是我们其它所有的进程都要跟着一起故障呢?
当然不是,我们的内存是分割成多个区域的我们每个区域相当于放一个进程,一个进程坏了不影响其它的进程。
进程之间如何通信
如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备隔离性。
但是我们不同的进程之间可能需要一定的交互,也就是进程之间的通信,一般的处理方式有下面几种:
1. 管道
2. 共享内存
3. 文件
4. 网络
5. 信号量
6. 信号
像linux是利用共享内存来处理的,我们划分一块公共的区域,然后需要交互我们就到公共的区域进行交流。