【多线程】初识进程和线程

       

b50ffcc051264df7b69b2c41c025d66f.jpeg

        💐个人主页:初晴~

📚相关专栏:多线程 / javaEE初阶


前言

     在我们之前编写的所有代码,都只能用上一个核心。众所周知,现在大多数CPU都有多个核心,但此时,无论如法优化程序,最多也只有一个CPU核心在工作,其它的核心都空闲着,就容易出现所谓一核有难,多核围观的窘况。这时可以通过一些代码,把多个CPU核心都利用起来,提高运行效率,这样的编程就被称为“并发编程”。而提到并发编程就离不开多进程编程和多线程编程了。这篇文章就让我们先来认识一下进程与线程吧👀

2c994905f06d4cbe94a4ad7b8bfe688c.png

一、进程

1、概念

        进程是计算机中正在运行的程序的实例。它是操作系统进行资源分配和调度的基本单位。每个进程都有自己的内存空间代码数据执行状态。进程可以独立运行,相互之间不会干扰。操作系统可以同时运行多个进程,通过分配时间片轮流执行它们,从而实现多任务处理。进程可以与其他进程进行通信和协作,共享资源和数据。

8cc0ee12a5eb4940b5c776445036b342.png

像上图中显示的就是正在运行的程序,也就是一个个系统分配的进程

2、特性

进程的特性:

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块(PCB)三部分组成;

3、组织形式

一个可执行程序,运行的时候,操作系统就会创建进程,给这个程序分配各种系统资源(CPU,内存,硬盘,网络带宽等……),所谓的进程,在系统中是通过PCB(process control block)这样的结构体来描述的,通过双显链表的形式来组织,简单来说就是“先描述,再组织”的形式

描述进程:使用PCB结构体描述进程的各种属性

操作系统会进行两步:

  • 为该进程创建对应的PCB对象
  • 将该进程的代码和数据加载在内存中

PCB就相当于是进程属性的集合,主要描述了以下属性:

  • 标示符PID:    描述本进程的唯一标示符,用来区别其他进程
  • 状态:    任务状态,退出代码,退出信号等。
  • 优先级:    相对于其他进程的优先级。
  • 程序计数器`:    程序中即将被执行的下一条指令的地址。
  • 内存指针:    包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据:    进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息:    包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息:    可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 组织进程:通过双显链表,将各进程的PCB串联起来

通过PCB,操作系统就可以更好地去管理各个进程,操作时不需要获取整个进程,只需获取描述进程的PCB对象,就可以找到相对应的代码与数据,从而大幅节省空间开销,提高效率。

二、线程

        虽然多进程方式能够实现并发编程,但是效率要求的提高,就希望有更好的方式来实现。多进程编程最大的问题就是太“重”了,创建进程和销毁进程的空间开销与时间开销都比较大,一旦需求场景中需要频繁创建销毁进程时,效率就非常低了。为了解决进程开销较大的问题,就发明了相对轻量化的线程

线程比进程更加轻量化,主要是因为创建线程,省去了“分配资源”的过程,销毁线程,也省去了“释放资源”的过程。

一旦进程创建,同时就会创建好第一个线程,并分配好系统资源,后续该进程创建更多线程时,就不需要再分配资源了。

        举个例子,假设系统要执行的任务是吃掉100块肉,这时系统就会创建一个进程,并为这个进程分配一定资源,我们这里看作是为任务执行而开辟了一个“房间”,然后这个进程会创建一个线程“路飞”来真正去完成工作,也就是说实际上真正完成工作的是线程,进程是为线程工作提供了一定资源,图中类比为了一个房间

fd20369675ff4fd084370bfc4189f666.png

        这时我们就有两种方法来提高工作效率,第一种,系统在开辟一个“房间”,这时每个房间要吃的肉的数量就变少了,又因为每个进程的工作是独立且并行的,每个进程的工作量减少,总的工作效率也就提升了,这就是多进程编程的原理:

9449dc61005b42d08263fb923dd30199.png

        但是,创建一个新的“房间”的开销是很大的,所以,为了提高效率,我们可以在一个房间里放入多个“路飞”来完成工作,这些“路飞”在同一个“房间”工作,共用同一份资源,同时去吃桌上的肉,这样每个“路飞”所需要吃的肉大幅减少,又因为他们可以看作是同时去吃的,总的效率就能提升很多了,这便是多线程编程的原理:

ca085ed24a7d4776bdbde08e64d423b7.png

但是,只有靠近桌子的“路飞”才能吃上肉,桌子的大小是有限的(进程资源有限),随着“路飞”数量的增加,可能会有大量“路飞”(线程)靠近不了桌子(分配不到资源),从而无法进行工作,造成线程的闲置,这时,再一味地增加线程就不能够提高效率了,并且由于创建线程也是有开销的,此时过多的线程反而可能会降低运行效率。

46666263f2414fe3b8d862fe4a22fd82.png

因此,线程并不是越多越好的,在使用是一定要控制好线程数量


三、进程与线程区别与关系

1、进程包含线程

一个进程可以有一个线程或者多个线程,但不能没有线程

2、进程是系统资源分配的基本单位,线程是系统调度执行的基本单位

3、同一份进程中的线程共用一份系统资源(内存,硬盘,网络带宽等……)

内存资源就是代码中定义的变量与对象,多个线程是可以是可以共用同一份变量的

4、线程是当下实现并发编程的主流方式,通过多线程可以更好地利用多核CPU,但线程并不是越多越好的,线程数目达到一定量后,已经充分利用了多核CPU的性能,此时在一味地增加线程数量,不但无法提高运行效率,反而可能还会影响效率,因为线程调度也是需要消耗资源的。

5、多个线程之间可能会互相影响,一个线程抛出异常会影响其它线程的正常运行,这会导致各种线程安全问题

6、多个进程之间,一般不会互相影响,一个进程崩了也不会影响其它进程,也被称为“进程的隔离性”


总结

总之,比起以前写的程序,多线程编程的方法能更好地发挥多核CPU的性能,大幅提高运行效率,在将来工作中也是非常重要的。本篇文章我们主要简单介绍了进程与线程的关系与区别

那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。作者还是一个萌新,如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

e1fd69ccbcb64f59b2aaed6be3f8695f.png

 

 

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值