@@ -361,7 +361,7 @@ main: end
361
361
##### 用户态管理且用户态运行的线程
362
362
363
363
- 在用户态实现线程的管理与运行,操作系统感知不到这类线程的存在
364
- - POSIX Pthreads ,Mach C-threads,Solaris threads
364
+ - GNU Pth (Portable Threads) ,Mach C-threads,Solaris threads
365
365
- 别名:用户态线程(User-level Thread)、绿色线程(Green Thread)、有栈协程(Stackful Coroutine)、纤程(Fiber)
366
366
367
367

@@ -372,6 +372,8 @@ main: end
372
372
373
373
- 由一组用户级的线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等
374
374
375
+ - GNU Pth (Portable Threads),Mach C-threads,Solaris threads
376
+ - 别名:用户态线程(User-level Thread)、绿色线程(Green Thread)、有栈协程(Stackful Coroutine)、纤程(Fiber)
375
377

376
378
377
379
---
@@ -443,12 +445,23 @@ main: end
443
445
##### 内核态管理且用户态运行的线程
444
446
445
447
- 一个进程中可以包括多个线程
446
- - Windows内核的设计
447
- - rCore/uCore内核的设计
448
- - 一个进程中只包括一个线程
449
- - Linux内核的设计
448
+ - Windows NT 内核支持线程,每个线程都是内核对象
449
+
450
+ - Linux-2.6 + glibc-2.3开始支持POSIX thread标准
451
+ - rCore/uCore内核的设计
452
+ - 主流:一个用户线程对应一个内核的线程控制块,由内核管理和调度
453
+ 
450
454
451
- 
455
+ ---
456
+
457
+ ##### 线程的上下文切换
458
+
459
+ 线程是调度的基本单位,而进程则是资源拥有的基本单位。
460
+
461
+ - 不同进程中的线程切换:进程上下文(如页表等)需要切换
462
+ - 相同进程中的线程切换:虚拟内存等**进程资源**不需切换,只需要切换**线程的私有数据、寄存器**等不共享的数据
463
+
464
+ 
452
465
453
466
---
454
467
@@ -470,6 +483,8 @@ main: end
470
483
- 内存占用:多线程`fork()`会复制整个进程的地址空间,包括所有线程所拥有的栈、寄存器和锁等资源
471
484
- 性能下降:多线程`fork()`的开销较大,可能会影响应用程序的性能
472
485
486
+ 可采用:限制线程中调用 fork()、使用 pthread_atfork() 在 fork() 前后统一加/解锁来防止子进程死锁等方法,来避免这些问题。
487
+
473
488
<!--
474
489
因此,在多线程应用程序中,建议谨慎使用 fork(),尤其是当涉及到共享资源和锁时。可以采用其他技术来实现进程间通信和同步,例如共享内存、消息队列和信号量等。
475
490
-->
@@ -575,30 +590,21 @@ main: end
575
590
576
591
##### 轻量级进程:双态管理的线程
577
592
578
- 轻量级进程(Light-Weight Process,LWP)是内核支持的用户线程
579
- * 一个进程可有一个或多个 LWP,每个 LWP 是跟内核线程一对一映射的,也就是 LWP 都是由一个内核线程支持。
580
- * 在 LWP 之上也可使用用户线程。
593
+ 轻量级进程(Light-Weight Process,LWP)
594
+ * 定义:LWP 是用户线程库与内核线程之间的中间数据结构,向用户线程库呈现为“可调度虚拟 CPU”。用户线程可被映射到一个或多个 LWP 上,由用户态调度器在这些 LWP 上切换执行。
595
+ * 每个 LWP 是跟内核线程一对一映射的,即一个LWP 绑定到一个内核线程。
596
+ * 一个进程可包含多个LWP,一个LWP 可对应多个用户线程,一个用户线程也可对应多个LWP。
581
597
582
598
---
583
599
584
600
##### 轻量级进程与用户线程的对应关系
585
601
586
- - 1 : 1,即一个 LWP 对应 一个用户线程:Linux, JVM
587
- - 取消用户态管理,内核管理线程
588
- - N : 1,即一个 LWP 对应多个用户线程:与OS无关的Green Thread
589
- - 内核态仅管理包含多个线程的进程,用户态的线程运行时管理线程
590
- - M : N,即多个 LWP 对应多个用户线程:Solaris OS, Go runtime
591
- - 用户态线程运行时和内核协同进行管理
592
-
593
- ---
602
+ - 1 : 1(主流),即一个用户线程对应一个LWP。如Linux内核管理和调度用户线程
603
+ - M : 1(非主流),即多个用户线程对应一个LWP。如Green Thread,内核仅管理包含多个线程的进程,用户态的线程运行时管理线程。
604
+ - M : N(非主流),即多个用户线程对应多个LWP。如Solaris OS通过用户态线程运行时和内核协同,对用户态线程进行管理和调度。
594
605
595
- ##### 轻量级进程实例
596
-
597
- M : N线程模型
598
- - Solaris 操作系统+C线程运行时库
599
- - Go语言+Go运行时库+OS
600
606
601
- 
607
+ 
602
608
603
609
---
604
610
@@ -613,12 +619,14 @@ M : N线程模型
613
619
614
620
---
615
621
616
- ##### 线程的上下文切换
617
-
618
- 线程是调度的基本单位,而进程则是资源拥有的基本单位。
622
+ ##### 轻量级进程实例(M : N线程模型)
623
+ - Solaris 操作系统+C线程运行时库
624
+ - 曾在 Solaris(≤ 8)、HP-UX(11i v1.6+)、AIX(4.3.1–7.3)、IRIX、Tru64 UNIX 中得到过真实应用
625
+ - 实现复杂度高:调试和维护难度大
626
+ - 性能不稳定:切换代价和同步开销往往抵消 M:N 本应带来的优势
627
+ - 现代硬件多核/多处理器环境下,1:1 模型能更直接地映射并行需求
619
628
620
- - 不同进程中的线程切换:进程上下文切换
621
- - 相同进程中的线程切换:虚拟内存等**进程资源**保持不动,只需要切换**线程的私有数据、寄存器**等不共享的数据
629
+ 
622
630
623
631
---
624
632
0 commit comments