linux操作的系统及程序设计4.pptVIP

  • 2
  • 0
  • 约1.34万字
  • 约 83页
  • 2018-02-18 发布于浙江
  • 举报
linux操作的系统及程序设计4

第四讲 多进程编程 初步掌握Linux环境下进程和线程的概念、相关系统调用使用、多进程、线程编程基本方法,了解进程间通信的主要方式。 进程(process): 处于执行期的程序及其所包含资源的总称 程序:可执行程序代码 资源:打开文件、挂起信号、地址空间、数据段等 线程(thread) 进程中活动的对象 有独立的程序计数器、进程栈及一组进程寄存器 节省主存、减少管理开销、快速切换 从形态角度 一个进程可包含一个或多个线程 从调度角度 进程是资源分配的基本单位 线程是处理器调度的独立单位 从虚拟化角度 进程提供两种虚拟机制 虚拟处理器:进程独享处理器的假象 虚拟内存:进程拥有系统内所有内存资源的假象 线程之间可共享虚拟内存,但各自拥有独立虚拟处理器 对Linux系统而言,线程只是一种特殊的进程! ●用户空间 可执行映象:用户进程本身的程序和数据 进程堆栈:进程运行用户程序时使用的堆栈 进程控制/管理信息:如进程控制块等。 ●系统空间: 内核被映射到所有进程的系统空间中 只允许进程在核心态下访问 进程只能通过系统调用转换为核心态后,才能访问系统空间 进程上下文 系统提供给进程处于动态变化的运行环境 系统上下文 系统完成自身任务时的运行环境,内核在系统上下文中执行时不会阻塞 进程描述符 数据结构:struct task_struct 定义位置:include/linux/sched.h 进程描述符向量结构 数据结构:task[NR_TASKS] 定义位置: include/linux/sched.h 定义格式 struct task_struct *task[NR_TASKS] = {init_task} #define NR_TASKS 512 说明:全局变量NR_TASKS记录系统可容纳进程数,默认大小是512 pid_t pid:内核通过pid标识每个进程 pid与进程描述符之间有严格的一一对应关系 pid_t实际上是一个int类型,范围:0 ~ 32767 最大值修改:/proc/sys/kernel/pid_max 生成新pid:get_pid() 获取进程pid 1)ps命令(用法?) 2)访问/proc/pid 3)getpid()?sys_getpid() ●实验1:完成教科书P66创建进程实验。 ●如何实现等待指定的子进程结束? ●如何实现一个父进程创建多个(比如10个)子进程? ●实践 调式更正教科书P49-50的示例程序,使其可以运行,真正实现一个程序启动另一个程序后自身仍然在运行。 ●实验2:完成教科书P67创建线程实验。 阅读教科书P61-64内容,了解线程同步的基本方法。 ●实验3:完成教科书P68利用多线程实现单词统计的实验。 1 1)有一int型全局变量g初始值为0; 2)创建线程1,打印“thread1”,并将g设置为1 3)创建线程2,打印“thread2”,并将g设置为2 4)线程2需要在线程1退出后才能退出 5)主线程在检测到g从1变为2,或者从2变为1的时候退出(提示:在主线程中使用pthread_cond_wait,在线程1和线程2中发出signal) * mutex变量使用示例—修改前 Linux线程编程技术 * mutex变量使用示例—修改前 运行结果 main线程和function线程是交替运行,都可对run_now进行操作 Linux线程编程技术 * mutex变量使用示例—修改后 Linux线程编程技术 定义work_mutex变量,实现互斥访问 * mutex变量使用示例—修改后 Linux线程编程技术 * mutex变量使用示例—修改后 Linux线程编程技术 * mutex变量使用示例—修改后 Linux线程编程技术 * mutex变量使用示例—修改后 运行结果 Linux线程编程技术 * 条件变量 互斥锁的缺点 通过控制存取数据来实现线程同步 线程不断轮询条件是否满足(忙等),资源消耗大 条件变量 利用线程间共享的全局变量实现同步 条件变量使线程睡眠等待特定条件出现(无需轮询) 使用方法 通常条件变量和互斥锁同时使用 一个线程因等待“条件变量的条件成立”而挂起 另一个线程使“条件成立”(发送“条件成立”信号) Linux线程编程技术 * 条件变量典型使用步骤 申明/初始化需要同步的全局数据/变量(如count) 申明和初始化一个条件变量对象 申明和初始化对应的mutex 创建若干进程,并运行之 Linux线程编程技术 * 条件变量检测 条件

文档评论(0)

1亿VIP精品文档

相关文档