广州番禺Python, Java小班周末班培训
薯条老师的线下Python小班办得很好,学员的平均就业薪资有11K。线下小班培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6
12.3.1 什么是进程?
讲解进程的概念之前,读者先看一个示例,以理解何为进程。
(1) 编写一个简单的程序,程序文件为HelloWorld.java。程序的功能为在终端中输出hello world。代码如下:
public class HelloWorld { public static void main(String[] args){ System.out.println("Hello World"); } }
在未执行程序HelloWorld.java之前,它只是保存在磁盘中的一个Java文件,此时可以称其为一个程序,但不能称之为进程。
(2) 在IDEA中执行HelloWorld.java
在IDEA中执行HelloWorld.java后,可在输出窗口中看到Hello World的输出信息。
在第2步的Java程序执行过程中,此时的HelloWorld.java就变成了一个进程。
什么是进程?进程从字面意思来说,就是正在运行的程序,它是一个动态的概念,而程序是一个静态的概念。这里的动态是指程序在系统中的执行过程,而静态对应的就是存放在磁盘中的源代码文件。
12.3.2 进程的资源占用
进程是操作系统进行资源分配的基本单位,程序在运行的过程中,需要占用系统资源,这里的系统资源主要是CPU,内存和磁盘。读者可以把运行中的程序看作是指令+数据的集合。指令与数据存放在内存中,需要占用内存的资源。程序要在系统中运行起来,还得借助于CPU,通过CPU来执行程序指令。如果程序还需要读取磁盘文件的数据,那它同时也会占用磁盘的资源。读者可在Windows系统中进入任务管理器,以查看某个进程的资源占用情况。下图所示为笔者电脑中的Windows10系统的进程资源占用情况。
在Linux系统中,读者在终端中执行top命令,也可以查看进程的资源占用情况。
12.3.3 进程的状态
进程在系统中是作为独立运行的基本单位,按其在运行过程中的不同情况, 可以定义三种不同的进程状态。
(1) 运行态:此时的进程正占用CPU,处于一种运行的状态。
(2) 就绪态:进程可以运行,已具备运行的条件,但其它的进程正占用CPU,此时的进程在等待系统分配处理器以便运行。
(3) 休眠态:此时的进程不具备任何运行条件,正等待特定事件的发生,若事件发生,进程会由休眠态转为就绪态。
进程在创建以后会首先进入就绪态,然后等待系统分配CPU。一旦系统分配了CPU给进程,进程就进入了运行态。进入运行态以后,开始执行程序中的指令。系统中不止存在一个进程,每个进程在执行过程中,都处于这三种状态之一。进程在执行过程中会发生状态的转换,比如上文提及的helloworld进程从一开始的就绪态转为运行态。总的说来,进程在执行过程中会发生如下四种状态转换:
(1) 就绪态->运行态:具备运行条件后,系统分配了CPU给当前进程。
(2) 运行态->等待态:等待资源分配或特定事件发生,如在程序中等待用户从键盘输入。
(3) 运行态->就绪态:进程的CPU时间片已结束,或CPU被更高优先级的进程抢占。
(4) 等待态->就绪态:资源被分配给当前进程或特定事件己经发生。
下图描述了进程的状态转换过程:
12.3.4 进程的地址空间
进程是操作系统进行资源分配的基本单位,系统会为每一个进程分配一个地址空间。这里的地址空间是一种逻辑概念,而非物理上的地址空间。
什么是物理地址空间?进程的实质是指令+数据的集合,进程中的指令+数据都驻留在系统的内存中,进程的物理地址空间就对应于这块物理内存。
谈及地址空间时,通常指的是进程的虚拟地址空间。操作系统在实际实现中将主存与IO设备抽象为虚拟内存,同时为进程提供了一层抽象,使得每个进程都在独占地使用这块虚拟内存,这块虚拟内存就是进程的虚拟地址空间。
虚拟内存是计算机系统内存管理的一种技术,使得进程认为它在独占这块内存空间,而实际上,这块虚拟内存被分割成多块物理内存碎片,部分数据暂存在磁盘中,在需要时会进行磁盘与内存间的数据交换。
在32位的操作系统中,虚拟地址空间的大小为2的32次方个字节,也就是4GB大小,那么进程的虚拟地址空间就为4GB。对于64为操作系统来说,则最多为2的64次方个字节大小的地址空间,但实际过程中并不需要这么长的地址长度,例如在Linux系统中仅以48位来进行寻址,最多可以寻址256TB的地址空间。进程的地址空间从总体上来说主要分为四个部分:
(1) 代码段: 存储源程序中的指令
(2) 数据段: 存储未初始化或初始化为0的全局变量
(3) 堆区:用于存放程序运行中动态分配的内存,其大小不固定,可动态扩张或缩减
(4) 栈区: 存储函数中的局部变量,以及函数被调用时,用来存储参数和返回值。
12.3.5 进程的父子关系
进程之间也存在逻辑上的父子关系,假设在进程A内部创建了多个进程,进程A就是这多个进程的父进程。操作系统内部并发运行了多个进程,但进程之间不一定存在逻辑上的父子关系,例如在windows系统中先后运行word程序和谷歌浏览器, 这两个进程毫无关联, 并不存在逻辑上的创建关系(即其中一个进程由另外一个进程所创建),所以不是父子进程。系统中的进程可以有多个子进程,但每个进程最多只能有一个父进程。常说的多进程编程,是指在进程内部创建多个子进程,然后将每一个子任务指派给一个子进程来进行处理。
12.3.6 进程间的通信
多个进程之间可以进行通信。这里的通信可以形象地理解为进程之间的对话,进程是程序的执行实体,程序在执行过程中可以通过特定的形式来与其它进程进行对话。为什么需要在进程间进行通信?因为在实际的系统设计中,多个进程需要进行协同工作,系统中提供一套通信机制是很有必要的。比如在实际的并发设计中,父进程负责接收请求,子进程负责对请求进行处理,要让子进程收到任务请求,父进程必须通过系统的通信机制来将请求转发给子进程。
Windows系统和类Unix系统都提供了进程的通信机制,对此感兴趣的读者可以继续学习相关内容,来进行下一阶段的学习。
对进程通信感兴趣的读者可以深入地学习Unix系统中的进程通信机制。在Unix系统中提供了管道,消息队列,共享内存等来进行进程之间的通信。
12.3.7 进程间的同步
进程同步是指多个进程在进行协同工作或数据共享的过程中可能会发生冲突,这时引入了一系列机制来对进程间的操作进行协调和制约。进程之间可以通过系统提供的通信机制,来对数据进行共享,当多个进程共享同一份数据资源的时候,在读写过程中会引发数据安全或顺序混乱问题,这时需要进行进程同步。以打印机为例,任意时刻只能同时被一个进程独占,如不进行同步控制,则会造成文件打印顺序的错乱。
Windows和Unix系统都提供了进程的同步机制,比如互斥锁和信号量,在后面的教程中会详细讲解。
通过同步机制来保证多个进程都可以正常且正确的执行,并且不会出现数据的不一致情况,这就是进程安全的概念。关于进程安全,会在Java的多进程编程中进一步讲解。
12.3.8 最具实力的小班培训
来这里参加Python和Java小班培训的学员大部分都找到了很好的工作,平均月薪有11K,学得好的同学,拿到的会更高。由于是小班教学,所以薯条老师有精力把每位学员都教好。打算参加线下小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。
(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲
扫码免费领取学习资料: