OS03 2知识点和上机作业_第1页
OS03 2知识点和上机作业_第2页
OS03 2知识点和上机作业_第3页
OS03 2知识点和上机作业_第4页
OS03 2知识点和上机作业_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

1、第二 / 三章:进程与线程掌握要点:1.2.3.4.5.6.7.掌握并发执行的特征与条件。 理解进程的概念与状态(转换)。 linux 的进程 (任务 )控制块都包含了进程的那些信息 ? 进程间通信有那几种方式 !各自的工作原理 ? 简述进程的创建过程以及 fork 函数与 vfork 函数的区别。 比较线程和进程的优缺点 ! 用户级线程和内核级线程的概念及各自特点。上机作业:共2源程序, 2个可执行程序 ):1.观看 03_pth1.c 运行过程中进程 (线程)的变化 !简述这种变化出现的原因!#include #include int sum ; /* this data is share

2、d by the thread(s) */ void *runner(void *param); /* the thread */main(int argc,char *argv) pthread_t tid ; /* the thread indentifier */ pthread_attr_t attr; /*set of thread attributes */if(argc!=2)%s n , argv0);fprintf(stderr,usageexit(); if(atoi(argv1)0) fprintf(stderr , %d must be 0)for(i=1 ; i=up

3、per ; i+) sum += i; pthread_exit(0) ;补充材料一: linux 多线程编程 pthreadLinux 系统下的多线程遵循 POSIX 线程接口, 称为 pthread 。编写 Linux 下的多线程 程序,需要使用头文件 pthread.h ,连接时需要使用库 libpthread.a 。要注意的是: Linux 下 pthread 的实现是通过系统调用 clone () 来实现的。 clone () 是 Linux 所特有的系统调用,它的使用方式类似 fork ,关于 clone ()的详细情况,可以 去查看有关文档说明或查看 linux 中的说明。下面我

4、们展示一个最简单的多线程程序 03_example1.c( 上机作业 )。 /* example.c*/#include #include void thread(void) int i ; for(i=0 ; i3 ;i+) printf(This is a pthread.n); int main(void) pthread_t id ; int i,ret ; ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0)printf (Create pthread error!n);exit (1) ; for(i=0 ; i

5、3 ;i+) printf(This is the main process.n);pthread_join(id,NULL) ; return (0) ;编译此程序:gcc 03_example1.c -lpthread -o example1 运行 example1 ,我们得到如下结果: This is the main process.This is a pthread.This is the main process.This is the main process.This is a pthread.This is a pthread. 再次运行,我们可能得到如下结果: This i

6、s a pthread.This is the main process.This is a pthread.This is the main process.This is a pthread.This is the main process.前后两次结果不一样,这是两个线程争夺CPU 资源的结果。pthread_create 和 pthread_join ,并声明上面的示例中,我们使用到了两个函数,了一个 pthread_t 型的变量。中定义:1 )pthread_t 在头文件 /usr/include/bits/pthreadtypes.h typedef unsigned long i

7、nt pthread_t; 它是一个线程的标识符。2 )函数 pthread_create 用来创建一个线程,它的原型为:extern int pthread_create (pthread_t *_thread, _const pthread_attr_t *_attr,第三个参数是线 thread 不需 这样将生成默认属void *(*_start_routine) (void *), void *_arg); 第一个参数为指向线程标识符的指针, 第二个参数用来设置线程属性, 程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数 要参数, 所以最后一个参数设为空指针。 第二

8、个参数我们也设为空指针, 性的线程。 对线程属性的设定和修改我们将在下一节阐述。 当创建线程成功时, 函数返回 0 , 若不为 0 则说明创建线程失败,常见的错误返回代码为 EAGAIN 和 EINVAL 。前者表示系 统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。 创建线程成功后, 新创建的线程则运行参数三和参数四确定的函数, 原来的线程则继续运行 下一行代码。3 )函数 pthread_join 用来等待一个线程的结束。函数原型为: extern int pthread_join (pthread_t _th, void *_thread_return);

