本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
引入理由:
一个web服务器工作方式:
可以看到每次从磁盘读取的时候进程都是暂停的,导致性能低下。咋提高服务器工作效率?通常使用网页缓存。在没有线程情况下的两种解决方案:
I/O
这是一个多线程的web服务器的工作方式,首先读取客户端的请求,之后由分派线程将各个任务分派给工作线程,这里还是采用了网页缓存。
一个web服务器的实现有三种(构造服务器的方法):
模型 | 特性 |
|---|---|
多线程 | 有并发、阻塞系统调用 |
单线程进程 | 无并发、阻塞系统调用 |
有限状态机 | 有并发、非阻塞系统调用、中断 |
进程相关的操作:
时间/空间开销大,限制了并发度的提高。
线程的开销小:
如果有多个处理器的话,一个进程就会有多个线程同时在执行了,这样可以极大的提高运行性能
在同一进程增加了多个执行序列(线程)。
线程:进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程
进程的两个基本属性:
线程的属性
ID-->需要提供一些操作三种实现机制:

在用户空间建立线程库:提供一组管理线程的过程。
运行时系统:完成线程的管理工作(操作、线程表)。
内核管理的还是进程,不知道线程的存在。
线程切换不需要内核态特权。
例子:UNIX。
线程是由运行时系统管理的,在内核中只有进程表。典型例子是UNIXundefined POSIX线程库--PTHREAD
POSlX(Portable Operating System Interface)多线程编程接口,以线程库方式提供给用户
Thread call | Description |
|---|---|
Pthread_create | Create a new thread |
Pthread_exit | Terminate the calling thread |
Pthread_join | Wait for a specific thread to exit |
Pthread_yield | Release the CPU to let another thread run |
Pthread_attr_init | Create and initialize a thread's attribute structure |
Pthread_attr_destroy | Remove a thread's attribute structure |
优点
缺点

内核管理所有线程管理,并向应用程序提供API接口。
内核维护进程和线程的上下文。
线程的切换需要内核支持。
以线程为基础进行调度
例子:Windows
Solaris操作系统创建后尚未启动的线程。
包括 OS 中 Running 和 Ready 状态,该态的线程可能正在运行,也可能正在等待 CPU 为其分配执行时间
该态线程不会被分配 CPU 执行时间,要等待其他线程显式唤醒。如下方法会让线程进入无限期等待:
该态的线程也不会被分配 CPU 执行时间,不过无需等待被其他线程显式唤醒,而是在一定时间后,由 OS 自动唤醒
已终止线程的线程状态,线程已结束执行。
IPC,进程间通信(inter-process communication),允许进程之间互传数据和指令。多个进程同时运行时,可用IPC使它们协作完成任务,提高系统资源利用率和效率。
常见IPC机制包括管道、消息队列、共享内存和套接字等。
允许一个进程将输出发送到管道,然后另一个进程可以从该管道读取输入。
Linux管道可用 "|" 符号表示,如:command1 | command2。即 command1 的输出自动成为 command2 的输入。
管道只是一种通信机制,使进程能以更高效简单的方式协作。由于管道功能强大且能与其他命令联合使用,是编写复杂 shell 脚本的基础。
也称监视器,一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变量。
管程实现了在一个时间点,最多仅一个线程在执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程实现很大程度简化程序设计。
管程提供了一种机制,线程可临时放弃互斥访问,等待某些条件得到满足后,重新获得执行权恢复它的互斥访问。