进程与线程学习指南
在计算机编程领域,进程和线程是实现并发和并行计算的关键概念。理解它们的工作原理、创建和管理方式,以及如何进行有效的调度,对于开发高效、稳定的程序至关重要。本文将深入探讨进程和线程的相关知识,包括共享内存、线程的创建与终止、线程间通信、问题划分以及调度策略等方面。
共享内存与进程通信
当程序首次运行时,会创建内存段。初始阶段,消息区域为空,但经过一轮循环后,会包含该进程的 PID。例如,首次运行程序后,消息区域包含 PID 为 271 的信息。此时,在另一个终端运行该程序的第二个实例时,由于共享内存段已经存在,它不会再次创建,而是显示已有的消息,即另一个程序的 PID。按下回车键,它会写入自己的 PID,这样两个程序就可以相互通信。
编译使用 POSIX IPC 函数的程序时,由于这些函数是 POSIX 实时扩展的一部分,需要链接 librt 库。同时,POSIX 信号量实现在 POSIX 线程库中,因此还需要链接 pthreads 库。编译参数如下:
$ arm-cortex_a8-linux-gnueabihf-gcc shared-mem-demo.c -lrt -pthread \
-o arm-cortex_a8-linux-gnueabihf-gcc
线程基础
线程的编程接口是 POSIX 线程 API,通常称为 pthreads,它首次在 IEEE POSIX 1003.1c 标准(1995 年)中定义,作为 C 库的一部分实现,即 libpthread.so。过去 15 年左右,pthreads 有两种实现: