进程控制89704

上传人:小** 文档编号:62397119 上传时间:2018-12-20 格式:PPT 页数:38 大小:108.50KB
返回 下载 相关 举报
进程控制89704_第1页
第1页 / 共38页
进程控制89704_第2页
第2页 / 共38页
进程控制89704_第3页
第3页 / 共38页
进程控制89704_第4页
第4页 / 共38页
进程控制89704_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《进程控制89704》由会员分享,可在线阅读,更多相关《进程控制89704(38页珍藏版)》请在金锄头文库上搜索。

1、进程控制,进程控制理论基础 进程控制编程,定义,进程是一个具有一定独立功能的程序的一次运行活动。,特点,动态性 并发性 独立性 异步性,状态,进程ID,进程ID(PID):标识进程的唯一数字 父进程的ID(PPID) 启动进程的用户ID(UID),进程互斥,进程互斥是指当有若干进程都要使用某 一共享资源时,任何时刻最多允许一个 进程使用,其他要使用该资源的进程必 须等待,直到占用该资源者释放了该资 源为止。,临界资源,操作系统中将一次只允许一个进程访问的资源称为临界资源。,临界区,进程中访问临界资源的那段程序代码称 为临界区。为实现对临界资源的互斥访 问,应保证诸进程互斥地进入各自的临 界区。

2、,进程同步,一组并发进程按一定的顺序执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。,进程调度,概念: 按一定算法,从一组待运行的进程中选出一个来占有CPU运行。 调度方式: 抢占式 非抢占式,调度算法,先来先服务调度算法 短进程优先调度算法 高优先级优先调度算法 时间片轮转法,死锁,多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。,获取ID,#include #include pid_t getpid(void) 获取本进程ID。 pid_t getppid(void) 获取父进程ID。,获取ID,#

3、include #include #include int main(void) printf(“PID=%dn“,getpid(); printf(“PPID=%dn“,getppid(); return 0; ,进程创建,#include pid_t fork(void) 功能: 创建子进程fork的奇妙之处在于它被调用一次,却返回两次,它可能有三种不同的返回值: 1.在父进程中,fork返回新创建的子进程的PID; 2.在子进程中,fork返回0; 3.如果出现错误,fork返回一个负值,进程创建,#include #inlcude main() pid_t pid; /*此时仅有一个进

4、程*/ pid=fork(); /*此时已经有两个进程在同时运行*/ if(pid0) printf(“error in fork!“); else if(pid=0) printf(“I am the child process,ID is%dn“,getpid(); else printf(“I am the parent process,ID is%dn“,getpid(); ?执行后的结果?,进程创建,$./fork_test I am the parent process,my process ID is 1991 I am the child process,my process

5、ID is 1992 在pid=fork()之前,只有一个进程在执行,但在这条语句执行之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是f(pid=0)。两个进程中,原先就存在的那个进程被称作“父进程”,新出现的那个进程被称作“子进程”,父子进程的区别在于进程标识符(PID)不同。,进程创建思考运行结果?,#include #include int main(void) pid_t pid; int count=0; count+; pid=fork(); printf(“This is first time,pid=%dn“,pid); printf(“Th

6、is is second time,pid=%dn“,pid); count+; printf(“count=%dn“,count); if(pid0) printf(“This is parent process,the child has the pid:%dn“,pid); else if(!pid) printf(“This is the child process.n“); else printf(“fork failed.n“); printf(“This is third time,pid=%dn“,pid); printf(“This is fouth time,pid=%dn

7、“,pid); return 0; ,进程创建思考运行结果?,父进程的数据空间、堆栈空间都会给子进 程一个拷贝,而不是共享这些内存。在子 进程中对count进行自加1的操作,但是并 没有影响到父进程中的count值,父进程 中的count值仍然为0。,进程创建,#include #include pid_t vfork(void) 功能:创建子进程。,创建进程,区别: 1.fork要拷贝父进程的数据段;而vfork则 不需要完全拷贝父进程的数据段,子进程 与父进程共享数据段。 2.fork不对父子进程的执行次序进行任何限 制;而在vfork调用中,子进程先运行, 父进程挂起。,进程创建,#in

8、clude #include #include main() int count=1; int child; printf(“Before create son,the fathers count is:%dn”,count); if(!(child=vfork() printf(“This is son,his pid is:%d and the count is:%dn“,getpid(),+count); exit(1); else printf(“After son,This is father,his pid is:%d and the count is:%d,and the chi

9、ld is:%dn“,getpid(),count,child); ,执行程序,exec用被执行的程序替换调用它的程序。 区别: fork创建一个新的进程,产生一个新的PID。 exec启动一个新程序,替换原有的进程,因此进程的PID不会改变,和调用exec函数的进程一样。,执行程序,#include int execl(const char*path,const char* arg,) 功能: 运行参数path所指定的可执行文件,接下 来的参数代表执行该文件时传递过去的 argv0、argv1,最后一个参数必须 用空指针(NULL)作结束。,执行程序,#include main() exec

