一、什么是进程?
进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,他是操作系统进行资源分配和调度的基本单元。
二、进程的主要特征。
1.并发性。指的是系统中多个进程可以同时并发执行,相互之间不受干扰。
2.动态性。指的是进程都有完整的生命周期,而且在进程的生命周期内,进程的状态是不断变化的。另外,进程具有动态的地址空间。
3.交互性。指的是进程在执行过程中可能会与其他进程发生直接或着间接的通信,如进程同步和进程互斥等,需要为此添加一定的进程处理机制。
4.独立性。指的是进程是一个相对完整的资源分配和调度的基本单位,各个进程的地址空间是相互独立的,只有采用某种特定的通信机制才能实现进程之间的通信。
三、进程的分类。
1.交互进程。 2.批处理进程。 2.守护进程。
四、进程的状态
1.运行状态 R(TASK_RUNNING)。进程当前正在运行,或者正在运行队列中等待调用。
2.可中断阻塞状态 S(TASK_INTERRUPTIBLE)。进程处于阻塞(睡眠)状态,正在等待某些事件发生或者能够占用某些资源。处在这个状态下的进程可以被信号中断。
3.不可中断的阻塞状态D(TASK_UNINTERRUPTIBLE)。此进程状 态类似于可中断的阻塞状态 ,只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态。
4.暂停状态 T (TASK_STOPPED)。进程的执行被暂停,当进程收到都是SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号,就会进入暂停状态。
5.僵死状态 Z (EXIT_ZOMBIE)。子进程运行结束,父进程未退出,并且未使用 wait 函数族,等系统调用来回收子进程的的所有退出状态。处在该状态下的子进程已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度。
6.消亡状态X(EXIT_BEAD)。这是最终状态,父进程调用wait函数族回收之后,子进程彻底由系统删除,不可见。
五、进程的创建。
1.fork()创建
子进程几乎复制了父进程所有的资源,如栈区,堆区,数据段。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
//多进程
//1.创建子进程,原来进程升级为父进程
pid_t pid;
pid = fork();
if(pid<0)
{
perror("fork erroe");
return -1;
}else if(pid==0)//w我是子进程
{
printf("i am child process\n");
}else if(pid>0)//我是父进程
{
printf("i am father process\n");
}
return 0;
}
2.vfork
由于fork完整地拷贝了父进程的整个地址空间,因此执行速度是比较慢的。为了提高效率,Unix系统设计者创建了vfork。vfork也创建新进程,但不产生父进程的副本, 它通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才拷贝父进程。这就是著名的“写操作时拷贝”技术。
3.fork和vfork的区别
1.数据段不同
vfork():子进程与父进程共享数据段.
2.执行次序
fork(): 父子进程的执行次序不确定.
vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
六、进程的退出
1.
#include <stdio.h>
#include "pro.h"
int main(void)
{
printf("hello world");
exit(0);
printf("hello xian");
return 0;
}
#include <stdio.h>
#include "pro.h"
int main(void)
{
printf("hello world");
_exit(0);//退出进程
printf("hello xian");
return 0;
}
#include <stdio.h>
#include "pro.h"
int main(void)
{
printf("hello world");
fflush(stdout);//stdout表示标准输出
_exit(0);
printf("hello xian");
return 0;
}