欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《进程控制开发》PPT课件.ppt

    • 资源ID:4859919       资源大小:928.50KB        全文页数:68页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《进程控制开发》PPT课件.ppt

    第7章 进程控制,Linux进程概述 Linux进程控制编程 Linux守护进程实验,进程的定义,进程的参考定义有如下几种:1、进程是程序的一次执行过程;2、进程=PCB+程序+数据;3、进程是一个可拥有资源的独立实体,同时又是一个可以独立调度的基本单位。,进程与程序的区别,动态性与静态进程由“创建”而产生,由“调度”而执行;由得不到资源而阻塞;由撤消而消亡。而程序是静态的,是完成某个特定功能的指令的有序序列,我们把程序看成是一个菜谱,而进程则是按照菜谱进行烹调的过程。结构特征从结构上看,每个进程是由程序段、数据段和进程控制块三部分组成,总称“进程映像”。程序无控制块。,进程与程序的区别,并发性多个进程实体,同存于内存中,能在一段时间内同时执行;程序是不能并发执行的,只有建立了进程,才能并发执行。独立性。进程是系统进行资源分配和调度的一个独立单位;程序则不是。进程具有创建其它进程的功能,小结,进程的状态,进程通常有3种状态。执行态:该进程正在运行,即进程正在占用CPU。就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间片。等待态:进程不能使用CPU,若等待事件发生(等待的资源分配到)则可将其唤醒。,Linux进程状态,Linux进程状态及转换,fork(),TASK_RUNNING,就绪,TASK_INTERRUPTIBLE,浅度睡眠,TASK_UNINTERRUPTIBLE,深度睡眠,TASK_STOPPED,暂停,TASK_ZOMBIE,僵死,占有,CPU,运行,do_exit(),schedule(),ptrace(),schedule(),时间片耗尽,等待资源到位,sleep_on(),schedule(),等待资源到位,interruptible_sleep_on(),schedule(),资源到位,wake_up_interruptible(),或收到信号,wake_up(),资源到位,wake_up(),收到信号,SIGCONT,wake_up(),TASK_RUNNING,进程控制块,进程控制块是进程存在的标志,每一进程都有一进程控制块,Linux中用数据结构task_struct表示,并将指向每个进程控制块的指针保存在一个数组task中,数组下标的最大值为512,表明Linux允许的进程数最多可有 512个。Linux进程控制块也叫进程描述符(Process Descriptor),进程控制块信息分类,状态信息描述进程状态的变化。链接信息描述进程的父子关系。各种标识符用简单数字对进程进行标识。进程间通信信息描述多个进程在同一任务上协作工作。时间和定时器信息描述进程在生存周期内使用CPU时间的统计、计费等信息。调度信息描述进程优先级、调度策略等信息。文件系统信息对进程使用文件情况进行记录。虚拟内存信息描述每个进程拥有的地址空间。处理器环境信息描述进程的执行环境(处理器的寄存器及堆栈等),struct task_struct volatile long state;struct thread_info*thread_info;atomic_t usage;unsigned long flags;unsigned long ptrace;int lock_depth;#if defined(CONFIG_SMP),Linux进程控制块数据结构,unsigned long long timestamp,last_ran;unsigned long long sched_time;int activated;unsigned long policy;cpumask_t cpus_allowed;unsigned int time_slice,first_time_slice;#ifdef CONFIG_SCHEDSTATSstruct sched_info sched_info;#endifstruct list_head tasks;struct list_head ptrace_children;struct list_head ptrace_list;struct mm_struct*mm,*active_mm;struct linux_binfmt*binfmt;,Linux进程控制块数据结构,long exit_state;int exit_code,exit_signal;int pdeath_signal;unsigned long personality;unsigned did_exec:1;pid_t pid;pid_t tgid;struct task_struct*real_parent;struct task_struct*parent;struct list_head children;struct list_head sibling;struct task_struct*group_leader;,Linux进程控制块数据结构,struct pid pidsPIDTYPE_MAX;struct completion*vfork_done;int _user*set_child_tid;int _user*clear_child_tid;unsigned long rt_priority;cputime_t utime,stime;unsigned long nvcsw,nivcsw;struct timespec start_time;unsigned long min_flt,maj_flt;cputime_t it_prof_expires,it_virt_expires;unsigned long long it_sched_expires;struct list_head cpu_timers3;uid_t uid,euid,suid,fsuid;gid_t gid,egid,sgid,fsgid;struct group_info*group_info;,Linux进程控制块数据结构,kernel_cap_t cap_effective,cap_inheritable,cap_permitted;unsigned keep_capabilities:1;struct user_struct*user;#ifdef CONFIG_KEYSstruct key*thread_keyring;unsigned char jit_keyring;#endifint oomkilladj;char commTASK_COMM_LEN;int link_count,total_link_count;struct sysv_sem sysvsem;struct thread_struct thread;struct fs_struct*fs;,Linux进程控制块数据结构,struct files_struct*files;struct namespace*namespace;struct signal_struct*signal;struct sighand_struct*sighand;sigset_t blocked,real_blocked;struct sigpending pending;unsigned long sas_ss_sp;size_t sas_ss_size;int(*notifier)(void*priv);void*notifier_data;sigset_t*notifier_mask;void*security;struct audit_context*audit_context;seccomp_t seccomp;u32 parent_exec_id;u32 self_exec_id;,Linux进程控制块数据结构,spinlock_t alloc_lock;spinlock_t proc_lock;void*journal_info;struct reclaim_state*reclaim_state;struct dentry*proc_dentry;struct backing_dev_info*backing_dev_info;struct io_context*io_context;unsigned long ptrace_message;siginfo_t*last_siginfo;wait_queue_t*io_wait;u64 rchar,wchar,syscr,syscw;,Linux进程控制块数据结构,#if defined(CONFIG_BSD_PROCESS_ACCT)u64 acct_rss_mem1;u64 acct_vm_mem1;clock_t acct_stimexpd;#endif#ifdef CONFIG_NUMA struct mempolicy*mempolicy;short il_next;#endif#ifdef CONFIG_CPUSETSstruct cpuset*cpuset;nodemask_t mems_allowed;int cpuset_mems_generation;#endifatomic_t fs_excl;,Linux进程控制块数据结构,每个进程都有一个唯一的标识符PID,内核通过这个标识符来识别不同的进程,用户程序通过PID对进程发号施令,PID是32位的无符号整数,它被顺序编号,1、2、.、32767每个进程都属于某个用户组。task_struct结构中还定义有用户标识符UID(User Identifier)和组标识符GID(Group Identifier)这两种标识符用于系统的安全控制,系统通过这两种标识符控制进程对系统中文件和设备的访问。,进程标识符PID,Linux下进程地址空间,Linux系统是一个多进程的系统,每个进程都是一个独立的运行单位,运行在独立的虚拟地址空间,即使一个进程发生异常,它也不会影响到系统中的其他进程。Linux下进程地址空间包含3个段,分别为“数据段”、“代码段”和“堆栈段”。数据段:存放全局变量、常数以及动态分配的数据。数据段又可以再分成普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常量)、BSS数据段(存放未初始化的全局变量)以及堆(存放动态分配的数据)。代码段:存放程序代码。堆栈段:存放子程序的返回地址、参数以及程序的局部变量等。,Linux下进程地址空间,Linux下进程的运特模式,在Linux系统中,进程的执行模式划分为用户模式和内核模式用户模式:若进程执行的是用户程序、应用程序或者内核之外的系统程序,则处在该模式下,也称为用户态内核模式:用户程序执行中出现系统调用或者发生中断事件,就要运行核心程序,进程模式就转变为内核模式,也称进入核心态内核模式下运行的进程可以执行机器的特权指令,访问受操作系统保护的资源,第7章 进程控制,Linux进程概述 Linux进程控制编程 Linux守护进程实验,创建进程,fork(),fork1.c.#include#include#include int main()pid_t pid;char*message;int n;printf(“fork program startingn”);pid=fork();,switch(pid)case-1:perror(“fork failed”);exit(1);case 0:message=“This is the child”;n=5;break;default:message=“This is the parent”;n=3;break;for(;n 0;n-)puts(message);sleep(1);exit(0);,示例补1,$./fork1fork program startingThis is the parentThis is the childThis is the parentThis is the childThis is the parentThis is the child$This is the childThis is the child,fork()从已存在的进程中创建一个称为子进程的新进程,而原进程称为父进程。fork()使用“写时复制”技术产生新进程。即只复制父进程的控制块、内核栈与页表并作必要修改即产生一个新/子进程。让子进程共享父进程的地址空间,包括代码段、进程堆栈、内存信息、打开的文件描述符、资源限制和控制终端等。当父、子进程中有一个要写入时才进行复制/增加一个拷贝,如果子进程产生后立即调用exec()函数,就可避免写时拷贝的额外开销。,父子两个进程运行同一个程序,与创建进程的初衷相左,因此需要用一种方式来区分它们,并使它们运行不同的程序,否则,这两个进程不可能做不同的事。什么方式?条件或分支指令exec()函数,进程结构,进程创建,代码,数据,mm_struct,task_struct,vm_area_struct,mm,vmmap,进程地址空间,pdg,页表,物理内存,父进程,写时复制;让子进程先运行,其可能会执行exec()读入其代码执行.,进程创建,mm_struct,vm_area_struct,vmmap,pdg,页表,fork(),进程结构,进程创建,代码,数据,mm_struct,task_struct,vm_area_struct,mm,vmmap,进程地址空间,pdg,页表,物理内存,task_struct,mm,父进程,子进程,vfork(),exec函数族(1),exec函数族提供了一个在进程中启动另一个程序运行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。,使用exec函数族主要有两种情况 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生;如果一个进程想执行另一个程序,那么它就可以调用fork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。,exec函数族(2),exec函数族对应位的含义,exec函数族中各位的含义,示例,阅读并运行示例7-2-2-1阅读并运行示例7-2-2-2阅读并运行示例7-2-2-3阅读并运行示例7-2-2-4,/*execlp.c*/#include#include#include int main()int ret;if(ret=fork()=0)/*调用execlp函数,这里相当于调用了ps-ef命令*/if(ret=execlp(ps,ps,-ef,NULL)0)printf(Execlp errorn);return ret;,/*execl.c*/#include#include#include int main()int ret;if(ret=fork()=0)/*调用execl函数,注意这里要给出ps程序所在的完整路径*/if(ret=execl(/bin/ps,ps,-ef,NULL)0)printf(Execl errorn);return ret;,/*execle.c*/#include#include#include int main()/*命令参数列表,必须以NULL结尾*/char*envp=PATH=/tmp,USER=david,NULL;if(fork()=0)/*调用execle函数,注意这里也要指出env的完整路径*/if(execle(/usr/bin/env,env,NULL,envp)0)printf(Execle errorn);,$./execlePATH=/tmpUSER=david,/*evecve.c*/#include#include#include int main()/*命令参数列表,必须以NULL结尾*/char*arg=env,NULL;char*envp=PATH=/tmp,USER=david,NULL;if(fork()=0)if(execve(/usr/bin/env,arg,envp)0)printf(Execve errorn);,$./execlePATH=/tmpUSER=david,exit()和_exit()(1),exit()和_exit()函数都是用来终止进程的。_exit()函数的作用是直接调用exit系统调用使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit()函数在执行退出之前还要多做一些工作,即在调用exit系统之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的“清理I/O缓冲”一项。,由于在Linux的标准函数库中,有一种被称作“缓冲I/O(buffered I/O)”操作,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时,会连续读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件的时候,也仅仅是写入内存中的缓冲区,等满足了一定的条件(如达到一定数量或遇到特定字符等),再将缓冲区中的内容一次性写入文件。,exit()和_exit()(2),这种技术大大增加了文件读写的速度,但也为编程带来了一些麻烦。比如有些数据,认为已经被写入到文件中,实际上因为没有满足特定的条件,它们还只是被保存在缓冲区内,这时用_exit()函数直接将进程关闭,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,就一定要使用exit()函数。,/*exit.c*/#include#include int main()printf(Using exit.n);printf(This is the content in buffer);exit(0);,/*_exit.c*/#include#include int main()printf(Using _exit.n);printf(This is the content in buffer);_exit(0);,./exitUsing exit This is the content in buffer$,./_exitUsing exit$,示例7-2-3,Printf()缓冲I/O方式,遇到“n”时自动从缓中区中将数据读出,教材关于exit()的小知识不正确。,调用exit()后,进程处于僵死状态(TASK_ZOMBIE),释放除内核栈与控制块task_struct外的所有资源,直到父进程调用wait()后才释放全部资源。,wait()和waitpid()(1),wait()函数是用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者接到了一个指定的信号为止。如果该父进程没有子进程或者他的子进程已经结束,则wait()就会立即返回。,waitpid()的作用和wait()一样,但它并不一定要等待第一个子进程的终止,可以通过选项设置它的行为,如可提供一个非阻塞版本的wait()功能。实际上wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。,wait()和waitpid()(2),wait.c.#include#include#include#include int main()pid_t pid;char*message;int n;int exit_code;printf(“fork program startingn”);pid=fork();,switch(pid)case-1:perror(“fork failed”);exit(1);case 0:message=“This is the child”;n=5;exit_code=37;break;default:message=“This is the parent”;n=3;exit_code=0;break;for(;n 0;n-)puts(message);sleep(1);exit(0);,示例补,被取代,$./fork1fork program startingThis is the parentThis is the childThis is the parentThis is the childThis is the parentThis is the child$This is the childThis is the child,$./waitfork program startingThis is the childThis is the parentThis is the parentThis is the childThis is the parentThis is the childThis is the childThis is the childChild has finished:PID=1582Child exited with code 37$,示例,阅读并执行示例7-2-4,/*waitpid.c*/int main()pid_t pc,pr;pc=fork();if(pc 0)printf(Error forkn);else if(pc=0)/*子进程*/*子进程暂停5s*/sleep(5);/*子进程正常退出*/exit(0);,else/*父进程*/*循环测试子进程是否退出*/do pr=waitpid(pc,NULL,WNOHANG);/*父进程不阻塞*/if(pr=0)/*若子进程还未退出,则父进程暂停1s*/printf(The child process has not exitedn);sleep(1);while(pr=0);if(pr=pc)printf(Get child exit code:%dn,pr);else printf(Some error occured.n);,The child process has not exitedThe child process has not exitedThe child process has not exitedThe child process has not exitedThe child process has not exitedGet child exit code:75,当pr=waitpid(pc,NULL,0)or pr=wait(NULL)时,输出?,第7章 进程控制,Linux进程概述 Linux进程控制编程 Linux守护进程实验,Linux守护进程,守护进程:后台服务进程Daemon进程,是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,守护进程常常在系统引导载入时启动,在系统关闭时终止。Linux有很多系统服务,大多数服务都是通过守护进程实现的,如第二章讲到多种系统服务都是守护进程。守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等也都是守护进程。,Linux中每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才会退出。如果想让某个进程不因为用户、终端或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。,守护进程 的编写流程,会话期是一个或多个进程组的集合。一个会话始于用户登录,止于用户退出,此期间该用户运行的所有进程都属于这个会话期。,1,2,3,4,5,/*dameon.c 创建守护进程实例*/int main()pid_t pid;int i,fd;char*buf=This is a Daemonn;pid=fork();/*第一步*/if(pid 0)exit(0);/*父进程推出*/setsid();/*第二步*/chdir(/);/*第三步*/umask(0);/*第四步*/,for(i=0;i getdtablesize();i+)/*第五步*/close(i);/*这时创建完守护进程,以下开始正式进入守护进程工作*/while(1)if(fd=open(/tmp/daemon.log,O_CREAT|O_WRONLY|O_APPEND,0600)0)printf(Open file errorn);exit(1);write(fd,buf,strlen(buf)+1);close(fd);sleep(10);exit(0);,$tail f/tmp/dawmon.logThis is a DaemonThis is a DaemonThis is a DaemonThis is a Daemon$ps ef|grep daemon 76 root 1272 S./daemon 85 root 1520 S grep daemon,守护进程的出错处理,由于守护进程完全脱离了控制终端,因此,不能像其他普通进程一样将错误信息输出到控制终端来通知程序员。守护进程的一种通用的办法是使用syslog服务,将程序中的出错信息输入到系统日志文件中,从而可以直观地看到程序的问题所在。syslog是Linux中的系统日志管理服务,通过守护进程syslogd来维护。该守护进程在启动时会读一个配置文件“/etc/syslog.conf”。该文件决定了不同种类的消息会发送向何处。例如,紧急消息可被送向系统管理员并在控制台上显示,而警告消息则可被记录到一个文件中。,守护进程的出错处理,openlog()函数用于打开系统日志服务的一个连接;syslog()函数是用于向日志文件中写入消息,在这里可以规定消息的优先级、消息输出格式等;closelog()函数是用于关闭系统日志服务的连接。,第7章 进程控制,Linux进程概述 Linux进程控制编程 Linux守护进程实验,第7章 进程控制-要求,掌握进程相关的基本概念 掌握Linux下的进程结构 掌握Linux下进程创建及进程管理 掌握Linux下进程创建相关的系统调用 掌握守护进程的概念 掌握守护进程的输出及建立方法 学会编写多进程程序 学会编写守护进程,实验1 多进程程序(1),1实验目的通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。2实验内容 该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls-l”指令,另一个子进程在暂停5s之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回。,实验1 多进程程序(2),实验2 守护进程(1),1实验目的通过编写一个完整的守护进程,使读者掌握守护进程编写和调试的方法,并且进一步熟悉如何编写多进程程序。2实验内容在该实验中,读者首先建立起一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。在这里,子进程和守护进程的退出消息都在系统日志文件(例如“/var/log/messages”,日志文件的全路径名因版本的不同可能会有所不同)中输出。子进程退出后,守护进程循环暂停,其间隔时间为10s。,实验2 守护进程(2),

    注意事项

    本文(《进程控制开发》PPT课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开