一. 进程控制中的专有名词
多用户:多个用户同一时间使用计算机
多任务:同时执行几个任务,并且可以在还没有执行完一个任务的时候执行另一个任务
程序:静态,保存在硬盘上的可执行代码
进程:动态,运行中的程序,表示过程(操作系统资源管理的最小单位)
线程:在进程内部,比进程更小的能独立运行的基本单位
实际用户:标识运行该进程的用户
有效用户:标识来运行该进程的用户身份
父进程和子进程:相当于父亲和儿子
二. 如何获取进程标识符呢?
可以使用下面这几个函数:
三. Linux进程是由那些组成的?
Linux中一个进程由三部分组成:代码段,数据段,堆栈段
从内存的低地址到高地址依次为:
代码段:二进制机器代码
数据段:存储已被初始化的变量,包括全局变量和已被初始化的静态变量
未初始化数据段:存储未被初始化的静态变量,又称BBS
堆:用于存放程序运行中动态分配的变量
栈:用于函数调用,保存函数的返回地址,函数的参数,函数内部定义的局部变量
四.进程有有哪些状态?
运行状态、可中断等待状态、不可中断等待状态、僵死状态、停止状态
五.Linux下程序是如何转化为进程的呢?
内核将程序读入内存,为程序分配内存空间
内核为该进程分配进程标识符pid和其他所需资源
内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行.程序转化为进程后就可以被操作系统的调度程序调度执行了
六.可执行程序和内存映像的区别:
1.可执行程序位于硬盘,内存映像位于内存
2.可执行程序没有堆栈(程序被加载到内存中才会分配堆栈)
3.可执行程序中未初始化数据段并不储存在位于硬盘中的可执行文件中
4.可执行程序是静态的,不变的,内存映像动态变化
七. 如何创建一个进程
①由操作系统创建:进程之间平等,不存在资源继承
PS.在系统启动时,操作系统会创建一些进程,承担着管理和分配系统资源的任务,通常被称为系统进程
②由父进程创建:子进程,继承父进程
fork函数:
#include<sys/types.h>#include<unistd.h>
pid_t fork(void);
这个函数可以说是很特殊了,它有两个返回值,调用一次返回两次。其实就相当于fork一个进程之后,当前进程分裂为两个,一个父进程,一个刚刚fork的子进程;一个返回值是父进程调用fork函数后的返回值,即刚刚创建的子进程的ID,另一个是子进程中fork函数的返回值,该返回值是0
若进程创建失败,则只返回一个-1,失败原因通常是父进程拥有的子进程的个数超过了规定的限制,此时errno为EAGAIN;可供使用的内存不足也会导致进程创建失败,此时errno为ENOMEN
所以可以通过返回值来区别父进程和子进程:父进程返回子进程ID,子进程返回0
八.什么是孤儿进程呢?
如果一个子进程的父进程先于子进程结束,子进程就成为一个孤儿,它有init进程收养,成为其子进程
九.什么是守护进程呢?
指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,通常周期性地执行某种任务。Linux的大多数服务器都是使用守护进程的方式实现。
十.什么是僵尸进程?
当子进程先于父进程终止,而父进程又没有调用wait函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启.子进程处于僵死状态,内核只保存该进程的一些必要信息以备父进程所需.此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数;如果子进程先于父进程终止,且父进程调用了wait或waitpid函数,则父进程会等待子进程结束