什么是程序,什么是进程,有什么区别
程序是静态的概念。gcc xxx.c -o pro 磁盘中生成的pro文件,叫做程序;桌面那些没有运行起来的图标就是程序
进程是程序的一次运行活动;桌面上某个程序运行起来就多了一个进程
进程是程序运行时的一个实例,是担当分配系统资源(CPU时间,内存等)的基本单位
在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。
程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的正真运行实例
什么是进程标识符
每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证
交换进程
Pid = 0; 作用:进程调度
Init进程
Pid = 1; 作用:系统初始化
僵尸进程
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程的退出状态,释放子进程占用的资源,此时子进程将成为一个僵尸进程
说白了就是,子进程比父进程先退出,父进程没有调用wait函数收集子进程的状态
孤儿进程
父进程执行完成或被终止,子进程仍然存活,那么这个子进程就是一个孤儿进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
什么叫父进程,什么叫子进程
进程A创建了进程B,那么进程A叫做父进程,进程B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系
c程序的存储空间是如何分配的
正文(代码段):由CPU执行的机器指令组成。通常,正文段是可共享的,在存储器中也只有一个副本,另外,正文段通常是只读的,防止程序由于意外修改其指令。
初始化数据(数据段):它包含了程序中需要明确赋初值的变量
未初始化的数据(BSS段):在程序开始执行之前,内核将此段中的数据初始化为0或空指针
堆:通常在堆中进行动态存储分配,比如malloc函数返回的内存地址都在堆中
栈:自动变量以及每次函数调用是所需保存的信息存放在栈中。每次函数调用时,其返回地址以及调用的环境信息都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间
命令行参数和环境变量:也就是argc、argv这些东西
什么是内存泄露
内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
比如:一直不断的用malloc开辟空间,而不去free掉malloc申请的空间
进程创建发生了什么事
全拷贝:将数据段,bss段,堆,栈,命令行参数和环境变量,打开的文件,IO流等全部拷贝。注意:父子进程并不共享堆,栈等这些存储空间,父子进程共享代码段
写时拷贝:比如:若数据段中有一个 a = 10;若子进程不对a = 10这个变量进行改变,那么父子进程去共享这个变量,并不会去拷贝它,而且内核将他们的访问权限改变为只读;只有子进程要对a = 10这个变量动手脚的时候(如:a+=10),子进程才会拷贝这个变量
创建子进程的一般目的
一个父进程希望复制自己,是父,子进程同时执行不同的代码段。这在网络服务进程中是常见的,比如:父进程等待客户端的服务请求,当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程继续等待下一个服务请求到达
一个进程要执行一个不同的程序。这对shell是常见的。在这种情况下,子进程从fork返回后立即掉用exec族函数-----------说白了就是在执行一个程序是,想要执行另一个可执行文件,可用exec族函数,也可用system