20240819嵌入式学习笔记

【进程】

进程即程序执行的过程,在这个过程中操作系统为进程分配系统资源。

从执行特点上来看,进程为并发,同时可以完成多个任务。但究其本质,在微观上为串行。根据单CPU特点,由操作系统对资源进行调度,同一时间只能只能一条进程,但得益于CPU计算的高速,一小段时间(一个时间片)内即可执行多条进程,从宏观上可以理解为并发。

进程之间会有对系统资源的竞争,所以由操作系统在保证高效的前提下进行进程调度。此处设计操作系统专业知识,不做进一步探讨。

进程号PID作为系统中进程的唯一性识别编号,在系统中有重要作用。进程一旦被创建就会产生唯一与之对应的PID,直到进程消灭,PID才会消失并失效。

【内存分布】

以32位操作系统为例,系统最高支持4GB内存。

在4GB空间中0-3GB空间由进程占用;3-4GB空间由系统内核占用。

在进程占用的3GB空间中,由低向高分别放置代码文本、变量数据、堆内容、共享内容和栈内容。

【PCB】

PCB全称为Process Control Block,表示进程控制块。

PCB类型为一个复杂结构体,其中比较重要的成员有PID、当前工作路径、进程资源上限、进程打开文件列表等。

当进程被调用,对应PCB被拷贝进入内存,并执行一个时间片。一个时间片结束,当前执行的进程被挂起,PCB被从内存中拷贝至硬盘暂存,另一个进程PCB被拷贝至内存中,并在下一个时间片中执行,以此循环,直到进程结束,不再执行。上述过程即为进程的“并发”。

【fork】

fork函数的含义为创建一个子进程。

在使用时fork函数没有参数,返回值为整型。调用时fork函数会直接读取当前进程的PID,来确定创建的进程(子进程)与当前进程(父进程)的关系。

若返回值为整数,此返回值为子进程的PID;返回值为0表示当前为子进程;返回值为负数表示创建子进程失败。

fork函数的独特之处为返回值会返回两次

fork函数创建了一个与父进程密切相关的子进程,此时两个进程同时存在,但具体代码在同一片空间中,因此对于子进程和父进程来说,二者都会执行到fork函数。在父进程中fork函数会返回子进程的PID,在子进程中fork函数会返回0。

为了区分子进程和父进程执行内容的不同,通过对返回值进行条件判断,来区分其对应要操作的代码。

int ret = fork();

if(ret > 0)
{
    printf("This is parent process!\n");   
}
else if(ret == 0)
{
    printf("This is child process!\n");
}
else 
{
    perror("fork");
}

需要注意的是,创建出子进程时,子进程和父进程都处于待执行状态,此时二者执行的先后由此前提到的操作系统进行调度。为了使其中某一个进程先执行,通常会在另外进程前添加延时函数来人为降低其执行优先级。当其中一个进程执行完毕后,另一进程才会被执行(此处只讨论父子进程的相对先后顺序,系统其他进程执行顺序由系统调度)。

【父子进程】

子进程由fork函数创建,子进程与父进程之间密切相关,因为子进程和父进程的PCB内容除PID之外完全相同。这一点也证明了子进程和父进程的代码区内容相同,有相同的代码逻辑。但与父进程不同的是,子进程的执行是在fork函数之后才开始。

进程相关函数:

getpid();        获取当前进程PID

getppid();        获取当前进程父进程PID

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值