进程和线程的区别,进程间如何通讯,线程间如何通讯

        线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或者是在各个线程之间作切换工作时,负担要比进程小得多,也正因如此,线程被称为轻量级进程。

        进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的,系统运行一个程序是一个进程从创建、运行到消亡的过程。简单说,一个进程就是一个执行中的程序,他它在计算机中一个指令接着一个指令的执行着。每个进程还占有某些系统资源如CPU时间,内存,文件,io设备的使用权等。

       进程和线程最大的不同在于各进程是独立的,而线程不一定,统一进程中的线程极有可能会相互影响,另一个角度说,进程是属于操作系统的范畴,主要是一段时间内,可以同时执行一个以上的程序,而线程是在统一程序内几乎同时执行一个以上的程序段。线程执行开销小,但是不利于资源管理和保护,而进程相反。

 

       

由图可知,一个进程可以有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器、虚拟机栈和本地方法栈。

引申一下,为何程序计数器是私有的,

程序计数器主要有两个作用:

1、字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制。

2、在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿。

因此:程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。

 

进程间的通信方式:

1、管道/匿名管道:用户具有亲缘关系的父子进程间或者兄弟进程的通信

2、有名管道:匿名由于没有名字,只能亲缘关系的进程间通信,为了克服这个缺点,提出有名管道,有名管道严格遵循先进先出,以磁盘文件的方式存在,可以实现本机任意两个进程通信。

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

4、消息队列:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识,管道和消息队列的通信数据都是先进先出的原则,于管道不同的是消息队列存放在内核中,只有在内核重启或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要先进先出的次序读取,也可以按消息类型读取,客服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺陷

5、信号量:信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步,这种通信方式主要用于解决与同步相关的问题并避免竞争条件。

6、共享内存:使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对

7、套接字:此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双向通信的端点,简单说就是通信的两方的一种约定。用套接字中相关函数来完成通信过程。

线程间的同步方式:

       线程同步是两个或多个贡献关键资源的线程的并发执行。应该同步线程避免关键的资源使用冲突,操作系统一般有下面三种线程同步方式:

      1、互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问,比如java的synchronized关键词和lock都是这种机制。

     2、信号量:允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

     3、事件:wait/notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值