1. 引言又是摸鱼几天~在 Linux 系统编程中进程Process与线程Thread是并发编程的两大基石。2. 进程与线程的基本概念2.1 进程进程是操作系统分配资源的最小单位。每个进程都拥有独立的地址空间、文件描述符表、信号处理函数等资源。在 Linux 中内核通过task_struct结构体描述每一个进程。进程间相互隔离一个进程崩溃通常不会直接导致另一个进程崩溃。2.2 线程线程是操作系统调度的最小单位。一个进程内部可以包含多个线程这些线程共享进程的地址空间、文件描述符等大部分资源但拥有独立的栈、寄存器状态和程序计数器。在 Linux 中线程以内核轻量级进程LWP的形式实现通过clone()系统调用创建指定共享哪些资源。3. 深入对比进程 vs 线程对比维度进程线程资源拥有独立地址空间、独立资源共享进程地址空间及资源创建/销毁开销大需复制页表、文件描述符等小仅需分配栈、寄存器上下文上下文切换代价较高切换页表、刷新 TLB代价较低同进程下切换无需切换地址空间通信方式管道、FIFO、共享内存、消息队列、Socket 等可直接读写共享内存配合锁/信号量隔离性与健壮性强隔离一个进程崩溃不影响其他弱隔离一个线程崩溃可能拖垮整个进程适合场景IO 密集型、多核并行、需要高可靠性计算密集型、高并发网络服务、数据共享频繁4. Linux 中的进程与线程实现在 Linux 内核层没有专门的“线程”数据结构所有执行实体都通过task_struct表示。创建进程使用fork()创建线程通常使用 POSIX 线程库pthread底层会调用clone()并设置恰当的共享标志。例如使用pthread_create()时clone()的参数会让新任务与父任务共享内存空间、文件系统信息等从而实现线程的语义。下面是一个简单的 pthread 示例#includestdio.h#includepthread.hvoid*thread_func(void*arg){printf(Hello from thread!\n);returnNULL;}intmain(){pthread_ttid;printf(Main process pid: %d\n,getpid());pthread_create(tid,NULL,thread_func,NULL);pthread_join(tid,NULL);return0;}getpid()在进程中返回进程 ID而在线程中同一进程返回的仍然是进程 ID获取线程 ID 需要使用pthread_self()或gettid()系统调用。5. 调度与上下文切换Linux 的 CFS完全公平调度器以调度实体为单位进行调度线程就是调度实体。当 CPU 从一个线程切换到另一个线程时涉及保存当前寄存器、栈指针、程序计数器并恢复下一个线程的状态。进程间上下文切换还需要切换地址空间包括页表、刷新 TLB 缓存开销明显高于线程切换。线程上下文切换由于共享同一地址空间这部分操作被省略因此线程切换更快。6. 多线程编程的注意事项虽然线程轻量、通信便捷但编写正确的多线程程序需要注意以下几点数据竞争共享数据的访问必须同步使用互斥锁pthread_mutex_t、读写锁、自旋锁等。死锁避免嵌套加锁顺序不一致、持有锁时调用可能阻塞的函数等。线程安全系统库函数如strtok、gmtime可能内部使用静态缓冲区需改用可重入版本strtok_r、gmtime_r。惊群效应多个线程同时等待同一事件时的唤醒风暴可采用条件变量配合队列或使用SO_REUSEPORT缓解。资源清理线程退出时应确保释放持有的锁及堆内存推荐使用线程局部存储TLS或 RAII 风格封装。