栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

进程和线程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

进程和线程

目录

认识进程

操作系统是如何管理进程的

PCB的属性

 并发和并行的联系和区别

进程的独立性

进程间的通信

认识线程

并发编程问题

为什么线程说比进程更加的“轻”呢?


认识进程

1.进程就“跑起来”的程序。

 2.那些.exe格式的文件都称为“可执行文件”,在双击这些文件之前,这些文件都会“静静”的待在硬盘上,不会对系统有任何影响;双击这些文件之后,操作系统会将这些文件加载到内存当中,并让CPU开始执行exe内部的一些指令(exe里面就存了很多这个程序对应的二进制指令),这时exe文件就给执行起来了,开始进行一些具体的工作,把这些运行起来的可执行文件称为进程

操作系统是如何管理进程的

1.先描述进程(明确一个进程上的相关属性)。此处描述就是用就是用C语言的结构体(相当于Java当中的类)来描述的,而操作系统中这个描述进程的结构体称为“PCB”(process control block)进程控制块。

2.再组织若干个进程(使用一些数据结构,把很多描述进程的信息放到一起,方便进行增删改查),典型的就是利用双向链表将每个进程的PCB串起来。

这时候,所谓的“创建进程”就是先创建PCB,然后将PCB加到双向链表当中;

“销毁进程”就是在双向链表上找PCB,然后将PCB从双向链表上删除;“查看任务管理器”就是将遍历双向链表。

PCB的属性

基础属性

1.pid(进程id)进程的身份标识(进程的身份证号)。

2.内存指针,指明了这个进程要执行的代码/指令在内存的哪里,以及这个程序要执行依赖的数据在哪里。

3.文件描述符表,程序运行过程中,经常会跟文件打交道。进程每次打开一个文件就会在文件描述符表上多一项。(这个文件描述符表,就视为一个数组,里面的每一个元素又是一个结构体,就对应一个文件的相关信息)。

注意:一个进程一旦启动,不管你代码中是否写了打开/操作文件的代码,系统都会默认打开三个文件:标准输入:System.in  , 标准输出:System.out  , 标准错误:System.err。

 特殊属性(实现进程调度)

如何理解进程调度?

首先应该知道,现在的操作系统一般都是“多任务操作系统”(一个系统同一时间内执行了很多的任务),其前身是单任务操作系统(同一时间只能运行一个任务)。

1.状态,这个状态就是描述了当前这进程接下应该怎么去调度,如:就绪状态:随时可以去CPU上执行;阻塞/睡眠状态:暂时不可以去CPU上执行。

2.优先级,先给谁分配时间,以及给谁分配的多,给谁分配的少。

3.记账信息,统计每个进程分别被执行了多久,分别执行哪些指令,分别排队等了多久,给进程调度提供了依据。

4.上下文,就表示了上次进程被调出CPU时,当时程序的执行状态;下次进程进CPU时,就可以恢复之前的状态,然后继续往下执行。例如,进程进程被调出CPU时,要将CPU寄存器当中的数据全部存储到内存当中,这称为存档;进程再被带如进程中时,就可以从内存当中恢复数据到CPU寄存器当中,相当于读档。

 并发和并行的联系和区别

并行:微观上:两个CPU核心,同时执行两个任务的代码

并发:微观上:一个CPU核心,先执行一会任务1,再执行一会任务2,再执行一会任务3,接着再执行一会任务1,只要切换的足够快,在宏观上就像是多个任务同时执行。

注意:并行和并发这两件事,只在微观的条件下看得到区别(操作系统自行调度的结果),宏观上区分不了,所以一般统称为并发。

进程的独立性

介绍:进程的调度就是操作系统在考虑如何分配CPU资源给每一个进程,内存资源的分配依靠的是“虚拟地址空间”,如果某个进程出现了bug,进程崩溃,是否会影响到其他的进程呢?

为了保证“进程的独立性”,会把虚拟地址空间划分成很多份用于执行进程,这个时候进程间就相对独立,一个进程出现bug不会影响到其他进程了。

注意:那把虚拟地址空间划分为很多份,每一份分到的虚拟地址空间也不会太小;因为在系统中有80甚至100个进程在运行,但是在微观上同时运行的只有cpu的核心数个进程。

进程间的通信

介绍:进程之间通过虚拟空间各自隔离开,但在实际工作中的一些情况下,仍然是需要通过交互来实现更复杂的工作。

如以上的例子,被封锁的大楼,居民间不能接触。可以设置“公共空间”来进行物资传递。系统中也存在很多类似于这种“公共空间”的进程间通信机制,目前最主流的是以下两种:1.文件操作。2.网络操作(socket)。

认识线程

并发编程问题

首先应该了解到多进程也能实现并发操作。

但是多进程操作实际上是一个非常消耗资源的低效操作,因为创建进程需要分配内存和打开文件,销毁进程需要释放内存和释放文件,这样对于资源的申请和释放就是一个低效的操作。

这种情况下进行并发编程,很多进程同时进行创建和销毁操作,消耗资源是非常多的。

解决这个问题有两个方案:

方案一:创建进程池,即当这个进程不需要使用的时候,并不会将将这个进程销毁,而是将进程放入进程池当中,下次要使用这个进程的时候,就直接从进程池当中获取进程。这样一来,就可以避免创建和销毁进程的操作。但是线程池也存在问题:池子当中闲置的进程,同时也会消耗着系统资源,所以一般采用方案二。

方案二:使用线程来实现并发编程。原因是线程比进程更加的轻量,每一线程也能像进程那样执行一个任务(一段代码),也能够实现并发编程。在创建,销毁和调度方面消耗的资源也比进程要少一些。线程在Linux上也被称为轻量级进程(LWP light weight process)。

为什么线程说比进程更加的“轻”呢?

1.线程的重是因为它需要在系统资源当中申请和释放存在大的消耗。

2.进程是包含在线程当中的。一个进程和一个或者多个线程共用着相同的资源(内存+文件)。

3.创建线程只是在第一次创建时会消耗较大的资源,因为系统资源分配资源个进程是一个消耗较大的操作,等后续在这个进程当中创建和销毁线程时消耗的资源就低了,不必分配资源。

通过一个例子来理解这个问题。

把进程比做工厂,那么线程就是工厂当中的流水线。有A,B企业分别拥有两个生产效率相等的工厂且都只拥有一条生产线,这时两个企业都为了提高生产效率去进行扩建。A企业选择再建一个工厂含有一条生产线,B企业选择在工厂当中多建立一条生产线,对比可以发现:两家企业的这时候的生产效率是相同的,而A企业销毁的资源成本更大。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786029.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号