[Linux C编程]进程控制

来源:互联网 发布:access2003数据库教程 编辑:程序博客网 时间:2024/06/03 20:10

进程控制

1.什么是进程?

进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元

2.进程与程序的区别?

·程序是放到磁盘的可执行文件进程是指程序执行的实例

·进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁

 移;而程序通常对应着文件、静态和可以复制。

·进程是暂时的,程序是长久的:进程是一个状态变化的过程,程序可长久保存。

·进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)

·进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个

进程可包括多个程序。

3.进程的生命周期?

创建:每个进程都是由其父进程创建进程可以创建子进程,子进程又可以创建子进程的子进程

运行:多个进程可以同时存在进程间可以通信

撤销:进程可以被撤销,从而结束一个程序的运行。

4.进程的状态?

执行状态:进程正在占用CPU

就绪状态:进程已具备一切条件,正在等待分配CPU的处理时间片

等待状态:进程不能使用CPU,若等待时间发生则可将其唤醒

 

5.Linux下进程地址空间?

Linux中的进程包含3个段,分别为:数据段、代码段、堆栈段

数据段:存放全局变量,常数、以及动态数据分配的数据空间

代码段:存放程序代码的数据

堆栈段:存放的是子程序的返回地址、子程序的参数以及程序的局部变量等。

 

6.什么是进程互斥?

进程互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。

7.什么是临界资源?

操作系统中将一次只允许一个进程访问的资源称为临界资源。

进程中访问临界资源的那段程序代码称为临界区,为实现对临界资源的互斥访问,应保证诸进程互斥地进入各自的临界区。

8.什么是进程同步?

一组并发进程按一定顺序执行的过程称为进程间的同步,具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。

9.进程的调度算法有哪些?什么是优先级反转?

概念:按一定算法,从一组待运行的进程中选出一个来占有CPU运行

调度方式:抢占式、非抢占式

调度算法:先来先服务调度算法

     短进程优先调度算法

      高优先级优先调度算法

     时间片轮转法

所谓优先级翻转问题(priority inversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任务抢先,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。

10.什么是进程死锁?

多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程将永远不能再向前推进。

11.进程获取ID函数

(1)getpid

函数的作用:获取进程识别码,进程号

函数的原型:pid_t  getpid(void);

返回值:目前进程的进程号;

头文件: #include  <unistd.h>

12.进程创建函数

(1)fork

函数的作用:创建一个进程

函数的原型:pid_t  fork(void);

函数的返回值:<0   出错;

         =0   表示当前创建的子进程

         >0   父进程  ,返回值是子进程的进程号

性质:

fork创建的子进程把父进程的资源拷贝了一份,父子进程把所有的重新执行一遍;

vfork创建的子进程和父进程共享数据空间, 不是重新拷贝

(2) vfork

函数的作用:建立一个新的进程;

函数的原型: pid_t vfork();

函数说明:vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量,已打开的文件代码,工作目录和资源限制等。

子进程不会继承父进程的文件锁定和未处理的信号。

特点:子进程先运行,退出,父进程才能运行

补:fork()和vfork()区别:

1.fork:子进程拷贝父进程的数据段

 vfork:子进程与父进程共享数据段

2.fork:父、子进程的执行次序不确定

 vfork:子程序先运行、父进程后运行

13.exec函数族

(1)execl

函数的作用: 执行一个文件,

函数原型: int execl(const char *path, const char *arg,..)

参数说明: path:代表的文件路径;

      arg:表示argv[0], argv[1],...

       最后一个以NULL结束;

返回值:成功函数没有返回,出错-1;

(2)execv

函数的作用:

函数原型:int exev(const char *path, char * const argv[])

函数的参数: path:代表的文件路径;

         argv:是一个数组里的指针传递过来;        

返回值: 成功不返还,出错-1

(3)system

函数的作用:执行一个命令

函数的原型: int system(const char * string);

14.进程等待函数

(1) wait

函数的作用: 进程的等待,阻塞进程,等待某个子进程退出;

函数的原型: pid_t wait(int *status);

返回值:成功返回子进程PID,出错-1;

(2) waitpid

函数的作用:会暂时停止目前进程的执行,知道有信号来到或子进程结束

函数的原型:pid_t  waitpid(pid_t pid , int *status, int options);

函数的参数:

  pid < -1:等待进程的Pid绝对值的任何的子进程;

  pid = -1: 任何子进程,---等于wait;

  pid = 0:等待进程组识别码与目前进程相同的任何子进程

  pid > 0: 等待子进程为pid的子进程退出

  options:

    WNOHANG:如果没有子进程退出,马上返回不等待

     WUNTRACED:如果子进程进入暂停执行情况,马上返回,

返回值:如果执行成功返回的是子进程的PID,失败-1;

    如果使用WNOHANG的时候,没有子进程退出,

15.进程退出函数

(1)exit  

函数的作用:正常结束进程

函数原型: void  exit(int status)

(2)_exit

函数作用:立即结束目前进程的执行

函数原型:void _exit(int status);

 

exit _exit用于终止进程

区别:_exit:直接使进程停止,清除其使用的内存,并清除缓冲区中内容

    exit:在停止进程之前,要检查文件的打开情况,并把文件缓冲区的内容写回到文件

才停止进程。

 

16.什么是僵尸进程?僵尸进程是如何产生的?如何避免僵尸进程?

僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸。

如果一个进程在其终止的时候,自己就回收所有分配给它的资源,系统就不会产生所谓的僵尸进程了。

僵尸进程产生过程:

1. 父进程调用fork创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。

2. 子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait() 系统调用来获取子进程的退出状态以及其它的信息。在 wait 调用之后,僵尸进程就完全从内存中移除。

3. 因此一个僵尸存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失,但如果编程不合理,父进程从不调用 wait 等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。

原创粉丝点击