← 返回目录

线程基础

第 83 / 230 卷日期:

8、进程的阻塞

找到被阻塞进程的标识符对应的PCB 如果该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行;

将该 PCB 插入到等待队列中,将处理机资源调度给其他就绪进程

9、进程的唤醒

在该事件的阻塞队列中找到相应进程的 PCB;

将其从阻塞队列中移出,并置其状态为就绪状态;

把该 PCB 插入到就绪队列中,等待调度程序调度;

线程基础

1、什么是线程?

线程是“轻量级线程”,是进程中的一个实体,是程序执行的最小单元,也是被系统独立调度和分配的基本单位。

线程是进程当中的一条执行流程,同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。

2、线程的特点

线程是一个“轻量级线程”,一个进程中可以有多个线程,线程不拥有系统资源,但是也有PCB,创建线程使用的底层函数和进程一样,都是clone

各个线程之间可以并发执行同一个进程中的各个线程共享该进程所拥有的资源。

进程可以蜕变成线程;

实际上,无论是创建进程的fork,还是创建线程的pthread_create,底层实现都是调用同一个内核函数 clone。

  1. 如果复制对方的地址空间,那么就产出一个“进程”;
  2. 如果共享对方的地址空间,就产生一个“线程”。

Linux内核是不区分进程和线程的, 只在用户层面上进行区分。所以,线程所有操作函数 pthread_*是库函数,而非系统调用。

3、进程和线程的比较

进程是资源(包括内存、打开的文件等)分配的单位,线程是 CPU 调度的单位;

资源:进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少的能保证运行的资源,比如寄存器和栈),但线程可以访问隶属进程的系统资源。

调度:线程切换的代价远低于进程,在同一个进程中,线程的切换不会引起进程切换,而从一个进程中的线程切换到另一个进程中的线程中,会引起进程切换。

并发:进程可以并发执行,而一个进程中的多个线程之间也能并发执行,甚至不同进程中的线程也能并发执行,从而使得操作系统拥有更好的并发性,提高了系统资源的利用率和系统的吞吐量。

独立性:每个进程都拥有独立的地址空间和资源、除了共享全局变量,不允许其他进程访问。某进程中的线程对其他进程都不可见,同一进程中的不同线程是为了提高并发性以及进行相互之间的合作而创建的,它们共享

管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;

线程的终止时间比进程快,因为线程释放的资源相比进程少很多;

同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换

的时候要把页表给切换掉,而页表的切换过程开销是比较大的;

由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;

所以,不管是时间效率,还是空间效率线程比进程都要高。

4、线程的状态:

执行状态:线程获得处理机正在执行就绪状态:线程已经具备执行条件,只需要获得CPU就可以执行

阻塞状态:线程在执行中因事件受阻而处于暂停状态

5、线程的实现

(1)用户线程(ULT)

用户线程是在用户空间实现的线程,不是由内核管理的线程,整个线程管理和调度,操作系统是不直接参与的,而是由用户级线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等。

优点:

  1. 线程切换不需要切换到内核空间中,节省了模式切换的开销。
  2. 调度算法可以是进程专用的,不同的进程可根据自身的需要,对自己的线程选择不同的调度算法。
  3. 用户级线程的实现与操作系统平台无关,对线程管理的代码是属于用户程序的一部分。

缺点:

  1. 由于不由操作系统调度,一旦用户线程发起系统调用而阻塞,那么此进程下用户线程都无法运行;
  2. 一旦某个用户线程正在运行,只有当其交出CPU执行权,其他用户线程才可以运行,无法被打断,因为只有操

作系统才有权限打断运行,但是操作系统不直接参与调度;

  1. 由于时间片分配给进程,故与其他进程比,在多线程执行时,每个线程得到的时间片较少,执行会比较慢;

(2)内核线程(KLT)

由操作系统管理、调度,其对应的TCB是存放在内核中,这样线程的创建、终止和管理都是由操作系统负责。

优点:

  1. 当一个内核线程发起系统调用阻塞时不会影响其它内核线程的执行;
  2. 分配给线程,多线程的进程获得更多的 CPU 运行时间;

