20155332 补交ch12课下作业

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
时间: 2024-10-13 03:00:49

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

20155317 第八周课下作业(1)

20155317 第八周课下作业(1) 4.47: 冒泡排序实现: X86-64汇编: Y86-64汇编 4.48 实现冒泡排序,要求不使用跳转,且最多使用3次条件传送. X86-64汇编: y86汇编: 4.49 实现冒泡排序,要求不使用跳转,且最多使用1次条件传送. X86-64汇编: y86汇编

2017-2018-1 20155318 《信息安全系统设计基础》第十周课上测试及课下作业

2017-2018-1 20155318 <信息安全系统设计基础>第十周课上测试及课下作业 课上测试 解析:填充消除了冲突不命中,对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中.因而命中率为75%. 解析:高速缓存容量为2048,高速缓存结构为(( 32 ),8,8,32) 解析:不同层之间是以块为大小传输单元在层与层之间复制,空缓存的不命中叫强制性不命中或冷不命中 解析:存储器层次结构的每一层都缓存来自较低一层的数据.缓存存储器是分块的,数据总是以块为基本单位在每一层之间传递,

2017-2018-1 20155330 《信息安全系统设计基础》课堂测试&amp;课下作业

2017-2018-1 20155330 <信息安全系统设计基础>课堂测试&课下作业 stat命令的实现-mysate 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate.c,提交码云链接 测试代码,mystat 与stat(1)对比,提交截图 STAT(1)学习 使用man 1 stat命令查看 使用man -k stat | grep 2查找相关函数 man 2 stat查看stat函数 产品

# 20155337 2017-2018 1 课上测试、课下作业、实验

20155337 2017-2018 1 课上测试.课下作业.实验 第一周 学习总结 第二周 课堂实践 第三周 学习总结 第四周 学习总结+myod 第五周 学习总结 课堂实践 第六周 学习总结 实验一 第七周 学习总结 实验二 第八周 加分项目pwd 第九周 学习总结 第十周 实验三 第十一周 学习总结

2018.3.8课下作业

2018.3.8课下作业 相关知识点的总结 编写代码 mkdir用于新建文件夹 vi用于编写代码 esc:wq结束编写 上传码云 git add+文件名 git commit -m "说明" git push -f origin master pakeage注意 javac src/Hello.java -d bin编写至bin文件夹 java -cp bin is5227.Hello在bin文件夹中编译 课上内容的补做 作业:p14 结果截图 代码的功能:规定数的求和 作业:带包的代

20165331 课下作业

20165331 课下作业 代码运行效果截图 P14从1加到20165331 P16(1)Person.java (2)2个.class文件,分别为Person.class和Xiti.class (3)只有Xiti.class可以运行 原文地址:https://www.cnblogs.com/violence/p/8546770.html

课下作业(第一周)

课下作业(第一周) 一.相关知识点总结 (一).教材代码完成情况测试P14(相关知识点:运行第一章所有代码并截图) (二).带包的代码编译运行测试 在Ubuntu或Windows 命令行中,建如下目录结构(参考附图) 2016XXXX(学号) src Hello.java bin Hello.java的内容见附件 package isxxxx; (xxxx替换为你的四位学号) 编译运行Hello.java ,提交运行结果截图,要全屏 课上要git add ; git commit ;课下把代码g

课下作业2

课下作业(选做) 课上知识点总结: (详情请戳娄老师给出的使用JDB调试Java程序.) 输入jdb -classpath .:./bin SumofRecur 3方可进入JDB调试(3为函数的输入值): 进入函数不能使用next,要使用step: 想观察某个值,可使用print 你想观察的值语句: 课上内容补做: 首先是递归循环部分,我发现自己并不是从命令行输入,于是在此改了一下: 其次是jdb命令的补做: 原文地址:https://www.cnblogs.com/nmsl123/p/8640

20165306 第四周课下作业

第四周课下作业 一.相关知识点总结 Ctrl+Shift+T 打开三个标签页,Alt+1进入第一个标签页 vim HelloJDB.java编辑调试示例代码 javac -g -d bin src/HelloJDB.java编译,-g 参数为了产生各种调试信息,一定要加上 jdb -classpath .:./bin HelloJDB 调试 stop in方法断点,stop at行断点 run运行,locals查看变量 print i或eval i查看变量i的值 list查看运行到了源代码的什么