进程理论基础
进程的定义:进程是一个具有特定功能的程序的一次运行活动。它和程序的区别在于:程序是存储在硬盘上的,是静态的;而进程是程序的执行。
进程特点:动态性 ,并发性 ,独立性 , 异步性 。
进程三态:就绪态,执行态,阻塞态。
进程的标识:用进程ID号来区分不同的进程。进程ID用PID表示,父进程ID用PPID表示,用户ID用UID表示。
进程互斥:是指当多个进程都要使用某一共享资源时,任何时刻做多允许一个进程使用,其它要使用该资源的进程必须要等待,直到占有该资源的进程结束为止。
临界资源:操作系统讲一次只允许一个进程访问的资源称为临界资源。
临界区:程序中,访问临界资源的那段代码称为临界区。
进程同步:一组并发进程按一定色顺序执行的过程称为进程的同步。具有同步关系的一组进程称为合作进程,合作进程之间互相发送的信号称为消息或事件。
进程调度:按一定的算法,从一组待运行的进程中选出一个来占用CPU。调度方式有抢占式和非抢占式两种。调度的算法有:先来先服务调度算法;短进程优先调度算法;高优先级优先调度算法;时间片轮转法。
死锁:多个进程因竞争资源而导致的一种僵局,若无外力作用,这些进程都将永远不能向前推进。
进程控制编程
1:获取ID
#include<sys/types.h>
#include<unistd.h>
pid_t getpid(void); //获取当前运行的进程的ID号
pid_t getppid(void); //获取当前运行进程的父进程的ID号。
2: fork 函数
int fork()
1) 返回值-1,出错。
2) 返回值 0,表示子进程
3) 否则为 父进程,且该返回值是子进程的pid。
3 :vfock 函数
int vfork()
1) 返回值-1,出错。
2) 返回值 0,表示子进程
3) 否则为 父进程,且该返回值是子进程的pid
4) vfork 与 fork 区别:vfork必定是子进程先执行完,父进程再执行,fork则不一定;vfork中子进程与父进程共用数据段,所以变量之间相互影响,fork函数从父进程拷贝了一段数据段,所以不会有影响。
4: wait(null)与waitpid(pid,null,0)函数。
头文件为 #include <sys/types.h> 和 #include<sys/wait.h>
用于阻塞一个进程。如果是wait,那么只有当该进程的某个子进程退出以后,它才会继续执行。而waitpid则指定了子进程的ID,只有这个指定ID的子进程结束了,它才会继续执行。
5: exec函数族
exec用指定的程序替换调用它的程序。和fork的区别:fork是产生了一个新的进程,新进程的ID号是新的。而exec是替换进程,并且替换之后,进程的ID号不会变。
#include <unistd.h>
execl("bin/ls","ls","-l","etc/password",char *0);
execlp("ls","ls","-l","etc/password",char *0);
以上两个函数,它们的第一个参数为被执行的程序名。所不同的是exexl必须有完整的路径名称。而execlp则不需要完整的路径名称,它会到系统的path路径去寻找。后面的参数就是执行这个命令所需要的参数。最后一个参数以空指针结尾。
execv("bin/ls",argv); 其中char *argv[]={"ls","-l","etc/password",char *0};也就是说execv把execl后面的参数以及最后的空指针都用一个字符串数组给代替了。