进程的概念:
OS:程序的一个执行实例。正在执行的程序。能分配处理器并由处理器执行的实体。
内核:担当分配系统资源的实体。
进程的两个基本元素是程序代码和代码相关联数据集。进程是一种动态描叙,但不代表所有的进程都在运行。
进程描述:
大体上说,进程的信息被放在一个进程控制块的数据结构之中,可以认为进程属性的集合。
进程控制块:
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
task_struct是Linux内核的一种数据结构,它会被装载到RAM里并包含着进程的信息。每个进程都把信息放到这个数据结构里。
task_struct包含的内容:
标示符:描述进程的唯一标示符,用来区别其他进程。
状态:任务状态,退出码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针、和其他进程共享的内存块指针。
上下文数据:进程执行时处理器的寄存器的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器的时间总和,使用的时钟数总和,时间限制,记账号等。
task_struct可以在include/linux/sched.h中找到
进程内存映象:
Linux下C程序生成要经过预编译、编译、汇编、链接。
程序执行时,操作系统将可执行程序复制到内存中,程序转为进程经过几个步骤:内核将程序读入内存,为程序分配内存空间;内核为该程序保存PID及相关的状态信息,把进程放到运行队列中等待
执行,程序转化进程后就可以被操作系统的调度程序执行了。
进程的内存映象:内核在内存中如何存放可执行程序文件。在将程序转化为进程的过程中,操作系统将可执行从硬盘复制到内存中。
进程映象的位置依赖于使用的内存管理方案。
可执行程序与进程内存映象的不同之处在于:
可执行程序位于磁盘中而内存映象位于内存;可执行程序没有堆栈,因为程序被加载到内存中才会分配堆栈;可执行程序虽然也有未初始化数据段但它并不被存储在位于硬盘中的可执行文件里;可执行程序是静态的、不变的,而内存映象随着程序的执行是在动态变化的,例如数据段随着程序的执行要存储行的变量值,栈在函数调用时也是不断在变化的。
进程的状态:
运行状态:并不表示进程一定在运行中,它表示进程在运行或者在运行队列里。
睡眠状态:进程在等待事件完成。
磁盘休眠状态:进程等待IO的结束。
进程优先级:进程cpu资源的分配就是进程的优先级,优先级高的进程有优先执行的权利。
UID:执行者的身份。
PID:进程的代号。
PPID:父进程的代号,本身是子进程。
PRI:代表进程可被执行的优先级,值越小越早被执行。
NI:进程的nice值。
进程创建执行:
创建进程的方法有fork()和execve(),都是系统调用。
fork():子进程获得父进程的数据段、栈段和堆区的一份拷贝。子进程可以修改这些内存段,但是文本段是父子进程共享的内存段,不能被子进程修改。
execve():销毁所有的内存段去重新创建一个新的内存段。但是,execve()需要一个可执行文件或者脚本作为参数。
僵尸进程:子进程在父进程没有调用wait()或waitpid()的情况下退出,那么子进程就是僵尸进程。如果父进程还存在但是一直没有调用wait()或waitpid(),则该僵尸进程将无法回收,等到父进程退出后该僵尸进程被init回收。
孤儿进程:一个父进程退出,但是它的子进程还在运行,那么那些子进程会成为孤儿进程。孤儿进程将会被init进程(进程号为1)收养,并由init进程对他们完成状态收集工作。
内存分配:
malloc函数分配指定字节数的空间,未初始化;calloc函数为指定类型和数量分配空间,空间内每一位都初始化为0;realloc函数改变空间大小(可大可小),新增空间未初始化。
本文出自 “落幕知客” 博客,请务必保留此出处http://zheng2048.blog.51cto.com/10612048/1811654
原文地址:http://zheng2048.blog.51cto.com/10612048/1811654