进程与线程

1.进程与线程

进程:具有独立功能的程序关于某个数据集合上的一次运行活动。资源分配的基本单位
线程:进程的一个实体。cpu调度的基本单位
比喻:一列火车是一个进程,火车的每一节车厢是线程。

2.进程与线程的联系

①一个线程只能属于一个进程,一个进程可以有多个线程;
②系统资源分配给进程,同一进程的所有线程共享该进程的所有资源;
③真正在处理机上运行的是线程;
④不同进程的线程间利用消息通信的方式实现同步。

3.进程与线程的区别

①调度:线程是系统调度和分配的基本单位,进程是作为拥有系统资源的基本单位;
②并发性:进程之间可以并发执行,同一进程的多个线程时间亦可以并发执行;
③拥有资源:进程是拥有资源的独立单位,线程不拥有资源,但可以访问隶属于进程的资源;
④系统开销:创建和撤销进程的开销更大;进程拥有独立的地址空间,一个进程的崩溃不会影响其他进程;线程拥有自己的堆栈和局部变量,没有独立的地址空间,因此进程里的一个线程崩溃会导致其他线程均崩溃。

4.进程间通信方式

进程间通信方式有很多,网上一说有十几种。面试的时候说上以下几种差不多:

  1. 管道:半双工的通信方式,数据只能单向流动,且只能在有亲缘关系(父子进程或兄弟进程)的进程间使用;
  2. 命名管道:FIFO,半双工的通信方式,但允许在无亲缘关系的进程间通信;
  3. 消息队列:消息的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点;
  4. 信号量:是一个计数器,用于控制多个进程间对共享资源的访问;
  5. 信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  6. 共享内存:映射一段能被其他进程访问的内存,这段内存由一个进程创建,但多个进程都可以访问;
  7. 套接字

5.线程间通信方式

多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。就是多个线程在操作同一份数据时, 避免对同一共享变量的争夺。

  1. 锁机制:包括互斥锁、条件变量、读写锁互斥锁提供了以排他方式防止数据结构被并发修改的方法。
    读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
    条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
  2. 使用全局变量:主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile
  3. 信号量机制(Semaphore):Java中的Semaphore
  4. 信号机制(Signal):类似进程间的信号处理。Object类的wait()、notify()和notifyAll()方法

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

6.什么时候用多线程?什么时候用多进程?

1)需要频繁创建销毁的优先用线程
这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的
2)需要进行大量计算的优先使用线程
所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。
这种原则最常见的是图像处理、算法处理。
3)强相关的处理用线程,弱相关的处理用进程
什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。
一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。
当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。
4)可能要扩展到多机分布的用进程,多核分布的用线程
原因请看上面对比。

7.管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

image-20190415170814548

匿名管道

image-20190415170840334

管道的特点

1.管道只允许具有血缘关系的进程间通信,如父子进程间的通信。

2.管道只允许单向通信。

3.管道内部保证同步机制,从而保证访问数据的一致性。

4.面向字节流

5.管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值