一、进程与线程概念
进程(process)与进程之间的内存是相互独立的,通过IPC进行联系。
线程与线程之间的内存是共用的。资源少,启动快。但要解决互斥、同步问题(防止混乱)。
1.进程
(1) 正在运行的一个程序
(2) 它代表一种资源的载体(独立的应用程序)
(3) 资源的最小单位
(4) 每一个进程独立包括虚拟内存,文件描述符资源,信号资源等,不与其他进程共享资源
应用场景:
1,调度第三方程序
2,调度其他程序的时候,我们需要传输一定的资源或者是指令过去给另外一个程序时,我们需要应用进程间通信
3,启用服务
2.线程
(1) 调度的最小单位(CPU在轮询指令运行的最小单位)
(2) 进程下面的一个子级单位(所有的线程都是在进程的基础上运行的),一个进程当中,可以运行多个线程
(3) 所有的线程共享进程的所有资源
(4) 每一个线程独立一片栈空间(栈空间默认大小为8M)
应用场景:
基本上所有的多任务的开发,优先采用多线程
3.关系&总结
多个线程(线程组)形成一个进程。
多个进程(进程组)形成一个程序。
进程是程序执行的动态过程,包括创建、调度和消亡。
程序是静态的,保存指令的有序集合。
进程是资源管理的最小单位。(创建一个进程,系统分配一块内存)
线程是系统调度的最小单位。(调度结构体:task_struct)
二、进程的创建
进程的创建过程我们可以理解成为“分身”的过程
1.fork()函数
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
函数功能:创建出一条子进程
返回值:
成功创建子进程的情况下会将0返回给子进程,子进程的PID返回父进程,如果失败返回-1,子进程不会被创建
函数在执行的过程当中,会将父进程的资源复制一份,放到子进程里面去运行,其中下面是会被子进程继承的资源
1, 父进程的运行的用户的ID跟组ID
2, 环境变量(库路径,命令路径,命令路径等等)
3, 进程组ID跟会话ID
4, 打开的文件描述符
5, 信号响应函数
6, 虚拟内存(堆,栈,程序段落等等)
以下属性就是独立,没有继承的:
1, 进程ID
2, 记录锁(文件锁)
3, 挂起的信号
示例:
注:
1、fork函数将本进程复制一份,成为独立的子进程。
2、子进程与父进程代码一致,但子进程只从fork函数开始往下执行。
3、父、子进程并发运行,无法确定执行次序。
4、fork函数在父、子进程处的返回值不同(大于0为父进程,等于0是子进程)。
2.vfork()函数
创建出来的子进程是不会复制父进程的资源到子进程中,从而配合exec系列去调用外部的程序的时候提高了调用的效率