进程和线程的区别与联系
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、并发、并⾏、异步
并发:宏观上——在⼀段时间内同时运⾏多个程序
并⾏:需要硬件⽀持,多流⽔、多核处理、分布式计算系统
异步:程序不是⼀次性执⾏完毕的,⾛⾛停停、以不可知的速度向前推进。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。