一、线程、进程概念:
进程:是程序的一次运行活动,是系统资源分配和调度的一个独立单位,有独立的地址空间和系统资源。
线程:“轻量级进程”,是进程的一个实体,是CPU调度的基本单位。多个线程共享同一个进程的资源。
二、引入线程的好处
(1)线程占用资源要比进程少的多
(2)创建一个新的线程花费的代价小
(3)切换线程方便
(4)提高并发性
三、多线程
多线程举例:比如用浏览器,同时进行浏览网页、播放视频、下载资源、听音乐等操作
多线程缺点:
- 多线程比多进程成本低,不过性能也更低
- 一个线程的崩溃可能影响到整个程序的稳定性
- 线程多了之后,线程本身的调度也麻烦,需要消耗较多的CPU
- 无法直接获取系统的资源,总体能够达到的性能上限有限制
- 线程之间的同步和加锁控制比较麻烦
四、 多进程
多进程举例:比如同时运行QQ、微信、截图工具、视频播放器等
多进程优点:
- 每个进程互相独立,子进程崩溃不影响主程序的稳定性
- 通过增加CPU,就可以容易扩充性能
- 进程能直接获取系统的资源,总体能够达到的性能上限非常大
五、同一进程的线程共享哪些资源?
a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
c. 局部静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
d. 文件等公用资源 这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
六、线程独享的资源?
a. 栈 栈是独享的
b. 寄存器 这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC
c. 线程ID
七、并发
并发是把CPU运行时间划分成若干个时间段,每个时间段再分配给各个线程执行,当一个线程在运行时,其它线程处于挂起状。从宏观角度是同时进行的,但从微观角度并不是同时进行。
CPU根据线程调度算法来切换线程。当正在执行的一个线程需要进行IO操作或者需要访问内存的时候,CPU完全可以放弃该线程,转而调度线程就绪队列上的其他线程,被放弃的线程则进入阻塞状态,IO操作或者访问内存操作结束之后,该线程可以进入线程就绪队列上。
典型的线程调度算法:(1) FIFO算法。在非抢占式系统中,所有的线程构成一个先进先出队列,最先进入队列的线程获得CPU,等到放弃处CPU时,又回到队列尾部,下一个线程继续执行。若有新的线程进来,则添加到队列尾部。(2) 时间片轮转调度算法。(3) 优先级调度算法。
八、并行
并行是同一时刻当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,是真正意义上的不同线程在同一时刻同时执行。