《进程和线程精选文档.ppt》由会员分享,可在线阅读,更多相关《进程和线程精选文档.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、进程和线程进程和线程本讲稿第一页,共四十三页第第3章章进程和线程进程和线程本讲稿第二页,共四十三页预习检查预习检查进程在内存里有三部分的数据?代码段、堆栈段、数据段进程在linux中表示的数据结构?task_struct 进程的状态?运行状态、等待状态、停止状态、僵尸状态 进程的执行模式?用户模式、内核模式本讲稿第三页,共四十三页本章目标本章目标了解进程和线程基本概念掌握进程编程掌握线程编程本讲稿第四页,共四十三页本章结构本章结构进程和线程基本概念进程和线程基本概念进程和线程进程和线程线程编程线程编程 进程编程进程编程 进程状态及状态切换进程状态及状态切换 进程的概念及组织结构进程的概念及组织
2、结构 进程控制、调度线程的概念线程的概念 获得与进程有关的获得与进程有关的ID 终止进程及进程返回值终止进程及进程返回值 派生进程 执行其他程序执行其他程序 等待进程 线程同步线程同步-互斥锁互斥锁 进程的同步措施 线程的创建和使用线程的创建和使用 线程同步线程同步-信号量信号量 线程同步线程同步-条件变量条件变量 本讲稿第五页,共四十三页进程进程进程是一个具有独立功能的程序关于某个数据集合的一次可以并发执行的运行活动,是处于活动状态的计算机程序 Linux中进程具有独立的权限与职责。如果系统中某个进程崩溃,它不会影响到其余的进程。每个进程运行在其各自的虚拟地址空间中,进程之间可以通过由内核控
3、制的机制相互通讯。本讲稿第六页,共四十三页查看系统中的进程查看系统中的进程ps指令通常可以查看到:进程的ID、进程的用户ID、进程状态和进程的Command rootlocalhost other#ps-aux USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 2048 632?Ss Dec09 0:11 init 3 root 2 0.0 0.0 0 0?S Dec09 0:00 migration/0root 3 0.0 0.0 0 0?SN Dec09 0:00 ksoftirqd/0root 4 0.0
4、 0.0 0 0?S Dec09 0:01 watchdog/0root 5 0.0 0.0 0 0?S Dec09 0:07 events/0root 6 0.0 0.0 0 0?S Dec09 0:00 khelperroot 7 0.0 0.0 0 0?S Dec09 0:00 kthread root 3093 0.0 0.0 1640 432 tty4 Ss+Dec09 0:00/sbin/mingetty tty4root 3094 0.0 0.0 1640 428 tty5 Ss+Dec09 0:00/sbin/mingetty tty5root 3112 0.0 0.0 163
5、6 452 tty6 Ss+Dec09 0:00/sbin/mingetty tty6本讲稿第七页,共四十三页查看系统中的进程查看系统中的进程ps输出信息USER 进程的属主;PID 进程的ID;PPID 父进程;%CPU 进程占用的CPU百分比;%MEM 占用内存的百分比;NI 进程的NICE值,数值大,表示较少占用CPU时间;VSZ 进程虚拟大小;RSS 驻留中页的数量;TTY 终端IDWCHAN 正在等待的进程资源;START 启动进程的时间;TIME 进程消耗CPU的时间;COMMAND 命令的名称和参数;本讲稿第八页,共四十三页查看系统中的进程查看系统中的进程STAT 进程状态D U
6、ninterruptible sleep(usually IO)R 正在运行可中在队列中可过行的;S 处于休眠状态;T 停止或被追踪;Z 僵尸进程;优先级高的进程 N 优先级较低的进程 L 有些页被锁进内存;s 进程的领导者(在它之下有子进程);l is multi-threaded(using CLONE_THREAD,like NPTL pthreads do)+位于后台的进程组;本讲稿第九页,共四十三页task_struct每个进程用一个tast_struct数据结构来表示。task_struct数据结构庞大而复杂,但它可以分成一些功能组成部分:(1)进程状态运行状态等待状态停止状态僵尸
7、状态(2)进行调度信息 进程优先级(3)标识符仅仅是个数字,不是task数组的索引用来控制进程对系统中文件和设备的存取权限(4)进程间通信信号、管道System V IPC:共享内存、信号灯、消息队列本讲稿第十页,共四十三页task_struct(5)链接所有进程的相互关系rootlocalhost#pstree -pinit(1)-+-acpid(2049)|-atd(2280)|-auditd(1697)-+-python(1699)|-auditd(1698)|-automount(2025)-+-automount(2026)|-automount(2027)|-automount(2
8、030)|-automount(2033)|-avahi-daemon(2316)-avahi-daemon(2317)|-blktapctrl(2612)-blktapctrl(2613)|-crond(2189)|-cupsd(2087)|-dbus-daemon(1885)|-dhclient(2981)本讲稿第十一页,共四十三页task_struct(6)时间和定时器 记录进程消耗的时间保存在jiffies变量中在定时器到时向相应进程发送信号(7)文件系统 指向每个打开文件描述符指向VFS索引节点的指针(8)虚拟内存(9)处理器的内容存储进程切换的上下文,所有CPU相关的状态本讲稿第十
9、二页,共四十三页进程状态进程状态进程常见状态:运行状态 系统当前进程就绪状态进程ps命令的STAT列为值R等待状态 等待事件发生等待系统资源ps命令的STAT列为值S停止状态 ps命令的STAT列为值T僵尸状态 进程终止或结束在进程表项中仍有记录ps命令的STAT列为值Z本讲稿第十三页,共四十三页进程状态进程状态进程状态变化关系图本讲稿第十四页,共四十三页进程执行模式进程执行模式内核模式系统调用中断事件用户模式本讲稿第十五页,共四十三页进程调度进程调度第一步:处理内核中的工作第二步:处理当前进程第三步:选择进程实时进程普通进程第四步:进程交换本讲稿第十六页,共四十三页进程调度进程调度task_
10、struct中的调度信息:策略轮流策略先进先出策略优先权Jiffies变量实时优先权实时进程之间计数器本讲稿第十七页,共四十三页进程控制进程控制fork()创建子进程exec()创建子进程后,引用其他程序wait()等待子进程退出,防止孤儿进程产生及时释放子进程占用的系统资源exit()终止进程 本讲稿第十八页,共四十三页获得进程有关的获得进程有关的ID#include#include uid_t getuid(void):获得进程的用户标识号。gid_t getgid(void):获得进程的用户所属的用户组ID。pid_t getpid(void):要获得当前进程的ID。pid_t getp
11、pid(void):获得当前进程的父进程的ID。pid_t getpgrp(void):获得当前进程所在的进程组的ID。pid_t getpgid(pid_t pid):获得进程ID为pid的进程所在的进程组ID。本讲稿第十九页,共四十三页派生进程派生进程fork()#include#include pid_t fork(void);它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程PID。在子进程中,fork返回0。如果出现错误,fork返回-1。本讲稿第二十页,共四十三页执行其它程序执行其它程序exec()可以用来执行一个可执行文件来代替
12、当前进程的执行映像。该调用并没有生成新的进程,而是在原有进程的基础上,替换原有进程的正文,调用前后是同一个进程,进程号PID不变,但执行的程序变了(执行的指令序列改变了)。本讲稿第二十一页,共四十三页执行其它程序(续)执行其它程序(续)六种调用形式:int execl(const char*path,const char*arg,.);int execlp(const char*file,const char*arg,.);int execle(const char*path,const char*arg,.,char*const envp);int execv(const char*path
13、,char*const argv);int execvp(const char*file,char*const argv);int execve(const char*filename,char*const argv,char*const envp);-系统调用exec()的六个函数实现的功能都是一样的,只是在传递参数和设置环境方面提供了不同的方式。本讲稿第二十二页,共四十三页执行其它程序(续)执行其它程序(续)六个函数的都是以“exec”四个字母开头的,后面的字母表示了其用法上的区别:带有字母“l”的函数,表明后面的参数列表是要传递给程序的参数列表,参数列表的第一个参数必须是要执行程序,最后
14、一个参数必须是NULL。带有字母“p”的函数,第一个参数可以是相对路径或程序名,如果无法立即找到要执行的程序,那么就在环境变量PATH指定的路径中搜索。其他函数的第一个参数则必须是绝对路径名。带有字母“v”的函数,表明程序的参数列表通过一个字符串数组来传递。这个数组和最后传递给程序的main函数的字符串数组argv完全一样。第一个参数必须是程序名,最后一个参数也必须是NULL。带有字母“e”的函数,用户可以自己设置程序接收一个设置环境变量的数组。本讲稿第二十三页,共四十三页终止进程及进程返回值终止进程及进程返回值 exit()函数的功能是终止发出调用的进程 void exit(int stat
15、us);本讲稿第二十四页,共四十三页等待进程等待进程系统调用wait()的功能是发出调用的进程只要有子进程,就睡眠直到它们中的一个终止为止:#include#include pid_t wait(int*status);pid_t waitpid(pid_t pid,int*status,int options);waitpid()函数与调用wait()的区别是waitpid()等待由参数pid指定的子进程退出 本讲稿第二十五页,共四十三页等待子进程等待子进程-检查子进程状态的宏定义检查子进程状态的宏定义宏定义含义WIFEXITED(status)如果进程通过系统调用_exit或函数调用exi
16、t正常退出,该宏的值为真。WIFSIGNALED(status)如果子进程由于得到的信号(signal)没有被捕捉而导致退出时,该宏的值为真。WIFSTOPPED(status)如果子进程没有终止,但停止了并可以重新执行时,该宏返回真。这种情况仅出现在waitpid调用中使用了WUNTRACED选项。WEXITSTATUS(status)如果WIFEXITED(status)返回真,该宏返回由子进程调用_exit(status)或exit(status)时设置的调用参数status值。WTERMSIG(status)如果WIFSIGNALED(status)返回为真,该宏返回导致子进程退出的信
17、号(signal)的值。WSTOPSIG(status)如果WIFSTOPPED(status)返回真,该宏返回导致子进程停止的信号(signal)值。本讲稿第二十六页,共四十三页线程线程进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好地支持多处理器,并且减小进程上下文切换的开销。线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所附属的进程的所有的资源,包括打开的文件、内存页面、信号标识及动态分配的内存等等。本讲稿第二十七页,共四十三页进程和线程的关系进程和线程的关系线程和进程的关系是:线程是属于进程的,线
18、程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。本讲稿第二十八页,共四十三页进程和线程的关系进程和线程的关系线程堆栈CPU寄存器状线程T2堆栈CPU寄存器状内存文件信号本讲稿第二十九页,共四十三页线程编程线程编程创建线程#include int pthread_create(pthread_t*restrict thread,const pthread_attr_t*restrict attr,void*(*
19、start_routine)(void*),void*restrict arg);指向线程标识符的指针线程属性,一般为NULL线程运行函数的起始地址运行函数参数成功返回0本讲稿第三十页,共四十三页int pthread_join(pthread_t thread,void*value_ptr);等待线程结束函数void pthread_exit(void*value_ptr);线程退出函数本讲稿第三十一页,共四十三页线程同步线程同步-互斥锁互斥锁对共享资源的存取,需要用锁的方式加以控制。函数pthread_mutex_init()用来生成一个互斥锁:#include int pthread_m
20、utex_init(pthread_mutex_t*restrict mutex,const pthread_mutexattr_t*restrict attr);互斥变量地址互斥变量属性,一般NULL成功返回0本讲稿第三十二页,共四十三页上锁与解锁上锁与解锁上锁与解锁:#include int pthread_mutex_lock(pthread_mutex_t*mutex);int pthread_mutex_unlock(pthread_mutex_t*mutex);互斥变量地址互斥变量地址成功返回0本讲稿第三十三页,共四十三页死锁死锁死锁:两个线程试图同时占用两个资源,并按不同的次序锁
21、定相应的互斥锁 解决办法:使用函数pthread_mutex_trylock(),它是函数pthread_mutex_lock()的非阻塞函数:#include int pthread_mutex_trylock(pthread_mutex_t*mutex);互斥变量地址成功返回0本讲稿第三十四页,共四十三页线程同步线程同步-条件变量条件变量互斥锁的缺点是它只有两种状态:锁定和非锁定。条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足。条件变量通常和互斥锁一起使用。条件变量被用来阻塞一个线程,当条件不满足时,线程通常先解开相应的互斥锁进入阻塞状态,等待条件发生变化。一旦其
22、它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。条件变量只是起阻塞和唤醒线程的作用,具体的判断条件还需用户给出。本讲稿第三十五页,共四十三页初始化条件变量初始化条件变量初始化条件变量#include int pthread_cond_init(pthread_cond_t*restrict cond,const pthread_condattr_t*restrict attr);释放条件变量#include int pthread_cond_destroy(pthread_cond_t*cond);条件变量地址条件变量属性条件变量地址本讲稿第三十六页,
23、共四十三页条件变量条件变量条件变量阻塞线程:#include int pthread_cond_wait(pthread_cond_t*restrict cond,pthread_mutex_t*restrict mutex);int pthread_cond_timedwait(pthread_cond_t*restrict cond,pthread_mutex_t*restrict mutex,const struct timespec*restrict abstime);互斥变量地址要解开的互斥锁条件变量锁定时间本讲稿第三十七页,共四十三页int pthread_cond_broadca
24、st(pthread_cond_t*cond)int pthread_cond_signal(pthread_cond_t*cond)用pthread_cond_broadcast()函数可以使所有线程都被唤醒。用pthread_cond_signal()时哪一个线程被唤醒是由线程的调度策略所决定的。本讲稿第三十八页,共四十三页线程同步线程同步-信号量信号量信号量从本质上是一个非负整数计数器,通常被用来控制对公共资源的访问。当可用的公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于时,函数sem_wait()才能返回,并将信号量的值减1,当信号量等于0时,sem_wai
25、t()将被阻塞直到信号量的值大于0。函数sem_trywait()是函数sem_wait()的非阻塞版本。本讲稿第三十九页,共四十三页线程同步线程同步-信号量信号量初始化信号量:#include int sem_init(sem_t*sem,int pshared,unsigned value);增加信号量的值:#include int sem_post(sem_t*sem);信号量地址共享标志信号量初始值信号量地址本讲稿第四十页,共四十三页线程同步线程同步-信号量信号量阻塞当前线程直到信号量sem的值大于0#include int sem_wait(sem_t*sem);int sem_tr
26、ywait(sem_t*sem);释放信号量#include int sem_destroy(sem_t*sem);信号量地址信号量地址本讲稿第四十一页,共四十三页本章总结本章总结进程和线程基本概念进程和线程基本概念进程和线程进程和线程线程编程线程编程 进程编程进程编程 进程状态及状态切换进程状态及状态切换 进程的概念及组织结构进程的概念及组织结构 进程控制、调度线程的概念线程的概念 获得与进程有关的获得与进程有关的ID 终止进程及进程返回值终止进程及进程返回值 派生进程 执行其他程序执行其他程序 等待进程 线程同步线程同步-互斥锁互斥锁 进程的同步措施 线程的创建和使用线程的创建和使用 线程
27、同步线程同步-信号量信号量 线程同步线程同步-条件变量条件变量 从进程的定义,描述,到从进程的定义,描述,到进程的状态的分析,给出进程的状态的分析,给出了进程的描述和进程的切了进程的描述和进程的切换的理论。以及线程的概换的理论。以及线程的概念。念。列举与进程相关的系统调用。列举与进程相关的系统调用。详细介绍多进程的编程,包含详细介绍多进程的编程,包含多进程创建,进程间的同步,多进程创建,进程间的同步,子进程的资源回收等。子进程的资源回收等。线程的创建、使用和同步。线程的创建、使用和同步。本讲稿第四十二页,共四十三页实验及实验注意事项实验及实验注意事项任务1:获得进程有关的ID 任务2:掌握派生进程的方法 任务3:学习如何使用execl()执行一个程序 任务4:掌握execvp()系列函数的主要区别和用法 任务5:掌握派生子进程,并由子进程执行新的程序的方法 任务6:wait()函数的使用方法 任务7:创建线程 任务8:获取子线程返回值任务9:掌握互斥锁来进行线程同步的方法 任务10:掌握用条件变量进行线程同步的方法 任务11:掌握用信号量进行线程同步的方法 本讲稿第四十三页,共四十三页
限制150内