线程相当于进程的一个执行流,多个线程共享同一进程的地址空间以及共享以下进程资源和环境:

1. 文件描述符表

2. 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)

3. 当前工作目录

4. uid、gid

线程独立的资源:

1. 线程id

2. 上下文,包括各种寄存器的值、程序计数器和栈指针

3. 栈空间

4. errno变量

5. 信号屏蔽字

6. 调度优先级


线程与进程的比较:

  1. 调度:线程是系统调用和分派的基本单位,而进程是资源拥有的基本单位。在同一进程中,线程的切换不会引起进程的切换。但从一个进程中的线程切换到两一个进程中的线程时,会引起进程的切换。

  2. 并发性:不仅进程间可以并发执行,一个进程中的多个线程之间也可以并发执行。多线程的并发性高。

  3. 拥有资源:进程可以拥有资源,是系统拥有资源的一个基本单位。而一般情况下,线程自己不拥有资源(也有一点必不可少的资源,如上面的线程独立的资源),但它可以访问其隶属进程的资源。

  4. 系统开销:进程的开销比线程的开销大。

  5. 地址空间:同一进程的多个线程共享该进程的地址空间,而进程有自己独立的地址空间。

  6. 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信。

  7. 运行:每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。