为什么引入进程和线程
在早期的计算机系统中单道批处理系统的程序是顺序执行,在内存中仅装入一道用户程序,独占系统的所有资源,只有在一个系统完成之后才允许装入另一个系统,这种方式浪费资源,系统运行效率低。
多道批处理系统:同时在内存中装入多个系统,让他们同时共享系统资源,并发执行,所以引入了进程的概念。
在80年代中期之前,进程一直是能拥有资源和独立调度的基本单位,后来人们提出了比进程更小的基本单位——线程,想提高程序并发执行的程度。
进程在并发执行时所需付出的时空开销:
- 创建进程:系统创建进程时,必须给其分配其必须的所有资源,如内存空间、I/O设备、以及相应的PCB。
- 撤销进程:撤销进程时必须对其所占的所有资源进行回收,再撤销PCB。
- 进程切换:对进程上下文切换时,需要先保留当前进程的CPU环境,设置新的选中的进程的CPU环境,花费不少处理机时间。
所以提出了线程:轻量级进程的概念。线程是调度和分配的基本单位,因为其拥有资源较少,当县城切换时,仅需保存和设置少量寄存器内容,切换代价远小于进程。
进程和线程的区别
指标 | 进程 | 线程 |
---|---|---|
定义 | 进程的两个属性:1.进程是可拥有资源的基本单位 2.进程同时是可独立调度和分配的基本单位 | 线程是调度和分派的基本单位 |
关系 | 因为每个进程都有自己的进程地址空间,所以每个进程之间都是独立的,进程之间的关系可以是父子关系 | 因为一个进程可以创建多个线程,多个线程除了有自己的一点资源外,都共享进程地址空间中的资源,所以线程之间是平等的,一个进程中只有一个主线程 |
拥有资源 | 进程PCB | 线程可以拥有的资源:线程ID、一组寄存器、栈、errno、信号屏蔽字、调度优先级 |
终止或崩溃时 | 进程终止时,其他进程不会受到影响,因为每个进程之间是独立的 | 一个线程崩溃时,其他线程会受到影响,因为一个线程如果崩溃,很可能会影响进程地址空间中的数据,这样其它线程也会受影响 |
切换 | 进程切换消耗大 | 线程切换消耗小 |
实现 | fork() | pthread_create() |
引入线程使系统的并发性更好,支持多处理机系统: 对传统的进程,即单处理进程,不管有多少个处理机,都只能在一个处理及上运行,但多线程进程,可以将一个进程中的多个线程分配到多个处理机上,使它们并发执行,加快了进程的完成。