***main函数的运行原理:
程序在编译链接时使用链接器,运行时使用加载器。
main的两个参数:argc、argv。当我们程序正常的编译成功后执行时,需要我们传入需要执行一定的参数(例如:./a.out),参数传入后传给加载器,加载器在加载运行程序时会将参数传给程序的引导代码,引导代码在执行完毕之后再将参数传给main函数,然后执行main函数。
***进程终止函数:
正常的终止:return exit _exit
差异:return和exit效果相同,都会执行程序终止处理函数;
_exit终止程序时不会执行atexit注册的进程终止处理函数。
非正常终止:atexit(func())注册新进程终止处理函数
用法:在函数返回时调用atexit内的函数,atexit注册多个进程终止处理函数,这些函数指针存放在栈内,新的指针会对之前的指针进行压栈操作,使得先注册的后执行,后注册的先执行。
例程:
/*********************************************************************************
#include <stdio.h>
#include <stdlib.h>
void func1(void)
{
printf("1111\n");
}
void func2(void)
{
printf("2222\n");
}
int main
{
printf("hello word\n");
atexit(func1);
atexit(func2);
printf("word hi \n");
return 0;
}
output: hello word
word hi
2222
1111
*****************************************************************************/
***进程运行的虚拟地址空间:
操作系统的每个进程在独立地址空间中运行,每个进程的逻辑地址为4G(32位),使用的方法就是虚拟地址映射。
进程隔离使得多个进程可以同时运行:每一个进程会从虚拟地址的0地址开始执行我们的程序,进行我们的进程。
***进程的概念:
是程序的一次运行过程,是一个动态的过程,不是静态实物。
声明周期是程序开始运行到结束。
进程控制块:PCB,内核中专门用来管理一个进程的数据结构。
进程ID:进程的标识符(相当于文件描述符)
进程ID的获取方法:getpid getppid geteuid getgid getdgid
注:某一个进程的进程ID在进程进行完毕后会被丢掉,再次执行这个进程时操作系统会从当前的进程ID开始为你重新分配一个进程ID。
多进程的调度原理:操作系统同时运行多个进程,在宏观上由于进程时间非常的短,所以看起来是并行的,但是咋微观上是串行的,进程的执行是有前后的顺序。