一、程序与进程区别
1.程序:
存放在磁盘文件可执行文件(静态存在)
- 特点
- 静态性:程序是静态的,它只是一组指令的集合,在未被执行时,不会占用计算机的运行资源,也不会产生任何实际的操作。
- 可执行性:程序经过编译或解释后,可以被计算机系统识别和执行,从而实现特定的功能。
- 永久性:程序可以长期存储在存储设备中,只要存储介质不损坏,程序就可以一直存在,并在需要时被调用和执行。
2.进程:
运行起来的程序,占用内存空间(动态存在),每个进程都有一个唯一的数字标识符,进程id唯一,但限制时间为这一次的开机维持时间,id随机分配,
- 特点
- 动态性:进程是动态的,它在执行过程中会不断地改变自身的状态,如从就绪状态到运行状态,再到阻塞状态等。
- 并发性:多个进程可以在同一时间内并发执行,操作系统会通过调度算法来分配 CPU 时间片,使得各个进程能够交替执行,从而实现多任务处理。
- 独立性:每个进程都有自己独立的地址空间、内存空间、打开的文件等资源,不同进程之间的资源相互隔离,以保证进程的独立性和稳定性。
- 生命周期性:进程有一个从创建到结束的生命周期,在这个过程中,它会经历各种状态的转换,最终完成任务并结束运行。
二、进程结构
PCB 就像是进程的 “管理档案”,记录着进程的各种信息,而代码段、数据段和堆栈段则是进程运行时所用到的不同功能区域的内存空间。它们共同构成了 Linux 下的进程结构,彼此相互配合,使得进程能够正常运行。
提示:按ctrl+c可以退出运行程序
三、进程函数
返回值为pid_t只是在内核函数里面进行宏定义,为了便于区分,实际id返回还是int型
pid_t fork(void);
返回:子进程中为0,父进程中为子进程I D,出错为-1
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
int num = 0;
//开辟新的进程,直接将完整整个函数拷贝(代码段),还拷贝了代码运行的状态,所以子进程从fork之后开始运行
//数据段:还可以复制里面的数据
int pid = fork();
if (pid > 0)
{
while (1)
{
cout << "主进程id=" << getpid() << " 主进程的父进程id=" << getppid()<< "number= " << num++ << endl;
sleep(1);
}
}
else if(pid==0)
{
while (1)
{
cout << "子进程id=" << getpid() << " 子进程的父进程id=" << getppid() << "number= " << num++ << endl;
sleep(1);
}
}
return 0;
}
运行结果:
if与else都运行了,并且num的值在主进程与子进程中各自执行++,互不影响