一.进程概念
1.OS角度:程序的一个执行实例,正在执行的程序。能分配处理器并由处理器执行的实体。
2.内核观点:分配系统资源(CPU时间,内存)的实体。
进程的两个基本元素:
1.程序代码(可能被执行相同程序的其他进程共享)。
2.代码相关的数据集。
进程是一种动态描述,但是并不代表所有的进程都在运行。
二.进程描述
每个进程在内核中都有一个进程控制块(PCB)来维护进程进程的信息,Linux内核的进程控制块是task_struct结构体。它会被装载到RAM(随机访问存储器(Random-Access Memory))里并且包含着进程的信息。每个进程都把它的信息放在task_struct这个数据结构里。
task_struct:
标示符:描述本进程的唯一标示符,用来区别其他进程。
状态:任务状态,退出代码,退出信号。
优先级:性对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I\O请求,分配给进程的I\O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号。
三.进程位置
*进程将程序读入内存,为程序分配内存空间。
*内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行。
1.进程的内存映像 ----- > 内核在内存中如何存放可执行程序文件。在程序转化为进程的过程中,操作系统将可执行程序从硬盘复制到内存中。
四.进程状态
static const char* const task_state_array[] = {
"R(running)",/*0*/
"S(sleeping)",/*1*/ //可唤醒状态的睡眠状态
"D(disk sleep)",/*2*/ //不可中断的睡眠状态
"T(stopped)",/*4*/
"t(tracing stop)",/*8*/ //暂停状态
"X(dead)",/*16*/
"Z(zombie)",/*32*/ //僵尸状态 ,进程挂掉,进程信息等待其他进程查看退出信息,最后又init回收资源
};
僵尸状态测试
父进程while(1)死循环,子进程exit(1),这时候子进程就是僵尸状态
五.其它
进程还有 进程优先级,进程创建执行,进程环境...
六.栈帧
附上一片自己的关于栈帧的博客 函数在调用过程中的压栈和出栈问题 。
以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。