进程和线程的区别与联系

1、进程和线程的区别与总结

根本区别:进程是操作系统资源分配的基本单位,线程是处理器(CPU)任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序的上下文)程序之间的切换会有较大的开销;

                   同一类线程共享代码和数据空间,每个线程都有自己独立运行的栈和程序计数器(PC),线程之间的切换开销小

包含关系:一个进程有多个线程,执行过程由多个线程共同完成

内存分配:同一个进程的线程共享本进程的地址空间和资源;进程之间的地址空间和资源是相互独立的;

影响关系:某进程挂掉,在保护模式下不会对其他进程产生影响;但一个线程奔溃后整个进程都会死掉;多进程比多线程健壮;

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由                    应用程序提供多个线程执行控制,两者均可并发执行。

2、堆和方法区

堆和线程是所有线程共享的资源,其中:

堆是进程中最大的一块内存,主要用于存放新创建的对象(所有的对象都在这里分配内存)

方法区主要存放(已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据)

3、多线程、多进程

多进程:操作系统中同时运行的多个程序

多线程:在同一个进程中同时执行的多个任务;让CPU的使用效率提升,并不能提升运行速度,5个多核都占满

               看上去多线程在同时执行,是因为切换速度很快,实际上:同一时刻CPU只能执行一个线程

4、java中的多线程:

主线程,垃圾回收线程(后台线程)等

在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程

Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程

5、协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

一个线程包含多个协程、协程是异步的、协程能保留上次调用时的状态

6、进程的通信方式

  • 管道(pipe)

管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

Linux下一切皆文件这我们必须牢记,所以管道就是一份文件,进程A能看到进程B也能够看到,同时进程A往管道中写数据进程B就可以从另一端读数据了。

管道又分为匿名管道和命名管道,匿名管道用pipe()创建,只能用于有亲缘关系的进程间通信,而命名管道则是用于任意进程。

命名管道的特点:1、适用于任意进程2、面向字节流3、半双工通信(当然想要实现全双工通信,只要两个管道就可以了)4、生命周期随进程5、内置同步与互斥机制。

  • 有名管道 (namedpipe)

有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

  • 信号量(semaphore)

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

信号量——没有通信,可理解为:一个计数器加上等待队列,它主要侧重了同步于互斥,因为有时候多个进程同时访问临界资源就会产生死锁,那么就需要信号量记录可申请的资源的数量,每申请一次信号量减1,用完释放就加1,等待队列就是资源被申请完了(信号量为0),在申请就会信号量<0,那么此时就会将进程加入等待队列,一旦有资源释放,就可以立马申请到。

信号量的特点就是同步于互斥!!!
其实我个人觉得信号也应该属于进程间通信的一种方式,为什么呢?

因为进程控制也是进程间通信的目的之一,那一个进程给另外一个进程发送个9号信号就可以杀死这个进程。

  • 消息队列(messagequeue)

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

消息队列——链表,进程A可以向队列中写数据(写满则不能写了,因为消息队列是固定的),队列中有数据了进程B就可以开始读数据了,读完了数据就不能读了(这也就能说明消息队列面向数据报)

消息队列的特点:1、适用于任意进程2、面向数据报3、全双工通信(只要进程有读写权限就可以双向通信)4、生命周期随内核5、内置同步与互斥机制。

  • 信号 (sinal)

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

  • 共享内存(shared memory)

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

共享内存就是一块内存,我们知道内存有随机访问的优势,所以共享内存就成为了进程间通信最快的方式

具体通信原理就是这一块物理内存在映射的时候会映射不同的虚拟地址空间,不同的虚拟地址空间就代表着不同的进程那么就可以让多个进程都看到这块内存,然后进行读写操作。

共享内存的特点:1、适用于任意进程2、全双工通信3、生命周期随内核

  • 套接字(socket)

套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。

7、线程间的通信方式

  • 锁机制:包括互斥锁、条件变量、读写锁

互斥锁——提供了以排他方式防止数据结构被并发修改的方法。 
读写锁——允许多个线程同时读共享数据,而对写操作是互斥的。 
条件变量——可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

wait/notify 等待

Volatile 内存共享

CountDownLatch 并发工具

CyclicBarrier 并发工具

  • 信号量机制(Semaphore)

包括无名线程信号量和命名线程信号量。

  • 信号机制(Signal)

类似进程间的信号处理。

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

8、并发、并行、异步

并发:宏观上——在一段时间内同时运行多个程序

并行:需要硬件支持,多流水、多核处理、分布式计算系统

异步:程序不是一次性执行完毕的,走走停停、以不可知的速度向前推进。

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值