20155332 补交ch12课下作业

课下测试提交晚了,我课后补做了一遍,答对13题,答错3题。

试题内容如下所示:

课本内容

1.并发(Concurrency)

  • 访问慢I/O设备:就像当应用程序等待I/O中的数据时内核会切换运行其他进程一样,我们的应用也可以用类似的方式,将I/O请求与其他工作重叠从而挖掘并发的潜能。

  • 推迟工作而减少延迟:我们可以推迟一些耗时工作稍后执行,例如内存分配器不在free时整理碎片,而是将这些琐屑的工作推迟到一个稍后执行的独立“逻辑流”(logical flow)中。

  • 服务多个网络客户端:如果没有并发,一个慢客户端将会阻塞整个Web服务器,这是不现实的!所以我们需要为每个客户端都创建独立的逻辑流,避免某个客户端独占整个服务器。

  • 多核上并行计算:将程序切分成多个逻辑流并发执行,在多核环境中可能被分配到不同的核心上执行,从而实现了并行。

现代操作系统提供三种基本方法构建上述这些并发程序:

  • 进程(Process):进程由操作系统维护和调度,每个进程都有独立的虚拟地址空间,进程间交互要靠IPC机制。
  • I/O多路复用(I/O multiplexing):在进程的上下文中,应用程序“显式地”调度自己的逻辑流。逻辑流被构建为状态机,当文件描述符上有数据到达时,main程序显式地将它从一种状态转移到另一种状态。
  • 线程(Thread):线程运行在进程的上下文中,由操作系统调度。可以将线程看做是进程和I/O多路复用技术的混合,它既像进程一样被操作系统调度,又能像I/O多路复用一样共享虚拟地址空间。

2.基于进程的并发

构建并发程序的最简单方式就是使用进程。每接收到一个连接,父进程都会fork出一个子进程。因为子进程拷贝了父进程的文件描述符表,所以使用进程构建并发时一定要避免资源泄露,尤其是父进程。子进程一定要关闭监听描述符listenfd,这个描述符在子进程中是没有任何用处的。而同样的,父进程要负责关闭连接描述符connfd,同理,这个描述符在父进程中也是一点用处都没有。

3.基于I/O多路复用的并发

现在对我们的Web服务器进行升级,让它不仅能够处理远程客户端的连接请求,写回helloworld欢迎语。同时它还能响应当前命令行中的用户输入。那么,我们应该先等待哪种事件?实际上先等待谁都不是最理想的,因为阻塞地等待一个必然导致无法响应另一个。解决这种困境的技术就是I/O多路复用。

测试题目

1.( 多选题 | 1 分)

有关线程图,下面说法正确的是()

A .图的原点表示没有任何线程完成一条指令的初始状态

B .向右向上是合法的转换

C .向左向下是合法的转换

D .对角线是合法的转换

E .一个程序执行的历史被模型化成状态空间中的一条轨迹线

F .进度图中,两个临界区的交集形成不安全区

2.(单选题|1分)

下面代码对于并发程序来说逻辑上是()条指令?

for(i=0;i<1000; i++)cnt++;

A .2

B .3

C .4

D .5

E .6

F .1

( 多选题 | 1 分)

3.有关多线程的说法,正确的是()

A .竞争和死锁是并发程序中出现的难题

B .程序员错误的假设逻辑流该如何调度时就会发生竞争

C .当一个逻辑流等待一个永远不会发生的事件时就会产生死锁

D .程序使用PV的顺序不当,可能引发死锁

E .利用互斥锁加锁顺序规则可以避免互斥死锁

4.( 多选题 | 1 分)

下面Linux函数()是线程安全的?

A .rand()

B .ctime()

D .localtime_r()

E .scanf()

5.( 多选题 | 1 分)

线程不安全函数类包括()

A .不保护共享变量的函数

B .保持跨越多个调用的状态的函数

C .返回指向静态变量指针的函数

D .调用线程不安全函数的函数

E .调用可重入函数的函数

6.( 多选题 | 1 分)

有关并发程序,下面说法正确的是()

A .程序可以分为并发程序和顺序程序两类

B .程序可以分为并行程序和顺序程序两类

