进程、线程
1、什么是进程、线程
进程是一个程序被加载到内存执行的过程,它是一个动态的概念。线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元。进程是操作系统分配资源的最小单位,线程是操作系统调度执行的最小单位。打个比喻,操作系统是好像一个大工厂,工厂里面的一条条流水线就是一个个的进程,然后流水线上的工人负责整个流水作业的全部或者一小部分,这就叫线程。进程是真正的“打工人”,干活的实体。
2、进程和线程的区别
- 进程有自己独立的地址空间(每个进程都有拥有4GBytes的虚拟地址空间),多个线程共用同一个地址空间。
- 同一进程内的每个线程共享代码段(.text),堆区(heap),全局数据区(.data.bss),文件描述符表。
- 同一进程内的每个线程独享自己的栈、寄存器。
3、进程线程的特点
-
进程
- 进程拥有自己的地址空间,各进程间相互独立,一个进程挂死,不会影响到其他进程
-
线程
-
线程占更小的系统资源,线程的上下文切换比进程要快的多。
上下文切换:进程 / 线程分时复用 CPU 时间片,在切换之前会将上一个任务的状态进行保存,下次切换回这个任务的时候,加载这个状态继续运行,任务从保存到再次加载这个过程就是一次上下文切换。
-
线程启动速度快,退出也快,对系统资源的冲击小。
-
一个进程内的某一个线程挂掉,那么整个进程就会挂掉。
-
4、进程间的通讯方式
- 管道pipe。半双工,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,常见于父子进程。
- 有名管道FIFO。半双工,数据只能单向流动,允许无亲缘关系进程间的通信。
- 消息队列MessageQueue。消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,防止多进程访问共享资源时产生竞争。是进程同步的一种手段。
- 套接字Socket:用于不同机器间的进程通信,网络通信少不了它。
- 信号 Signal: 段错误、kill -9 的时候就是这种信号。
5、线程间通信方式
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
- 锁机制:包括互斥锁、条件变量、读写锁
- 互斥锁提供了以排他方式防止数据结构被并发修改的方法,常用于多线程间对共享资源的访问保护。
- 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
- 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
- 信号量机制(Semaphore):信号量既是是进程同步的一种手段,也是线程同步的一种手段
锁一起使用。 - 信号量机制(Semaphore):信号量既是是进程同步的一种手段,也是线程同步的一种手段
- 信号机制(Signal):类似进程间的信号处理。线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。