进程(Process)的定义:
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程一个启动的程序,进程占用系统资源。如:物理内存、CPU、终端等,是一个动态的概念。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;
在当代面向线程设计的计算机结构中,进程是线程的容器。
程序是指令、数据及其组织形式的描述,进程是程序的实体。程序是指编译好的二进制文件,存储在磁盘中,是一个静态的概念。
主要特征:
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。并发性:任何进程都可以同其他进程一起并发执行独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进结构特征:进程由程序、数据和进程控制块三部分组成。多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
进程的基本状态有5种,分别为初始态、就绪态、运行态、挂起态和终止态。
其中初始态为进程准备阶段,常与就绪态结合来看。
在Linux操作系统中,进程在内存里有三部分的数据,就是“数据段”、“堆栈段”和“代码段”。
代码段,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。 堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。
数据段则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用malloc之类的函数取得的空间)。
在Linux下产生新的进程的系统调用就是fork函数。fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。
函数作用:创建子进程原型: pid_t fork(void);函数参数:无返回值:调用成功:父进程返回子进程的PID,子进程返回0;调用失败:返回-1,设置errno值。fork函数代码片段实例
Parent int main() { pid_t pid; char *message; int n; pid = fork()' if(pid <0){ perror("fork failed"); exit(1); } if(pid == 0) { message = "This is the child\n"; n = 6; } else { message = "This is the parent\n"; n = 3; } for(;n>0;n--){ printf(message); sleep(1); } return 0; }fork函数总结
1.fork函数的返回值?
父进程返回子进程对的PID,是一个大于0的数。子进程返回0;
注意:不是fork函数在一个进程中返回2个值,而是在父子进程中各自返回一个值。
2.子进程创建成功后,代码的执行位置?
父进程执行到什么位置,子进程就从哪里执行。
3.如何区分子进程?
通过fork函数的返回值
4.父子进程的执行顺序
不一定,哪个进程抢到CPU,哪个进程就先执行。