9、 第一个参数为被等待的线程标识符, 第二个参数为一个用户定义的指针, 它可以用来存 储被等待线程的返回值。 这个函数是一个线程阻塞的函数, 调用它的函数将一直等待到被等 待的线程结束为止, 当函数返回时, 被等待线程的资源被收回。 一个线程的结束有两种途径, 一种是象我们上面的例子一样, 函数结束了, 调用它的线程也就结束了; 另一种方式是通过 函数 pthread_exit 来实现。它的函数原型为:extern void pthread_exit (void *_retval) _attribute_ (_noreturn_);唯一的参数是函数的返回代码, 只要 pthread_join 中

10、的第二个参数 thread_return 是 NULL ,这个值将被传递给 thread_return 。最后要说明的是, 一个线程不能被多个线程 等待,否则第一个接收到信号的线程成功返回,其余调用 pthread_join 的线程则返回错误 代码 ESRCH 。补充材料二:修改线程的属性在上一节的例子里,我们用 pthread_create 函数创建了一个线程,在这个线程中,我 们使用了默认参数,即将该函数的第二个参数设为 NULL 。的确,对大多数程序来说,使用 默认属性就够了,但我们还是有必要来了解一下线程的有关属性。属性结构为 pthread_attr_t ,它同样在头文件 /usr/