C .并发程序是一种特殊的并行程序

D .并行程序是一种特殊的并发程序

7.( 多选题 | 1 分)

有关“生产者-消费者”和“读者-写者”模型,下面说法正确的是()

A .二者除处理的都是互斥问题

B .二者除处理的都是同步问题

C .二者都要保证对缓冲区的访问是互斥的

D .“生产者-消费者”模型要保证对缓冲区的访问是互斥的

E .“读者-写者”模型要保证读者对缓冲区的访问是互斥的

8.( 多选题 | 1 分)

有关使用信号量实现互斥的说法正确的是()

A .互斥是一种特殊的同步

B .使用二元信号量和PV原语可以实现互斥

C .对于信号量sem_t mutex;

Sem_init(&mutex, 0 , 2);把mutex初始化为二元信号量,用作互斥锁

D .对于共享变量

volatile long cnt = 0;

for(i=0; i<ntiers; i++){
P(&mutex)
cnt++;
V(&mutex)
}

保证了对cnt的 访问是互斥的,cnt的计数是正确的

9.( 多选题 | 1 分)

有关信号量(semphore),下面说法正确的是()

A .信号量s是一个非负的全局变量

B .信号量只能通过P,V操作来处理

C .P,V操作确保信号量s非负

D .sem_post()完成P(s)的操作

E .sem_wait()完成V(s)的操作

10.有关下面的代码hello.c,编译后的可执行程序为phello,下面说法正确的是()



A .编译命令是:gcc hello.c -o phello

B .编译命令是:gcc hello.c -lpthread -o phello

C .编译命令是:gcc hello.c -pthread -o phello

D .phello运行时有一个线程

E .phello运行时有两个线程

F .phello运行时主线程先执行完

G .phello运行时对等线程先执行完

H .phello运行时对等线程和主线程执行顺序不确定

11.( 多选题 | 1 分)

有关线程控制,下面说法正确的是()

A .与进程一样,线程也有父子关系

B .与进程控制中fork()

等价的是pthread_create()

C .与进程控制中exit()等价的是pthread_exit()

D .与进程控制中waitpid()等价的是pthread_join()

E .与进程控制中kill()等价的是pthread_cancel()

F .与进程控制中getpid()等价的是pthread_self()

12( 多选题 | 1 分)

关于线程,下面说法正确的是()

A .线程是运行在进程中的逻辑流

B .每个线程有自己的线程上下文,包括TID、栈、栈指针、PC、通用寄存器和条件码

C .进程是程序级并发,线程是函数级并发

D .一个进程中的线程共享该进程的虚拟地址空间

13( 多选题 | 1 分)

一个状态机包含()

A .状态

B .事件

C .自循环

D .转移

14.有关下面代码,编译后的可执行程序是echoserv,下面说法正确的是()



A .第19行中的STDIN_FILENO的值可以用grep -nr STDIN_FILENO /usr/include 查到为1

B .第24行select()会导到致程序阻塞,可以替代accept()

C .程序运行时,输入CTRL+D,可以让select返回

D .以上代码中加入csapp.h就能编译成功

15.( 多选题 | 1 分)

有关下面代码,编译后的可执行程序是echoserv,下面说法正确的是()

图像 1.png

A .这是一个并发echo服务器

B .这是一个迭代echo服务器

C .第33行关闭已连接描述符

D .第33行关闭监听描述符

E .删除第33行会导致内存泄露

F ../echoserv 5056

,5056是连接的客户端进程的端口号

G ../echoserv 5056 ,5056是连接的服务器进程的端口号

H .删除第30行会导致内存泄露

16( 多选题 | 1 分)

现代操作系统提供的构造并发程序的方法有()

A .异常

B .进程

C .I/O多路复用

D .信号

E .线程

错题分析

14题

  • 对于Agrep -nr STDIN_FILENO /usr/include STDIN_FILENO为0

  • 对于B,select()不能用accept()代替。
  • 对于C,在Linux系统里,在标准输入上键入Ctri+D表示EOF。故选C
  • 对于D,加入头文件后也编译失败,故排除。

10题

