Linux进程与线程
本文建立在读者已对Linux进程和线程有初步的认知
计算机内存逻辑上可以划分为内核空间和用户空间。也就是我们经常讨论的内核态和用户态。
1.Linux组织进程
进程是程序运行的一个实体,是一个动态的过程。Linux中PCB是一个task_struct的结构体,每个PCB包括基本信息(PID,进程状态),资源管理(fs,files,mm,signal),进程间通信(管道、消息队列、共享内存等IPC机制),进程关系。
图1 PCB文件系统管理图
图2 PCB内存管理图
可以看出一个进程除了管理自身的属性(PID、进程状态),都用于调度使用,还有文件系统、内存资源管理,故进程是操作系统资源分配的一个基本单位。
2.Linux组织线程
进程与线程之间的关系如下图,线程只拥有调度所需要的最少资源。包括pid、寄存器(PC指针和栈指针)、优先级。满足调度的基本要求,故线程是一个调度的基本单位。
线程间共享:
- 进程指令
- 全局变量
- 打开文件
线程私有:
- ID
- 寄存器集合
- 栈
- 优先级
图3 线程与进程间关系
2.1线程启动例程函数
进程的启动,会有一个启动例程,该例程会调用main()函数进而开始执行代码。线程也有一个例程函数,当线程创建后,此函数会作为线程的入口函数进行执行。
下面展示一些 内联代码片
。
// An highlighted block
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
void *(*start_routine) (void *)是例程函数的原型。
补充:进/线程生命周期
图4 进程生命周期
在一个进程不被阻塞的情况下,生命周期如图,进程执行期间调用exit()函数会进入进程的收尾工作,包括终止处理函数和I/O清理。
- 终止处理函数
资源释放:网络资源,内存资源等
日志登记 - I/O清理函数
将缓冲设备中的信息更新到字符设备中存储。
线程生命周期与进程类似,但两者API并不相同。