11、include/pthread.h 中定义,喜 欢追根问底的人可以自己去查看。 属性值不能直接设置, 须使用相关函数进行操作, 初始化 的函数为 pthread_attr_init ,这个函数必须在 pthread_create 函数之前调用。属性对象 主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分 离、缺省 1M 的堆栈、与父进程同样级别的优先级。)。关于线程的绑定,牵涉到另外一个概念:轻权进程( LWP : Light Weight Process轻权进程可以理解为内核线程, 它位于用户层和系统层之间。 系统对线程资源的分配、 对线 程的控制是通过轻权进程

12、来实现的,一个轻权进程可以控制一个或多个线程。默认状况下, 启动多少轻权进程、 哪些轻权进程来控制哪些线程是由系统来控制的, 这种状况即称为非绑 定的。绑定状况下,则顾名思义,即某个线程固定的绑 在一个轻权进程之上。被绑定的线程具有较高的响应速度,这是因为 CPU 时间片的调度是面向轻权进程的,绑定的线程可以 保证在需要的时候它总有一个轻权进程可用。 通过设置被绑定的轻权进程的优先级和调度级 可以使得绑定的线程满足诸如实时反应之类的要求。设置线程绑定状态的函数为 pthread_attr_setscope ,它有两个参数, 第一个是指向属 性结构的指针,第二个是绑定类型,它有两个取值: PTH

13、READ_SCOPE_SYSTEM (绑定 的)和 PTHREAD_SCOPE_PROCESS (非绑定的)。下面的代码即创建了一个绑定的线 程。#include pthread_attr_t attr; pthread_t tid;/* 初始化属性值,均设为默认值 */ pthread_attr_init(&attr);pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);pthread_create(&tid, &attr, (void *) my_function, NULL);线程的分离状态决定一个线程以什么样的方式来终止自己。 在上面的

14、例子中, 我们采用 了线程的默认属性,即为非分离状态,这种情况下,原有的线程等待创建的线程结束。只有 当 pthread_join ()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。 而分离线程不是这样子的, 它没有被其他的线程所等待, 自己运行结束了, 线程也就终止了, 马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。设置线程分离状态的函数为 pthread_attr_setdetachstate( pthread_attr_t *attr,int detachstate )。第二个参数可选为 PTHREAD_CREATE_DETACHED (分离线程) 和 P

15、THREAD _CREATE_JOINABLE (非分离线程)。这里要注意的一点是,如果设置 一个线程为分离线程,而这个线程运行又非常快,它很可能在 pthread_create 函数返回之 前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用 pthread_create 的线程就得到了错误的线程号。 要避免这种情况可以采取一定的同步措施, 最简单的方法之一是可以在被创建的线程里调用 pthread_cond_timewait 函数,让这个线 程等待一会儿,留出足够的时间让函数 pthread_create 返回。设置一段等待时间,是在多 线程编程里常用的方法。但是注

16、意不要使用诸如 wait ()之类的函数,它们是使整个进程 睡眠,并不能解决线程同步的问题。另外一个可能常用的属性是线程的优先级,它存放在结构 sched_param 中。用函数 pthread_attr_getschedparam 和函数 pthread_attr_setschedparam 进行存放, 一般说 来,我们总是先取优先级,对取得的值修改后再存放回去。下面即是一段简单的例子。#include #include pthread_attr_t attr ; pthread_t tid ; sched_param param ; int newprio=20 ;pthread_attr

17、_init(&attr) ; pthread_attr_getschedparam(&attr, ¶m) param.sched_priority=newprio ; pthread_attr_setschedparam(&attr, ¶m) pthread_create(&tid, &attr, (void *)myfunction, myarg)补充材料三:学习指导:操作系统管理的对象包括被动体 (资源) 和活动体, 本章在组织上将操作系统中的三种 活动体(作业、进程与线程)集中介绍,目的是使读者更清楚地认识三者之间的关系。考虑 由于批处理系统越来越少,作业这个概念将被适当

18、淡化。进程是操作系统最重要的概念之一,读者应从“动态”与“并发”两个方面去理解进 程。 进程状态转换图刻画了进程的动态性与并发性,所有进程的状态转换图是同构的, 每个进程在其生存期内状态要经过许多次转换,每次转换都伴随现场的保存与恢复, PCB 是 使多进程能够并发执行的重要数据结构。线程是近年来操作系统中的一个重要概念, 本质上来说, 线程就是具有公共存储区的进 程。 由于公共存储区的存在, 同一进程中多个线程之间的通讯变得容易, 线程切换速度得到 提高。 用户级线程与系统级线程各有其优点和不足, 也正因为这个原因, 在操作系统支持多 线程后,用户级线程仍被保持。补充材料四:部分习题与答案:

19、1. 为何引入多道程序设计 ? 在多道程序系统中,内存中作业的道数是否越多越好 ? 请 说明原因。答:引入多道程序设计技术是为了提高计算机系统资源的利用率。在多道程序系统中, 内存中作业的道数并非越多越好。 一个计算机系统中的内存、 外设等资源是有限的, 只能容 纳适当数量的作业,当作业道数增加时,将导致对资源的竞争激烈,系统开销增大,从而导 致作业的执行缓慢,系统效率下降。这种说法对吗?如不对举2. 有人说, 用户进程所执行的程序一定是用户自己编写的。 例说明之。答:这种说法不对。例如, C 编译程序以用户进程身份运行,但 C 编译程序并不是用 户自己编写的。此外还有字处理程序等工具软件。3

20、. 进程一般具有哪三个主要状态?举例说明状态转换的原因。 答:进程在其生存期内可能处于如下三种基本状态之一显然,在单处理机系统中(1) 运行态 ( Run ): 进程占有处理机资源,正在运行。 任一时刻只能有一个进程处于此种状态 ;(2) 就绪态 ( Ready ): 进程本身具备运行条件,但由于处理机的个数少于可运行进 程的个数,暂未投入运行。 即相当于等待处理机资源 ;(3) 等待态 ( Wait ): 也称挂起态 ( Suspended )、封锁态 ( Blocked )、睡眠态 ( Sleep ) 。 进程本身不具备运行条件,即使分给它处理机也不能运行。 进程正等待某一个事件的发生,如等待某一资源被释放,等待与该进程相关的 I/O 传输的完成 信号等。进程的三个基本状态之间是可以相互转换的。 具体地说,当一个就绪进程获得处理 机时,其状态由就绪变为运行 ; 当一个运行进程被剥夺处理机时,如用完系统分给它的时 间片,或出现高优先级别的其它进程,其状态由运行变为就绪; 当一个运行进程因某事件受阻时, 如所申请资源被占用, 启动 I/O 传输未完成, 其状态由运行变为等待 ; 当所等待事 件发生时,如得到申请资源, I/O 传输完成,其状态由等待变为就绪。4. 线程控制块 TCB 中一般应包含那些内容? 答:一般 TCB 中的内容较少,因为有关资源分配等多数信息已经

温馨提示

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

评论

0/150

提交评论