You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: book/ch04.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@
8
8
9
9
线程是操作系统的一个调度单元,线程包含在进程之中。一个进程最少有一个线程,叫主线程,也就是运行中的进程。一个进程中可以有多个线程,线程之间共享进程的全部系统资源,比如程序数据、文件描述符等等。线程可以挂起、中断、结束,也就是操作系统可以通过这些状态来对进程中的多个线程进行调度,比如某个线程有 IO 等待时就可以暂时被挂起,让出 CPU 让其他线程执行。
10
10
11
-
正式基于线程有这样的特点,多线程的 Web Server 共享数据比多进程的更容易实现,而且效率更高。
11
+
正是基于线程有这样的特点,多线程的 Web Server 共享数据比多进程的更容易实现,而且效率更高。
12
12
13
13
```python
14
14
@@ -119,4 +119,4 @@ def main():
119
119
120
120
在多线程 Web Server 中,某个工作线程处理的 socket 由于某种原因消息没有送达,暂且叫它 B 线程,调用 recv 时发生阻塞,由于线程的调度是操作系统控制的,此时 B 线程由于不再占用 CPU 而被操作系统挂起,让出 CPU 的控制权给其它工作线程使用,某一刻 B 线程等待的 socket 数据到达了可以读取了,**但是 B 线程何时才能获得 CPU 的使用权从而读取数据?答案是不知道**。因为线程的调度完全是随机的,任由操作系统根据每个线程占用时间片和线程当前的状态进行调度,也就是 B 线程完成数据的读取的时机是不确定的。在真实的 Web Server 工作环境中,类似 B 线程的这种线程是大量存在的。那么我们该如何准确的准确无误的唤醒等待中的线程告诉它等待的 socket 可写可读了,让它们赶紧干活呢?
0 commit comments