【Linux】进程管理

发布于:2025-04-12 ⋅ 阅读:(38) ⋅ 点赞:(0)

一、程序与进程区别

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的值在主进程与子进程中各自执行++,互不影响