进程简介以及进程的创建(基于Linux,后附clone()和fork(),vfork()的区别)

进程

是操作系统对程序运行的动态描述(pcb—进程控制块),在Linux中是一个task_struck结构体;

描述信息:内存指针、上下文数据、程序计数器(记录当权程序进行位置)、进程状态、IO信息等。

并行:某一个时刻,多个程序同时运行(cpu的多核);
并发:某一个CPU,对于多个程序,cpu通过轮转调度多个程序,这种情况称为并发;

创建子进程原理:

创建子进程指的是创建一个新的结构体,复制父进程是复制了父进程pcb中的大部分描述信息(复制内存指针意味着子进程运行的程序和父进程一样,复制上下文意味着当前运行的位置一样),由于代码段是只读的所以父子进程代码相同。

创建子进程目的:

提高处理效率,父子进程运行不同的代码段,两进程所实现的功能不同。

创建子进程的方法:

fork() 是运用写时拷贝技术创建新的子进程,父子进程代码共享,数据独有;

vfork() 是共用虚拟空间,访问同一块内存,调用同一块栈,为了避免调用栈混乱,所以在调用该函数时父进程会阻塞,直到子进程退出或者进程程序替换。

一旦调用成功父进程中的 fork 会返回子进程 pid,而子进程的 fork 会返回0;调用失败父进程中 fork 返回-1,没有子进程创建出来。

父子进程所含内容的异同

  • 相同:全局变量、data、text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式…

  • 不同:进程ID、fork返回值、父进程ID、进程运行时间、闹钟(定时器) 、未决信号集…

  • 普通全局变量不能用于进程间通信,fork 后子进程继承了父进程的变量,但是之后的读写都是独立的(写时拷贝技术,进程间通信会在后面地博客中讲解)。

僵尸进程:子进程先于父进程退出且父进程没有对子进程的信息进行响应;

孤儿进程:父进程先于子进程退出,子进程将运行在后台且父进程变为一号进程;

守护进程:特殊的孤儿进程,特殊在完全脱离登录终端时所建立的绘画,不受终端影响。

clone()和fork(),vfork()的区别:

fork()

fork()全部复制,子进程完全复制父进程的栈空间,也复制了页表,但没有复制物理页面(也就是说此时二者指向同一块物理内存),所以这时虚拟地址相同,物理地址也相同(此时涉及到写时拷贝技术);

fork()调用执行一次返回两个值,对于父进程,fork函数返回子程序的进程号,而对于子进程,fork函数则返回零,这就是一个函数返回两次的本质。在fork之后,子进程和父进程都会继续执行fork调用之后的指令。子进程是父进程的副本。它将拷贝获得父进程的数据空间,堆和栈,父子进程并不共享这部分的内存;

vfork()

vfork()父子进程共享内存,用vfork创建的子进程与父进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,如果这时子进程修改了某个变量,这将影响到父进程;

用vfork()创建的子进程必须显式调用exit()来结束,否则子进程将不能结束;

clone()

clone()是可以将父进程资源有选择地复制给子进程,而没有复制地数据结构则通过指针地复制让子进程共享,具体要复制哪些资源给子进程,由参数列表中的clone_flags来决定;

clone是fork地升级版本,不仅可以创建进程或者线程,还可以指定创建新的命名空间(namespace)有选择地继承父进程地内存,甚至可以将创建出来的子进程变为父进程地兄弟进程等;

猜你喜欢

转载自blog.csdn.net/SFDWU3QVG/article/details/126275354