#include "csapp.h"
void *thread(void *vargp); int main()
{
pthread_t tid;
Pthread_create(&tid,NULL,thread,NULL);
Pthread_join(tid,NULL);
exit(0);
} void *thread(void *vargp)
{
printf("Hello,word!\n");
return NULL;
}
  • 多线程编译需要-lpthread或-pthread参数

  • pthread_join使得主线程等待对等线程先执行完

7题

  • 生产者,消费者问题。生产者生产项目并把它们插入到一个有限的缓冲区。消费者从缓冲区中取出这些项目,然后消费它们
  • 信号量的另一个重要作用是调用对共享资源的访问。在这种场景中,一个线程用信号量操作来通知另有一线程,程序状态中的某个条件已经为真了。
  • 故答案为BD

20155332 补交ch12课下作业的更多相关文章

  1. 20165302 ch02 课下作业

    20165302 ch02 课下作业 作业内容 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点) 完成教材 p97 2.96 2.97,要有完备的测试 发一篇相关内容的博客, ...

  2. 20175221 MyCP(课下作业,必做)

    MyCP(课下作业,必做) 任务详情 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: - java MyCP -tx XXX1.txt XXX2 ...

  3. 20175221 《Java程序设计》迭代和JDB(课下作业,选做):

    20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...

  4. 20175333曹雅坤MyCP(课下作业,必做)

    MyCP(课下作业,必做) 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin ...

  5. MyOD(课下作业,选做)

    MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...

  6. 迭代和JDB(课下作业,选做)

    迭代和JDB(课下作业,选做) 题目要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图 ...

  7. ###20175311MyCP(课下作业,必做)

    MyCP(课下作业,必做) 作业题目 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...

  8. MyCP(课下作业,必做)

    MyCP(课下作业,必做) 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2 的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bi ...

  9. 20175212课下作业 MyCP

    20175212课下作业 MyCP 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2 ...

随机推荐

  1. [CENTOS7] 修改机器名:hostnamectl set-hostname host.domain

    # hostnamectl set-hostname host.domain

  2. Python学习---xml文件的解析[beautifulsoup4模块学习]

    1.1. 安装beautifulsoup4 pip install beautifulsoup4 [更多参考]https://blog.csdn.net/sunhuaqiang1/article/de ...

  3. 理解http请求

    HTTP请求的GET方法可以用来抓取网页. HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则,计算机专家设计出HTTP,使HTTP客户(如Web浏览 ...

  4. Excel截取特定字符后面的值

    应该用到三个字符串函数:LEFT.RIGHT.MID 1.LEFT函数: 用法:LEFT(要提取字符所在单元格,从左侧开始提取的个数) 例如:=LEFT(A1,2) 意思是从A1单元格提取前两个字符. ...

  5. 服务器安装LNMP及构建个人站点

    服务器安装LNMP(centos6.6+nginx1.7.12+mysql5.6.24+php5.6.7) 本次安装  centos6.6+nginx1.7.12+mysql5.6.24+php5.6 ...

  6. 资料整理,SQL Server ,面试前复习笔记

    T-SQL 要掌握的知识点分类 SQL 面向数据库执行查询 SQL 从数据库取回数据 SQL 在数据库中插入新的记录 SQL 更新数据库中的数据 SQL 从数据库删除记录 SQL 创建新数据库 SQL ...

  7. November 28th 2016 Week 49th Monday

    You only live once, but if you do it right, once is enough. 年华不虚度,一生也足矣. One today can win two tomor ...

  8. ZT 二叉树先序,中序,后序遍历非递归实现

    二叉树先序,中序,后序遍历非递归实现 分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报 structc 利用栈实现二叉树的先序,中序,后序遍历的非递归操作 ...

  9. [T-ARA][Bye Bye]

    歌词来源:http://music.163.com/#/song?id=22704472 사랑하는 그대 Bye Bye, Bye Bye, Bye Bye, [sa-lang-ha-neun geu ...

  10. JAVA反射机制教程-获取类对象

    1. 什么是类对象 类对象,就是用于描述这种类,都有什么属性,什么方法的 2. 获取类对象 获取类对象有3种方式(1). Class.forName(2). Hero.class(3). new He ...