Linux进程编程_第1页
Linux进程编程_第2页
Linux进程编程_第3页
Linux进程编程_第4页
Linux进程编程_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linux 进程编程 linux process program定义状态进程id进程互斥临界资源临界区进程同步进程调度抢占式,非抢占式n (1) (1) 非抢占式优先权算法(又称不可剥夺调度:非抢占式优先权算法(又称不可剥夺调度:nonpreemptive nonpreemptive schedulingscheduling)n 在这种方式下,在这种方式下,系统一旦将处理机(cpu)分配给运行队列中优先权最高的进程后,该进程便一直执行下去,直至完成;直至完成;n 或因发生某事件使该进程放弃处理机时,系统方可将处理机分配给另或因发生某事件使该进程放弃处理机时,系统方可将处理机分配给另一个优先权高

2、的进程。一个优先权高的进程。n 这种调度算法主要用于批处理系统中,也可用于某些对实时性要求不严的实时系统中。n (2) (2) 抢占式优先权调度算法(又称可剥夺调度:抢占式优先权调度算法(又称可剥夺调度:preemptive preemptive schedulingscheduling)n 该算法的本质就是系统中当前运行的进程永远是可运行进程中优先权最高的那个。n 在采用这种调度算法时,每当出现一新的可运行进程,就将它和当前在采用这种调度算法时,每当出现一新的可运行进程,就将它和当前运行进程进行优先权比较,如果高于当前进程,将触发进程调度。这运行进程进行优先权比较,如果高于当前进程,将触发进

3、程调度。这种方式的优先权调度算法,能更好的满足紧迫进程的要求,种方式的优先权调度算法,能更好的满足紧迫进程的要求,n 故而故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。linuxlinux也采用这种调度算法。也采用这种调度算法。进程算法n 程序的优先级:程序的优先级: nice, reniceroot test /root # ps -l f s uid pid ppid c pri ni addr sz wchan tty time cmd100 s 0 5624 5606 0 70 0 - 608 wait4 pts/0 00:00:00 bash000 r

4、0 6944 5624 0 76 0 - 769 - pts/0 00:00:00 psn pri 代表这个程序可被执行的优先级越小越早被执行代表这个程序可被执行的优先级越小越早被执行. ni 代表这个程序的代表这个程序的 nice 值值.由于由于 pri 是越小越快被执行,而由于我们加入是越小越快被执行,而由于我们加入 nice 值之后,将使得值之后,将使得 pri 变为:变为: pri(new) = pri(old) + nicenice 语法:语法: root test /root # nice -n number command 参数说明:参数说明: -n :就是后面那个:就是后面那个

5、 number 即为即为 nice 值!值!renice 语法:语法: root test /root # renice number pid 参数说明:参数说明: 范例:范例: root test /root# renice 5 234 死锁获取进程id进程创建父、子进程之间的区别n fork的返回值;的返回值; n 进程进程id、不同的父进程、不同的父进程id;n 父进程设置的锁,子进程不继承;父进程设置的锁,子进程不继承;n 子进程的未决告警被清除;子进程的未决告警被清除;n 子进程的未决信号集设置为空集。子进程的未决信号集设置为空集。思考运行结果进程的结构 n 进程在内存里有三部份的数

6、据,就是进程在内存里有三部份的数据,就是“数据段数据段”,“堆栈段堆栈段”和和“代码段代码段” n “代码段代码段”,顾名思义,就是存放了程序代码的,顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。序,那么它们就可以使用同一个代码段。 堆栈段存放的就是子程序的返回地址、子程序的堆栈段存放的就是子程序的返回地址、子程序的参数以及程序的局部变量。参数以及程序的局部变量。n 而数据段则存放程序的全局变量,常数以及动态而数据段则存放程序的全局变量,常数以及动态数据分配的数据空间(比如用数据分配的数据空

7、间(比如用malloc之类的函数之类的函数取得的空间)。取得的空间)。进程创建-vforkfork vs vforkn 1. fork():子进程拷贝父进程的数据段,堆栈():子进程拷贝父进程的数据段,堆栈段段n vfork():子进程与父进程共享数据段():子进程与父进程共享数据段n 2. fork()父子进程的执行次序不确定()父子进程的执行次序不确定n vfork 保证子进程先运行,在调用保证子进程先运行,在调用 exec 或或 exit 之前与父进程数据是共享的之前与父进程数据是共享的,在它调用在它调用 exec或或 exit 之后父进程才可能被调度运行。之后父进程才可能被调度运行。n

8、 3. vfork 保证子进程先运行,在她调用保证子进程先运行,在她调用 exec 或或 exit 之后父进程才可能被调度运行。如果在之后父进程才可能被调度运行。如果在 调用调用这两个函数之前子进程依赖于父进程的进一步动这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。作,则会导致死锁。exit和_exitn exit和和_exit用于中止进程;用于中止进程;n _exit的作用:直接使进程停止运行,清除其使用的作用:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的数据结构;的内存空间,并清除其在内核中的数据结构;n exit与与_exit函数不同,函数不同,exit函数

9、在调用函数在调用exit系统之系统之前要检查文件打开情况把文件缓冲区的内容写回前要检查文件打开情况把文件缓冲区的内容写回文件中去。如调用文件中去。如调用printf()函数。()函数。进程运行调用退出处理函数清除i/o缓冲调用_exit系统调用进程终止运行_exitexitn int main()n n printf(this is a testn)n printf(test exit fun);n exit(0);n int main() printf(this is a testn) printf(test exit fun); _exit(0);自己编写这两个程序,看有何不同?原因是什么

10、?自己编写这两个程序,看有何不同?原因是什么?n 原因就是因为最后一句话上没有加上特殊的字符,原因就是因为最后一句话上没有加上特殊的字符,n 如换行和文件结束符,因为这个时候文件是存放如换行和文件结束符,因为这个时候文件是存放再在缓冲区的,再在缓冲区的,n 这个例子中文件就是存放打开的显示设备的缓冲这个例子中文件就是存放打开的显示设备的缓冲区中的,因为输出函数要写入,首先要进行系统区中的,因为输出函数要写入,首先要进行系统调用,这个时候系统会打开显示设备的缓冲区,调用,这个时候系统会打开显示设备的缓冲区,n 而而exit的作用就是结束,清理,就是说先检查缓的作用就是结束,清理,就是说先检查缓冲

11、区,把没有写入的数据写入到文件,冲区,把没有写入的数据写入到文件,n 而而_exit是立刻关闭文件,文件缓冲区的内容也就是立刻关闭文件,文件缓冲区的内容也就消失了,这个时候就不可能再输出到显示设备了消失了,这个时候就不可能再输出到显示设备了进程创建-vforkn pid = vfork();n if(pid = 0)n n count +;n printf(count = %dn, count);n _exit(0);n n else if(pid 0)n n count +;n printf(count = %dn, count);n n return 0;n exec 函数族exec函数族

12、装入并运行程序pathname,并将参数arg0(arg1,arg2,argv,envp)传递给子程序,出错返回-1。在exec函数族中,后缀l、v、p、e添加到exec后,所指定的函数将具有某种操作能力有后缀:exec 函数族execln int main()n n if(fork()=0)n n printf(execl.n);n if(execl(/bin/ls,ls,-a,null)0)n execlpn if(fork()=0)n n printf(execlp.n);n if(execlp(ls,ls,-a,null)0)n n fprintf(stderr,execl faile

13、d:%s,strerror(errno);n return -1;n execv char *arg=ls,-a,null; n if(fork()=0)n n printf(execv.n);n if(execv(/bin/ls,arg)0)n n fprintf(stderr,execl failed:%sn,strerror(errno);n return -1;n execvp char *arg=ls,-a,null; if(fork()=0)n n printf(execvp.n);n if(execvp(ls,arg)0)n n fprintf(stderr,execl fail

14、ed:%sn,strerror(errno);n return -1;n execleexecven if(fork()=0)n n printf(execve.n);n if(execve(/bin/ls,arg,envp)0)n n fprintf(stderr,execl failed:%sn,strerror(errno);n return -1;n n execle和和execve,都使用了,都使用了char *envp来传递环境变量。来传递环境变量。在全部在全部6个函数中,只有个函数中,只有execle和和execve需要传递环境变需要传递环境变量,其它的量,其它的4个函数都没有这

15、个参数,这并不意味着它们个函数都没有这个参数,这并不意味着它们不传递环境变量,这不传递环境变量,这4个函数将把默认的环境变量不做任个函数将把默认的环境变量不做任何修改地传给被执行的应用程序。而何修改地传给被执行的应用程序。而execle和和execve会会用指定的环境变量去替代默认的那些。用指定的环境变量去替代默认的那些。 exec 函数族exec 函数族进程等待n 子进程的结束状态返回后存于子进程的结束状态返回后存于status, 有几个宏可判别结束情况:有几个宏可判别结束情况:wifexited(status)n 如果子进程正常结束则为非如果子进程正常结束则为非0 值。值。n wexits

16、tatus(status)n 取得子进程取得子进程exit()返回的结束代码,一()返回的结束代码,一般会先用般会先用wifexited 来判断是否正常结束才能使用此宏。来判断是否正常结束才能使用此宏。n wifsignaled(status)n 如果子进程是因为信号而结束则此宏值为真如果子进程是因为信号而结束则此宏值为真n wtermsig(status) n 取得子进程因信号而中止的信号代码,一般会先用取得子进程因信号而中止的信号代码,一般会先用wifsignaled 来判断后才使用此宏。来判断后才使用此宏。nwifstopped(status)n 如果子进程处于暂停执行情况则此宏值为真。

17、一般只有使用如果子进程处于暂停执行情况则此宏值为真。一般只有使用wuntraced 时才会有此情况。时才会有此情况。n wstopsig(status) n 取得引发子进程暂停的信号代码,一般会先取得引发子进程暂停的信号代码,一般会先用用wifstopped 来判断后才使用此宏。来判断后才使用此宏。进程等待waitpidwaitpid 使用实例请根据流程图,写出相应的程序,请根据流程图,写出相应的程序,并分别写出阻塞和非阻塞版本!并分别写出阻塞和非阻塞版本!n waitpid 和和 wait 的区别的区别 : n waitpid 提供了提供了 wait 函数不能实现的函数不能实现的 3 个功能

18、个功能 : n 1 ) waitpid 等待特定的子进程等待特定的子进程 , 而而 wait 则返回则返回任一终止状态的子进程(第一个结束的进程)任一终止状态的子进程(第一个结束的进程) ; n 2 ) waitpid 提供了一个提供了一个 wait 的非阻塞版本的非阻塞版本 ; n 3 ) waitpid 支持作业控制支持作业控制 ( 以以 wuntraced 选项选项 )它涉及到一些跟踪调试方面的知识,极少用它涉及到一些跟踪调试方面的知识,极少用到到 .思考n void main() for(;) fork(); 这个程序什么也不做,就是死循环地fork,其结果是程序不断产生进程,而这些进程又不断产生新的进程,很快,系统的进程就满了,系统就被这么多不断产生的进程“撑死了”。用不着是root,任何人运行上述程序都足以让系统死掉。 但这不是linux不安全的理由,因为只要系统管理员足够聪明,他(或她)就可以 预先给每个用户设置可运行的最大进程数,这样,只要不是root,任何能运行的进程数也许不足系统总的能运 行和进程数的十分之一,这样,系统管理员就能对付上述恶意的程序了。 实验n 编写多进程程序编写多进程程序n 1. 实验目的实验目的 通过编写多进程程序,使同学们熟练掌握通过编写多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论