10、l(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char*)0); ,执行程序,#include int execlp(const char*file,const char*arg,) 功能: 从PATH环境变量所指的目录中查找符合参数 file的文件名,找到后便执行该文件,然后将 第二个以后的参数当做该文件的argv0、 argv1,最后一个参数必须用空指针 (NULL)作结束。,执行程序,#include main() execlp(”ls”,”ls”,”- al”,”/etc/passwd”,(char*)0); ,执行程序,#include int exec

11、v(const char*path,char*const argv) 功能: 执行参数path所指定的文件,与execl()不同的 地方在于execve()只需两个参数,第二个参数 利用数组指针来传递给执行文件。,执行程序,#include main() char*argv=“ls”,”- al”,”/etc/passwd”,(char*)0; execv(“/bin/ls”,argv); ,执行程序,#include int system(const char*string) 功能: 调用fork()产生子进程,由子进程来调用 /bin/sh-c string来执行参数string字符串 所

12、代表的命令。,执行程序,include main() system(“ls-al/etc/passwd /etc/shadow”); ,等待,#include #include pid_t wait(int*status) 功能: 进程一旦调用了wait,就立即阻塞自己,直到自 己的某个子进程退出,如果没有找到这样一个子 进程,wait就会一直阻塞在这里,直到有一个出 现为止。,等待,#include #include #include #include main() pid_t pc,pr; pc=fork(); if(pc0)/*如果出错*/ printf(“error ocurred!n

13、“); else if(pc=0)/*如果是子进程*/ printf(“This is child process with pid of%dn“,getpid(); sleep(10);/*睡眠10秒钟*/ else/*如果是父进程*/ pr=wait(NULL);/*在这里等待*/ printf(“I catched a child process with pid of%dn“),pr); exit(0); ,等待,#include #include pid_t waitpid(pid_t pid,int*status,int options) 功能: 进程一旦调用了wait,就立即阻塞

14、自己,直到自 己的某个子进程退出,如果没有找到这样一个子 进程,wait就会一直阻塞在这里,直到有一个出 现为止。,等待,当pid取不同的值时,有不同的意义: 1.pid0时,只等待进程ID等于pid的子进程,不管其它已 经有多少子进程运行结束退出了,只要指定的子进程还 没有结束,waitpid就会一直等下去。 2.pid=-1时,等待任何一个子进程退出,没有任何限制, 此时waitpid和wait的作用一模一样。 3.pid=0时,等待同一个进程组中的任何子进程。 4.pid-1时,等待一个指定进程组中的任何子进程,这个 进程组的ID等于pid的绝对值。,等待,参数option可以为0或下面

15、的OR组合: WNOHANG: 如果没有任何已经结束的子进程则马上返 回,不予以等待。 WUNTRACED: 如果子进程进入暂停执行情况则马上返回。,发送信号,#include #include int kill(pid_t pid,int sig) 功能: 发送参数sig指定的信号给参数pid指定的进程 pid0将信号传给进程识别码为pid的进程 pid=0将信号传给和目前进程相同进程组的所有进程 pid=-1将信号广播传送给系统内所有的进程 pid0将信号传给进程组识别码为pid绝对值的所有进程,退出,exit和_exit用于中止进程: _exit的作用:直接使进程停止运行,清除其 使用的内存空间,并清除其在内核中的数据结 构。 exit与_exit函数不同,使进程停止运行之前要 检查文件打开情况,并把文件缓冲区的内容写 回文件中去之后才停止进程。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号