【系统编程】进程与线程、fork函数

一、进程与线程概念

进程(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系列去调用外部的程序的时候提高了调用的效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值