缺点:

  1. 在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息,如 PCB 和 TCB;
  2. 线程的创建、终止和切换都是通过系统调用的方式来进行,因此对于系统来说,系统开销比较大;

(3)轻量级线程 (LWP):

全站分卷索引 · 230 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(计算机基础篇)
  2. 2DNS
  3. 3DNS解析过程
  4. 4递归查询和迭代查询
  5. 5HTTP特性与简述
  6. 6HTTP版本演变
  7. 7HTTP/2
  8. 8HTTP1.1协议的性能问题
  9. 9兼容HTTP1.1
  10. 10二进制帧
  11. 11并发传输
  12. 12服务器主动推送资源
  13. 13总结
  14. 14HTTP/3
  15. 15HTTP/2的缺点
  16. 16QUIC协议的特点
  17. 17HTTP/3协议
  18. 18HTTP缓存
  19. 19协商缓存
  20. 20HTTPS
  21. 21HTTPS的特点
  22. 22非对称加密
  23. 23摘要算法+数字签名
  24. 24数字证书
  25. 25证书信任链
  26. 26HTTPS是怎么建立连接的
  27. 27TCP与UDP头部格式
  28. 28TCP
  29. 29列举TCP选项
  30. 30TCP三次握手
  31. 31为什么需要三次握手?
  32. 32什么是半连接队列
  33. 33什么是SYN攻击
  34. 34为什么挥手需要四次
  35. 35TIME_WAIT 过多有什么危害?
  36. 36TCP的滑动窗口
  37. 374. 程序是如何表示发送方的四个部分的呢?
  38. 386. 接收窗口和发送窗口的大小是相等的吗?
  39. 391. 慢启动
  40. 403. 拥塞发生
  41. 414. 快速恢复
  42. 42IP基础
  43. 43IP地址
  44. 44在浏览器中输入URL并按下回车之后会发生什么
  45. 45TCP 抓包实践
  46. 46TCP连接与断开优化
  47. 47TCP内核参数
  48. 48主动方的优化
  49. 49被动方的优化
  50. 50Linux是如何收发网络包的
  51. 51收发流程
  52. 52面试题
  53. 53TCP/IP四层网络模型
  54. 54五层网络体系结构
  55. 55HTTP响应报文
  56. 56HTTP常见字段
  57. 57什么是TCP粘包问题?如何解决TCP粘包问题?
  58. 58UDP会不会产生粘包问题呢?
  59. 59请求报文
  60. 60时间消耗
  61. 61HTTP缓存有几种
  62. 62HTTP1.0和HTTP1.1的区别?
  63. 63HTPP1.1和HTTP1.0有什么区别
  64. 64HTTP/3
  65. 65HTTPS是如何建立连接的
  66. 66DNS是什么
  67. 67递归查询和迭代查询
  68. 68TCP与UDP的区别
  69. 69TCP和UDP分别在什么场景使用?
  70. 70三次握手的过程
  71. 71Keep-Alive的优缺点
  72. 72CDN的工作流程
  73. 73Session的工作原理
  74. 74TCP重传机制是怎么实现的?
  75. 75什么是SS0
  76. 76HTTP优化方案
  77. 77浏览器地址栏输入URL回车后涉及到的流程
  78. 781.5 浏览器发送HTTP/HTTPS请求到web服务器
  79. 79SYN攻击
  80. 80操作系统
  81. 81操作系统的功能
  82. 82进程和线程
  83. 83线程基础
  84. 84进程调度
  85. 85进程调度方式
  86. 86进程通信
  87. 87消息传递(消息队列)
  88. 88信号量
  89. 89信号
  90. 90线程通信
  91. 91多线程
  92. 92进程通信
  93. 93消息队列
  94. 94信号
  95. 95守护进程
  96. 96互斥与同步
  97. 974. 互斥锁解锁
  98. 983. 处理方法
  99. 99读写锁
  100. 1002. 销毁读写锁
  101. 1014. 写锁定
  102. 1021. 创建条件变量
  103. 1034. 阻塞线程
  104. 104信号量
  105. 1054. V操作
  106. 1062. 读者-写者问题
  107. 107存储系统
  108. 108虚拟内存
  109. 109内存分段
  110. 110内存分页
  111. 111虚拟内存
  112. 112文件系统
  113. 1135. 文件访问
  114. 114目录
  115. 1154. 目录操作
  116. 1163. 目录的实现
  117. 1177. 虚拟文件系统
  118. 1184. 文件系统性能
  119. 119磁盘编址
  120. 120三层抽象
  121. 121外设管理
  122. 122Linux
  123. 123select/poll/epoll的区别和联系
  124. 124Linux 内存管理
  125. 125Linux虚拟内存
  126. 126Linux 信号
  127. 127Linux设计
  128. 1283. 各种IO模型的比较
  129. 129Linux网络
  130. 130Linux中的软链接和硬链接有什么区别?
  131. 131什么是中断和异常
  132. 132信号和信号量有什么区别
  133. 133Linux中如何查看一个进程
  134. 134进程、线程的区别?
  135. 135进程之间的通信方式
  136. 136如何解除死锁
  137. 137分段和分页的区别
  138. 138IO多路复用
  139. 139MySQL表连接
  140. 140过滤条件
  141. 141执行一次update语句,发生了什么
  142. 142用户账号存储
  143. 143用户账号删除
  144. 144索引
  145. 145索引有哪些类别
  146. 1462. 按照存储分类
  147. 1475. 按照字段个数分类
  148. 148索引区分度
  149. 149索引什么时候会失效
  150. 150事务的四大特性ACID
  151. 151并行事务会出现什么问题
  152. 152幻读是如何解决的
  153. 153事务隔离的实现
  154. 154读已提交是怎么实现的
  155. 155锁
  156. 1561、全局锁
  157. 1573、行级锁
  158. 158锁的划分
  159. 1592.、程序员角度
  160. 160Innodb使用表锁还是行锁
  161. 161什么是binlog
  162. 162执行引擎
  163. 163MySQL常见问题
  164. 1642. 事务
  165. 1653. 脏页
  166. 1664. 表结构
  167. 1676. 查询效率
  168. 168MySQL分库分表
  169. 169垂直分表
  170. 170水平分库
  171. 171分库分表的问题
  172. 172数据库排序思路
  173. 173MySQL主从复制
  174. 1745. 主从复制模式
  175. 175面试题
  176. 176执行一条select语句,发生了什么?
  177. 177你对关系范式有哪些了解
  178. 178数据库
  179. 179Redis基础
  180. 180Redis单线程为什么还这么快
  181. 181Redis底层数据结构
  182. 182Redis持久化
  183. 183AOF日志
  184. 184RDB快照
  185. 185Redis功能
  186. 1862. 哨兵模式
  187. 1873. 切片集群
  188. 188Redis哨兵机制是什么
  189. 189什么是集群脑裂
  190. 190过期删除策略有哪些
  191. 191Redis的LRU算法和LFU算法有什么区别
  192. 192什么是缓存击穿
  193. 193如何保证删除缓存操作一定能成功?
  194. 194为什么Redis是单线程
  195. 195Redis底层使用了什么数据结构
  196. 196Redis实现分布式锁
  197. 197缓存中的热点数据和冷数据是什么
  198. 198缓存雪崩、击穿、穿透和解决办法【常问】
  199. 199Redis过期删除策略有哪些
  200. 200关键概念
  201. 201单例模式的应用场景
  202. 202工厂模式
  203. 203实际应用
  204. 204抽象工厂模式
  205. 205概念
  206. 206应用
  207. 207实现步骤
  208. 208主要角色
  209. 209代理模式应用
  210. 210策略模式
  211. 211示例
  212. 212装饰模式
  213. 213主要角色
  214. 21423种设计模式的概念
  215. 215创建型模式
  216. 216行为型模式
  217. 217设计原则
  218. 218迪米特法则
  219. 219你在实际开发中用过哪些设计模式
  220. 220依赖倒置
  221. 221代理模式和适配器模式有什么区别
  222. 222固定长度编码
  223. 223冯诺依曼模型
  224. 224总线
  225. 225输入/输出设备
  226. 226编译系统如何工作
  227. 227处理器解释指令
  228. 228场景题 & 系统设计
  229. 229如何设计一个本地缓存
  230. 230如何设计一个RPC框架