1.什么是程序,什么是进程,区别是什么?
- 程序:程序是已经创建好的进程,此时并未进行运行,表现为静态。
windows | 存储在硬盘中的可执行文件 |
Linux | 代码文件的编译但未运行,如gcc xxx.c -o pro |
- 进程:进程是正在运行的程序实例。进程是程序的一次运行活动,意思是程序跑起来了,系统中就多了一个进程。
2.如何查看系统中有哪些进程?
A、ps指令
显示全部进程,格式为ps -aux
显示部分进程,需要搭配grep指令(文件查找),格式为ps -aux|grep+搜索的文件名称
ps -aux|grep init//显示关于init的进程
B.top指令
top指令类似于windows的文件管理器,可用来查看文件的运行情况、cpu占用大小等,且数值是动态改变的,通常用它来评估程序设计。
3.什么是进程标识符(pid)和父进程标识符(ppid)?
A.进程标识符
与文件标识符fd类似:每一个进程都有一个非负整数标志的唯一ID,叫做pid,类似于身份证。
PID是程序被操作系统加载到内存成为进程后动态分配的资源,每次程序执行的时候,操作系统都会重新加载,PID在每次加载的时候都是不同的。
Pid=0::交换进程(swapper)作用——进程调度(例:多程序运行时谁作为主程序)
Pid=1: init进程,作用—系统初始化(例:开机界面)
B.父进程标识符
PPID与PID一样都是非零整数 一个进程创建的另一个新进程称为子进程。相反地,创建子进程的进程称为父进程。
编程调用getpid函数获取自身的进程标识符getppid获取父进程的进程标识符
两者需要调用的函数原型如下:
pid_t getpid(void);
pid_t getppid(void);
调用该函数时需包含以下头文件:
#include <sys/types.h>
#include <unistd.h>
示例:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid_t ppid;
pid = getpid();
ppid = getppid();
printf("pid = %d\n",pid);
printf("ppid = %d\n",ppid);
return 0;
}
4.什么是父进程,什么是子进程?
进程 A创建了B,那么A叫做父进程,B叫做子进程,父子进程是相对的概念
5.C程序的存储空间是如何分配?
对分配空间进行解读:
- 正文段:这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shel1等) 在存储器中也只需有一个副本,另外正文段常常是只读的,以防止程序由于意外而修改其自身的指令。
- 初始化数据段:通常将此段称为数据段,它包含了程序中需明确地赋初值的变量。例如,C程序中出现在任何函数之外的声明使此变量带有其初值存放在初始化数据段中。
int A = 99;
- 非初始化数据段。通常将此段称为bss段,这一名称来源于一个早期的汇编运算符,意思是“block started by symbol”(由符号开始的块),在程序开始执行之前,内核将此段中的数据初始化为0或空指针。出现在任何函数外的C声明,使此变量存放在非初始化数据段中。
int b[128];
- 栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈可以递归调用C函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
void getNum() { }
- 堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和栈之间。(malloc函数在堆中申请 开辟内存空间)