Java中的进程与线程

一、进程

1、概念:
进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

2、组成:
进程一般由程序、数据结合和进程控制块三部分组成:
(1)程序:用于描述进程要完成的功能,是控制进程执行的指令集;
(2)数据集合:是程序在执行时所需要的数据和工作区;
(3)程序控制块:包含进程的描述信息和控制信息,是进程存在的唯一标志。

3、进程具有的特征:
(1)动态性:进程是程序的一次执行的过程,是临时的,有生命期的,是动态产生,动态消亡的;
(2)并发性:任何进程都可以同其他进行一起并发执行;
(3)独立性:进程是系统进行资源分配和调度的一个独立单位;
(4)结构性:进行由程序、数据和进程控制块三部分组成。

4、进程的PCB分配
每个PCB中存放了唯一标识进程的pid号,实际上就是一个int类型;

用于进程标识信息的进程标识符:
(1)内部标识符:由操作系统提供的唯一的进程序号;
(2)外部标识符:用户创建的由数字和字母组成的字符串,便于创建者使用该进程;

用于进程处理机状态信息:
(1)通用寄存器:供用户程序访问暂存信息;
(2)指令寄存器:存放下一条指令的地址;
(3)程序状态字:含有状态信息条码、执行方式、终端屏蔽标志;
(4)用户栈指针:存放过程和系统调用参数及调用地址,可以保存现场信息,下一次调度时可以继续执行。

用于进程调度信息
进程的优先级,进程的状态。

5、进程的主要状态有:就绪、阻塞、运行,三者之间的关系如图所示:
在这里插入图片描述

进程被替换的两种情况:
(1)第一种为主动情况,该进程执行完自己的任务主动将CPU让出或者该进程执行有阻塞操作,操作系统将会被挂起该进程执行新进程;
(2)第二种为被动情况,当一个进程被操作系统认为长时间占用CPU时会主动用另一进程替换正在运行的此进程;保证每个进程公平的占用CPU.

6、处理僵尸进程:
(1)僵尸进程
定义1:父进程未结束,子进程结束,并且父进程未获取子进程的退出数据;
定义2:一个进程的进程主题释放,而其PCB未释放。

(2)解决僵尸进程:
第一种方法:pid_t wait(int *stat):
阻塞运行:函数被调用后不会立即返回,等待某些条件的发生才会返回;Wait函数会阻塞运行;等待子进程技术才能返回,致使父进程阻塞到wait调用处;
wait函数的缺点:一个wait函数智能处理一个僵尸进程,在实际中无法预测到底有多少个僵尸进程,这就阻碍了我们能处理僵尸进程的能力,引入了异步处理方式:信号。

第二种方法:信号
绑定信号及其响应方式,只要有子进程结束的信号就通知父进程。

7、处理孤儿进程
(1)孤儿进程
指的是当父进程结束时子进程还未结束,这时候孤儿进程的父进程就变为守护进程init;
(2)模拟孤儿进程,可以看到被init守护进程回收管理

8、守护进程
(1)守护进程
在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,他们以root用户或者其他特殊用户(Apache和postfix)运行,并能处理一些系统级的任务;
守护进程是完全脱离终端在后台运行的,脱离终端的目的是不让在终端被显示;
(2)创建守护进程
1、首先调用umask()函数将文件模式创建屏蔽字置为0;
2.调用fork()然后父进程退出,这样做的目的:一是如果该守护进程作为一条简单的shell命令启动,那么父进程终止是使shell认为这条命令已经执行完成;二是子进程继承父进程的进程组ID,但是具有一个新进程的ID,这就保证了子进程不是一个组长进程。这是调用setid()的必要条件
3.调用setid()创建新的会话,这样使调用进程成为新会话的首进程,成为新进程的组长进程,没有控制终端
4.调用fork(),然后父进程退出,这样保证了进程不再是会话组长,从而不能打开一个新的终端
5.将当前工作目录改为根目录,调用chdir()实现
6.关闭不需要的文件描述符,可以通过getrlimit函数获得最大描述符值,关闭从该值到最大描述符值的所有文件描述符
7.打开“/dev/null”并且使其具有文件描述符0,1,2,这样任何一个试图通过标准输入、写标准输出或标准错误输出得到的库函数没有任何效果,因为守护进程不与终端关联。

9、进程的优点:
(1)顺序程序的特点:具有封闭性和可再现性;
(2)程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。

10、进程的缺点:
(1)操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。
(2)线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

11、多进程优点
(1)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
(2)通过增加CPU,就可以容易扩充性能;
(3)可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
(4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大

12、多进程缺点
(1)逻辑控制复杂,需要和主程序交互;
(2)需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
(3)多进程调度开销比较大;

二、线程

1、定义
线程:单个进程中执行中每个任务就是一个线程。
线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。
线程没有地址空间,现货层包含在进程的地址空间中。线程上下文只包含一个堆栈、一个寄存器、一个优先权,线程文本包含在他的进程的文本片段中,进程拥有的所有资源都属于线程。

2、 线程的优点
(1)它是一种非常”节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能会有较大的区别;
(2)线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;
(3)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;

3、线程的缺点
(1)调度时, 要保存线程状态,频繁调度, 需要占用大量的机时;
(2)程序设计上容易出错(线程同步问题)。

4、多线程的优点
(1)无需跨进程边界;
(2)程序逻辑和控制方式简单;
(3)所有线程可以直接共享内存和变量等;
(4)线程方式消耗的总资源比进程方式好;

5、多线程缺点
(1)每个线程与主程序共用地址空间,受限于2GB地址空间;
(2)线程之间的同步和加锁控制比较麻烦;
(3)一个线程的崩溃可能影响到整个程序的稳定性;
(4)到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
(5)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

三、进程与线程的区别:

(1)线程是进程中执行运算的最小单位,而进程是操作系统分配资源的最小单位;
(2)一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。
(3)进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆集)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
(4)调度和切换:线程上下文切换比进程上下文切换要快得多。

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值