问1. 什么是程序,什么是进程,有什么区别?
程序:一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。
进程:是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。
程序是静态的概念,gcc xxx.c –o pro,磁盘中生成pro文件,叫做程序。
进程是程序的一次运行活动,通俗点意思是程序跑起来了,系统中就多了一个进程。
问2. 如何查看系统中有哪些进程?
a.使用ps指令查看
实际工作中,配合grep来查找程序中是否存在某一个进程
![](https://i-blog.csdnimg.cn/blog_migrate/5f422c853f6944f755a889b6396e85aa.png)
所有进程显示出来,并输出到ps.txt文件:ps -aux > ps.txt
显示指定用户信息:ps -u root
按 CPU 资源的使用量对进程进行排序:ps aux | sort -nk 3
按内存资源的使用量对进程进行排序:ps aux | sort -rnk 4
b.使用top指令查看,类似windows任务管理器
![](https://i-blog.csdnimg.cn/blog_migrate/964ab0a27d613c5320831518476dab7a.png)
问3. 什么是进程标识符?
进程标识符(process identifier,又略称为进程ID,或者PID)是大多数操作系统的内核用于唯一标识进程的一个数值。这一数值可以作为许多函数调用的参数,以使调整进程优先级、杀死进程之类的进程控制行为成为可能。
每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证
Pid=0: 称为交换进程(swapper)
作用—进程调度
Pid=1:init进程
作用—系统初始化
编程调用getpid函数获取自身的进程标识符
getppid获取父进程的进程标识符
问4. 什么叫父进程,什么叫子进程
父进程(Parent Process)指已创建一个或多个子进程的进程。
子进程为由另外一个进程(对应称之为父进程)所创建的进程。子进程继承了父进程的大部分属性,例如文件描述符。
进程A创建了进程B,
那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系。
当一个子进程结束运行(一般是调用exit、运行时发生致命错误或收到终止信号所导致)时,子进程的退出状态(返回值)会回报给操作系统,系统则以SIGCHLD信号将子进程被结束的事件告知父进程,此时子进程的进程控制块(PCB)仍驻留在内存中。一般来说,收到SIGCHLD后,父进程会使用wait系统调用以获取子进程的退出状态,然后内核就可以从内存中释放已结束的子进程的PCB;而如若父进程没有这么做的话,子进程的PCB就会一直驻留在内存中,也即成为僵尸进程。
孤儿进程则是指父进程结束后仍在运行的子进程。在类UNIX系统中,孤儿进程一般会被init进程所“收养”,成为init的子进程。
为避免产生僵尸进程,实际应用中一般采取的方式是:
将父进程中对SIGCHLD信号的处理函数设为SIG_IGN(忽略信号);
fork两次并杀死一级子进程,令二级子进程成为孤儿进程而被init所“收养”、清理。
问5. C程序的存储空间是如何分配?
参考:《UNIX环境高级编程》第7章 7.6节
C程序一般有下面几部分构成
正文段:又叫文本段,这是有CPU执行的机器指令部分。通常,正文段是可以共享的,并且是只读的。
初始化数据段:通常将此段作为数据段,它包含了程序中需要明确的赋初值的变量,比如函数外的声明:int cnt = 10;
非初始化数据段:通常此数据段称为bss段(block start symbol),在程序开始执行之前,内核将此段中的数据初始化为0或空指针。比如函数外声明:int arr[100];
栈:自动变量以及每次函数调用所需保存的信息都存放在此段中。调用函数其返回地址也保存在栈中。递归函数每调用一次自身,就是用一个新的栈帧,这样一个函数调用中的变量集就不会影响另一个函数调用函数的变量。
堆:通常在堆中进行动态存储分配,由于历史上的惯例,堆位于非初始化数据段和栈之间。
![](https://i-blog.csdnimg.cn/blog_migrate/ee91db87d95404f1c611b066fea64f35.png)
记录学习嵌入式成长过程,方便以后查看。
师承--抖音上官社长(上官可编程)