1.��������Դ��
2.Linux内核源码分析:Linux进程描述符task_ struct结构体详解
3.nginx源码分析--master和worker进程模型
4.wait函数和waitpid的进程进程使用和总结
��������Դ��
在Linux内核中,进程与线程的阻塞阻塞统一数据结构是task_struct,它作为进程存在的源码源码唯一实体,通过双向循环链表连接所有task_struct。进程进程每个任务拥有唯一标识pid和线程组IDtgid,阻塞阻塞其中group_leader指向进程主线程。源码源码php app直播源码有了tgid,进程进程我们可以区分task_struct代表进程还是阻塞阻塞线程。
Linux kernel通过成员变量表示进程的源码源码亲缘关系,包括进程状态和权限控制。进程进程进程权限涉及进程访问文件、阻塞阻塞访问其他进程及执行操作的源码源码能力。操作权限由cred和real_cred成员表示,进程进程描述了当前进程和试图操作的阻塞阻塞进程之间的权限关系。
进程运行统计信息记录了用户态和内核态上消耗的源码源码时间以及上下文切换次数,反映了进程的牛熊指标源码运行情况。信号处理包括被阻塞、等待处理和正在处理的信号,信号处理函数可以忽略或结束进程,处理栈用于信号处理。
进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,每个进程有独立的用户虚拟地址空间,内核线程无用户地址空间。进程拥有文件系统数据结构和打开文件数据结构,涉及Linux文件系统操作。
每个task都有内核栈,用于在调用系统调用时从用户态切换到内核态。内核栈包含thread_info和pt_regs数据结构,其中thread_info由体系结构定义,pt_regs用于保存系统调用时的CPU上下文。在系统调用返回时,域名含义查询源码可以从进程的原来位置继续运行。
综上所述,task_struct结构体在Linux内核中扮演着关键角色,它管理着进程和线程的生命周期,从状态管理、权限控制、运行统计、信号处理到内存管理与文件系统交互,以及系统调用的上下文切换,都是通过task_struct的成员变量和结构体实现的。这些特性使得Linux内核能够高效、灵活地管理多任务环境。
Linux内核源码分析:Linux进程描述符task_ struct结构体详解
Linux内核通过一个task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中,ios相机app源码包含许多字段,其中state字段表示进程的当前状态。常见的状态包括运行、阻塞、等待信号、终止等。进程状态的切换和原因可通过内核函数进行操作。PID是系统用来唯一标识正在运行的每个进程的数字标识,tgid成员表示线程组中所有线程共享的PID。进程内核栈用于保存进程在内核态执行时的临时数据和上下文信息,通常为几千字节。内核将thread_info结构与内核态线程堆栈结合在一起,占据连续的两个页框,以便于访问线程描述符和栈。获取当前运行进程的源码猫少儿编程thread_info可通过esp栈指针实现。thread_info结构包含task字段,指向进程控制块(task_struct)。task_struct结构体的flags字段用于记录进程标记或状态信息,如创建、超级用户、核心转储、信号处理、退出等。而real_parent和parent成员表示进程的亲属关系,用于查找和处理进程树中的亲属关系。
nginx源码分析--master和worker进程模型
一、Nginx整体架构
正常执行中的nginx会有多个进程,其中最基本的是master process(主进程)和worker process(工作进程),还可能包括cache相关进程。
二、核心进程模型
启动nginx的主进程将充当监控进程,主进程通过fork()产生的子进程则充当工作进程。
Nginx也支持单进程模型,此时主进程即是工作进程,不包含监控进程。
核心进程模型框图如下:
master进程
监控进程作为整个进程组与用户的交互接口,负责监护进程,不处理网络事件,不负责业务执行,仅通过管理worker进程实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
master进程通过sigsuspend()函数调用大部分时间处于挂起状态,直到接收到信号。
master进程通过检查7个标志位来决定ngx_master_process_cycle方法的运行:
sig_atomic_t ngx_reap;
sig_atomic_t ngx_terminate;
sig_atomic_t ngx_quit;
sig_atomic_t ngx_reconfigure;
sig_atomic_t ngx_reopen;
sig_atomic_t ngx_change_binary;
sig_atomic_t ngx_noaccept;
进程中接收到的信号对Nginx框架的意义:
还有一个标志位:ngx_restart,仅在master工作流程中作为标志位使用,与信号无关。
核心代码(ngx_process_cycle.c):
ngx_start_worker_processes函数:
worker进程
worker进程主要负责具体任务逻辑,主要关注与客户端或后端真实服务器之间的数据可读/可写等I/O交互事件,因此工作进程的阻塞点在select()、epoll_wait()等I/O多路复用函数调用处,等待数据可读/写事件。也可能被新收到的进程信号中断。
master进程如何通知worker进程进行某些工作?采用的是信号。
当收到信号时,信号处理函数ngx_signal_handler()会执行。
对于worker进程的工作方法ngx_worker_process_cycle,它主要关注4个全局标志位:
sig_atomic_t ngx_terminate;//强制关闭进程
sig_atomic_t ngx_quit;//优雅地关闭进程(有唯一一段代码会设置它,就是接受到QUIT信号。ngx_quit只有在首次设置为1时,才会将ngx_exiting置为1)
ngx_uint_t ngx_exiting;//退出进程标志位
sig_atomic_t ngx_reopen;//重新打开所有文件
其中ngx_terminate、ngx_quit、ngx_reopen都将由ngx_signal_handler根据接收到的信号来设置。ngx_exiting标志位仅由ngx_worker_cycle方法在退出时作为标志位使用。
核心代码(ngx_process_cycle.c):
wait函数和waitpid的使用和总结
当子进程退出时,Linux内核会通过SIGCHLD信号通知父进程。这种情况下,子进程转变为僵尸状态,仅保留基本数据结构以供父进程查询其退出详情。wait和waitpid函数分别用于处理这种情况。
wait函数的原型是:当调用后,进程会阻塞直到子进程退出,此时会收集子进程信息并销毁,然后返回。status参数可用来存储退出状态,若对详情不感兴趣,可设置为NULL。
waitpid函数则更具体,用于等待指定的进程结束。它支持参数status来获取子进程状态,以及选项如WNOHANG防止阻塞。Linux中可用的选项包括WNOHANG和WUNTRACED,它们可以组合使用。函数成功返回子进程pid,失败则返回-1。
了解这些函数的使用对于监控和管理进程至关重要。如果你对如何更深入地掌握,可以关注博主cs_wu在博客园上的文章,或者尝试c++项目实战课程,包括基础架构、SPDK、内核等技术,以提升专业技能。
有兴趣进一步学习内核技术的朋友,可以加入技术交流群获取资源,如内核源码学习路线和视频教程。点击链接获取更多详情和福利。