第10课-进程控制
一.进程是一个具有独立功能的程序的一次运行活动。
二.特性:
(1)动态性
(2)异步性
(3)独立性
(4)并发性
三.三态:
1.就绪:任何时刻都只有一个进程在CPU运行,但是同一时刻有多个进程就绪。通过一定的算法将就绪的进程挑选出来,然后交给CPU执行。
2.执行:当进程被调度以后,就进入执行状态。
3.阻塞:进程的请求暂时得不到满足,就是阻塞状态。
4.在阻塞和执行之后都会在此回到就绪状态,等待下一次的调度。
四。进程ID:用来对进程进行标识。------PID
父进程-----PPID
启动进程的用户ID--------UID
五.进程互斥
若干进程同时访问同一资源,但是这个资源任意时刻只允许有一个进程访问他。则其他资源必须等待。直到占用该资源释的进程释放他为止。
六.临界资源
操作系统中同一时刻只允许一个进程访问的资源称为临界资源。
七.临界区:
进程中访问临界资源的那段代码叫做临界区。为实现对临界资源的互斥访问,应保证诸多进程互斥的进入各自的临界区。
八.进程同步:一组进程按照一定的顺序执行的过程就是进程间的同步。具有同步关系的这组进程叫做合作进程。
九.进程调度:按照一定的算法,从一组就绪的进程中选出一个占有CPU运行。
十。调度算法:
(1)
(2)按照调度时机,调度可以分为抢占式调度和非抢占式调度。这两个规则和前面说的四中调度算法共同决定操作系统中的进程调度。
十一.死锁:多个进程因为竞争资源而形成的僵局。导致这些进程都无法继续往前执行。
十二.getpid
十三.函数学习
4.1 创建进程
4.1.1 函数名
Fork
4.1.2 函数原形
pid_t fork(void);
4.1.3 函数功能
创建一个子进程
4.1.4 所属头文件
<unistd.h>
4.1.5 返回值
成功:在父进程中返回子进程的PI
在子进程中返回0
失败:父进程中返回-1
4.1.6 参数说明
无
4.1.7:工作原理:父进程调用fork以后会产生一个子进程,这个子进程会在内存中开辟一个空间,里面的代码和父进程的一样,只是她不从起始地址开始执行,而是从fork后面的代码开始执行。一般是父进程先执行,但其实不一定谁先谁后。子进程再执行。可以通过进程PID来区别父进程和子进程。大于0的就是父进程。相应的子进程拥有自己独立的数据段和栈。不和父进程共享。
4.2 创建进程
4.2.1 函数名
vfork
4.2.2 函数原形
pid_t vfork(void);
4.2.3 函数功能
创建一个子进程并且阻塞父进程
4.2.4 所属头文件
<sys/types.h>
<unistd.h>
4.2.5 返回值
成功:在父进程中返回子进程的PID
在子进程中返回0
失败:父进程中返回-1
4.2.6 参数说明
无
4.2.7:创建之后,子进程一定先运行。但是和父进程共享数据段和栈。
4.2.8:进程退出:void exit(int var)
父进程退出可以用return 和exit但是子进程只能用exit。一般情况下,正常退出用exit(0),异常退出用exit(1)
4.3 进程等待4.3.1 函数名
Wait4.3.2 函数原形
pid_t wait(int *status);4.3.3 函数功能
挂起调用它的进程,直到其子进程结束4.3.4 所属头文件
<sys/types.h><sys/wait.h>
4.3.5 返回值成功:返回终止的那个子进程的PID
失败:-14.3.6 参数说明
Status:记录子进程的退出状态。
4.4 执行程序
4.4.1 函数名Execl
4.4.2 函数原形int execl(const char *path, const char *arg, ...);
4.4.3 函数功能运行可执行文件
4.4.4 所属头文件 <unistd.h>
4.4.5 返回值成功:不返回
失败:返回-1.且宏定义errno会被设置。4.4.6 参数说明
Path:要运行的可执行程序的路径,虽然一直包含到文件,但是其后的第二个参数还要指出你要运行的文件。Arg:以及后面的参数都是可执行文件运行需要的参数。遇到空指针结束且一定要由NULL在最后。
4.4.7在调用execl以后,代码段会变化,保留原有的PID,不会产生新进程,执行新代码。但是fork是保留原代码,产生新的PID。