线程是CPU调度的基本单位。
1.线程组成
- 线程ID:线程标识符
- 当前指令指针
- 寄存器集合:存储单元寄存器的集合
- 堆栈
2.线程与进程的关系
3.线程的特性和优点
特性
同一进程的各个线程共享进程拥有的资源。(线程和进程的关联关系)
优点
为什么有了进程还需要线程?
- 进程间并发,需要保存/恢复进程运行环境,还需要切换内存地址空间,开销成本很大。
- 引入线程机制后,线程并发不需要切换进程运行环境和内存地址空间(因为进程内的线程共享进程的资源),只需要切换线程私有数据,开销成本很小。
引入线程前,进程既是资源分配的基本单位,也是调度的基本单位。
引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。
4.线程同步
https://blog.csdn.net/zxx901221/article/details/83006453
4.1 临界区
在讲临界区之前,我们提下 临界资源这个概念,
概念解释
:通过对多线程的串行化来访问公共资源(同一进程内公共资源)或一段代码,速度快,适合控制数据访问。
优点
保证在某一时刻只有一个线程能访问数据的简便办法
缺点
虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不能用来同步不同进程中的线程。
4.2 互斥量(Mutex)
概念解释
为协调共同对一个共享资源的单独访问而设计的。
互斥量跟临界区很相似,比临界区复杂,互斥对象只有一个,只有拥有互斥对象的线程才具有访问资源的权限。
类似于Java中对象的锁机制;
优点
使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,
而且可以在不同应用程序的线程之间实现对资源的安全共享。
缺点
【1】互斥量是可以命名的,也就是说它可以跨越进程使用,所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。
因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
【2】互斥量只支持同一时刻,保证一个线程可以访问临界资源,但是做不到 同一时刻 ,要求n个线程同时
访问临界资源的需求(1<n<=K,K人为规定)
4.3 信号量
概念解释
为控制一个具有有限数量用户资源而设计。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
互斥量是信号量的一种特殊情况,当信号量的最大资源数=1就是互斥量了。
优点
适用于对Socket(套接字)程序中线程的同步。(例如,网络上的HTTP服务器要对同一时间内访问同一页面的用户数加以限制,只有不大于设定的最大用户数目的线程能够进行访问,
而其他的访问企图则被挂起,只有在有用户退出对此页面的访问后才有可能进入。)
缺点
核心操作P-V分散在各用户程序的代码中,不易控制和管理,一旦错误,后果严重,且不易发现和纠正。
4.4 事件
概念解释
通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较