进程解决了并发编程问题。然而由于进程消耗资源多且速度慢(进程重,重在"资源分配/回收"上)。
线程应运而生,线程也叫做轻量级进程,在解决并发编程问题的前提下,让创建、销毁、调度的速度更快一些。
问题一:一味只增加线程数量,效率一定能提高么?
答案:不能。其一,线程数量过多,CPU核心数量有限,不少的开销反而浪费在线程调度上了。其二,创建太多线程也会导致资源耗尽,导致别的进程用不了了。(这里耗尽的资源是指CPU、内存、带宽这样的资源)
- 进程中包含一条或多条线程;
- 进程是系统分配资源的最小单位,线程是CPU调度的最小单位;
- 进程之间不能共享资源,进程中的线程之间共享进程的所有资源;
- 线程的创建、销毁、调度效率比进程更高,并且有自己独立的执行任务。
补充:
- 线程也是通过PCB来描述的,一个进程里面可能是对应一个PCB,也可能是对应多个PCB。之前在进程中介绍的PCB中的状态,上下文,优先级以及记账信息。每个线程也有自己独立的并且各自记录各自的。但是同一个进程里的PCB之间,pid是一样的,内存指针和文件描述符也是一样的。
- 只有启动第一个线程的时候开销比较大。后续线程可以复用第一个线程的资源,使得开销较小。
问题一:什么时候会出现安全问题?只有多线程有安全问题,多进程没有么?
- 当多个执行流访问同一个共享资源的时候。
- 线程模型天然就是资源共享的,多线程争抢同一个资源,同一个变量,非常容易触发安全问题。进程模型天然是资源隔离的,不容易触发,但是进行进程间通信的时候,多个进程访问同一个资源时可能会出现安全问题。
问题二:为什么会有线程安全问题?
答案:罪魁祸首是抢占式执行。操作系统调度线程的时候,抢占式执行。具体哪个线程先被调度,哪个线程后被调度是不确定的,取决于操作系统调度器具体实现策略。
虽然有优先级,但是在应用程序层面上无法修改。从应用程序代码的角度看到的效果就好像是线程之间的调度顺序是随机的,然而内核里本身并非是随机,但是干预因素太多,并且应用程序这一层也无法感知到细节,就只能认为是随机的了。
进程是操作系统资源分配的基本单位,
线程是操作系统调度执行的基本单位,
每个线程都是独立在CPU上调度的。