应用开发第三天进程控制(国嵌笔记)

来源:互联网 发布:windows激活工具原理 编辑:程序博客网 时间:2024/05/15 14:38
1.进程控制理论基础
1.进程是一个具有一定独立功能的程序的一次运行活动
进程和程序的区别:程序在运行时就是进程了。程序是静态的(在磁盘上存储着),
 特点:动态性,并发性,独立性,异步性
状态转换图:三态

就绪,阻塞,执行


进程ID:PID,PPID,UID(启动进程的用户ID)
进程互斥:
当有若干进程都需要使用某一共享资源时,任何时刻最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。
临界资源:
操作系统中将一次值允许一个进程访问的资源称为临界资源
临界区:
进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证诸进程互斥地进入各自的临界区 
进程同步:
一组并发进程按一定的顺序执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程。合作进程间相互发送的信号称为消息或事件
进程调度:
按照一定算法,从一组待运行的进程中选出一个来占有CPU运行。
调度方式:
抢占式,非抢占式
调度算法:
先来先服务调度算法
短进程优先调度算法
高优先级优先调度算法
时间片轮转法
死锁:
多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进

2.进程控制编程
1.获取ID
#include<sys/types.h>
#include<unistd.h>

pid_t getpid(void); //获取本进程ID
pid_t getppid(void); //获取父进程ID
2.创建进程 
1.fork
#include<unistd.h>
pid_t fork(void);//创建子进程
被调用一次却返回两次:
1.父进程中,返回子进程的PID
2.子进程中返回0
3.出现错误返回一个负值
会将fork之后的代码复制(此处复制非实际复制而是一个抽象意义上的复制->共享)一份开始执行,就是fork之后有两段相同的代码(代码段)执行。fork之后的代码子进程执行一次,父进程执行一次。但是是共享的代码段的代码
数据部分(数据段、栈等)拷贝一份。数据独立,代码共享
2.vfork
#include <sys/typrs.h>
#include <unistd.h>
pid_t vfork(void); //创建子进程

fork PK vfork
1.fork:子进程拷贝父进程的数据段
 vfork:子进程共享父进程的数据段
2.fork:父子进程的执行次序不确定
 vfork:子进程先运行,父进程后运行


vfork子进程执行完后才执行父进程。vfork函数产生的父子进程必定是子进程先运行完,父进程才会开始运行
3.exec函数族
1.exec用被执行的程序替换调用它的程序(不会产生新的进程)
区别:
fork创建一个新的进程,产生一个新的PID
exec启动一个新程序,替换原有的进程,因此进程的PID不会改变
2.常见的exec函数
1.execl(path,arg1,...); path 被执行程序名(含有完整路径),arg1-argn 被执行程序所需的命令行参数,含程序名,以空指针(NULL)结束
  eg:execl("/bin/ls","ls","-al","/etc/passwd",(char *)0);
2.execlp(path,arg1-argn); path被执行的程序名(不含路径,将从path环境变量中查找该程序),arg1-argn 同上
` 3.execv(path argv[]);path 被执行的程序(含完整路径),argv被执行程序所需的命令行参数数组
4.int system(const char* string)
调用fork产生子进程,由子进程来调用/bin/sh -c string 来执行参数string所代表的命令
eg:system("ls -al /etc/passed");
exec函数族会在一个进程中启动另一个程序执行。并用他来取代调用进程的数据段、代码段、和锥栈段。在执行完exec函数调用后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。
4.进程等待
#include<sys/types.h>
#include<sys/wait.h>

pid_t wait(int* status);
   阻塞该进程,直到其中某个子进程退出
waitpid()    

//使父进程阻塞,等待子进程退出,来确保子进程先结束。




if(pc==0)
{··· }
else{
pr=wait(NULL);
···
}
都是子进程先执行父进程再执行
0 0
原创粉丝点击