进程和线程的区别和相关问题

[TOC]

概念

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念。

· 线程:是进程的一个执行单元,是独立运行的基本单位。

区别

拥有资源

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

•开销

由于创建或撤销进程时,系统都要为之分配或回收资源。线程切换时只需保存和设置少量寄存器内容,开销很小。

· 调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程

中的线程时,会引起进程切换。

· 通信方面

进程有独立的地址空间,线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。

进程的内存空间

内核态内存空间、用户态的堆栈(一般8M,从高地址向低地址增长)、数据段、进程代码段

进程间通信方式

进程间通信方式:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket等

  • 管道:无名管道, 半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。只能用于父子进程和兄弟进程。
  • FIFO:也称为命名管道,去除了管道只能在父子进程中使用的限制。
  • 消息队列

1.消息队列存放于内核中,可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;

2.避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;

3.读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。

  • 信号量是一个计数器,用于实现进程间的互斥与同步。信号量基于操作系统的 PV 操作。每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
  • 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。因为多个进程可以同时操作,所以需要进行同步。信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
  • 套接字:与其它通信机制不同的是,它可用于不同机器间的进程通信。

进程同步方式?

1.临界区

对临界资源进行访问的那段代码称为临界区。

2.同步与互斥

同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。

互斥:多个进程在同一时刻只有一个进程能进入临界区。

3.信号量:

信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。

down : 如果信号量大于 0 ,执行 -1 操作;如果信号量等于 0,进程睡眠,等待信号量大于 0;

up :对信号量执行 +1 操作,唤醒睡眠的进程让其完成 down 操作。

线程共享和线程私有的

线程共享的有:进程代码段、进程共有数据等

线程私有的:线程ID、寄存器的值、线程的栈

进程的状态

就绪,运行,阻塞。

只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。运行缺少资源会变为阻塞。