并发编程练习题

##一、简述计算机操做系统中的“中断”的做用?html

概念:中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程python

做用:算法

1.CPU与外设同步工做数组

2.实时处理安全

3.故障处理服务器

##二、简述计算机内存中的“内核态”和“用户态”;网络

内核态: CPU能够访问内存全部数据, 包括外围设备, 例如硬盘, 网卡. CPU也能够将本身从一个程序切换到另外一个程序多线程

用户态: 只能受限的访问内存, 且不容许访问外围设备. 占用CPU的能力被剥夺, CPU资源能够被其余程序获取并发

为何要有用户态和内核态

因为须要限制不一样的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 — 用户态内核态异步

用户态与内核态的切换

全部用户程序都是运行在用户态的, 可是有时候程序确实须要作一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而惟一能够作这些事情的就是操做系统, 因此此时程序就须要先操做系统请求以程序的名义来执行这些操做.

这时须要一个这样的机制: 用户态程序切换到内核态, 可是不能控制在内核态中执行的指令

这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction)

他们的工做流程以下:

  1. 用户态程序将一些数据值放在寄存器中, 或者使用参数建立一个堆栈(stack frame), 以此代表须要操做系统提供的服务.
  2. 用户态程序执行陷阱指令
  3. CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操做系统的一部分, 他们具备内存保护, 不可被用户态程序访问
  4. 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler). 他们会读取程序放入内存的数据参数, 并执行程序请求的服务
  5. 系统调用完成后, 操做系统会重置CPU为用户态并返回系统调用的结果

三、进程间通讯方式有哪些?

1)管道

管道分为有名管道和无名管道

无名管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用.进程的亲缘关系通常指的是父子关系。无明管道通常用于两个不一样进程之间的通讯。当一个进程建立了一个管道,并调用fork建立本身的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。

有名管道也是一种半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

2)信号量

信号量是一个计数器,能够用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常做为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.所以,主要做为进程间以及同一个进程内不一样线程之间的同步手段.

3)信号

信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生.

4)消息队列

消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特色.消息队列是UNIX下不一样进程之间可实现共享资源的一种机制,UNIX容许不一样进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具备操做权限的进程均可以使用msget完成对消息队列的操做控制.经过使用消息类型,进程能够按任何顺序读信息,或为消息安排优先级顺序.

5)共享内存

共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问.共享内存是最快的IPC(进程间通讯)方式,它是针对其它进程间通讯方式运行效率低而专门设计的.它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步与通讯.

6)套接字:可用于不一样及其间的进程通讯

四、简述你对管道、队列的理解;

见T3

五、请列举你知道的进程间通讯方式;

见T3

六、什么是同步I/O,什么是异步I/O?

    A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;    An asynchronous I/O operation does not cause the requesting process to be blocked;  二者的区别就在于synchronous IO作”IO operation”的时候会将process阻塞。

七、请问multiprocessing模块中的Value、Array类的做用是什么?举例说明它们的使用场景

alue,Array(用于进程通讯,资源共享)

multiprocessing 中Value和Array的实现原理都是在共享内存中建立ctypes()对象来达到共享数据的目的,二者实现方法大同小异,只是选用不一样的ctypes数据类型而已。

Value

构造方法:Value((typecode_or_type, args[, lock])

  • typecode_or_type:定义ctypes()对象的类型,能够传Type code或 C Type,具体对照表见下文。
  • args:传递给typecode_or_type构造函数的参数
  • lock:默认为True,建立一个互斥锁来限制对Value对象的访问,若是传入一个锁,如Lock或RLock的实例,将用于同步。若是传入False,Value的实例就不会被锁保护,它将不是进程安全的。

typecode_or_type支持的类型:

| Type code | C Type             | Python Type       | Minimum size in bytes |
| --------- | ------------------ | ----------------- | --------------------- |
| `'b'`     | signed char        | int               | 1                     |
| `'B'`     | unsigned char      | int               | 1                     |
| `'u'`     | Py_UNICODE         | Unicode character | 2                     |
| `'h'`     | signed short       | int               | 2                     |
| `'H'`     | unsigned short     | int               | 2                     |
| `'i'`     | signed int         | int               | 2                     |
| `'I'`     | unsigned int       | int               | 2                     |
| `'l'`     | signed long        | int               | 4                     |
| `'L'`     | unsigned long      | int               | 4                     |
| `'q'`     | signed long long   | int               | 8                     |
| `'Q'`     | unsigned long long | int               | 8                     |
| `'f'`     | float              | float             | 4                     |
| `'d'`     | double             | float             | 8                     |

参考地址:docs.python.org/3/library/a…

Array

构造方法:Array(typecode_or_type, size_or_initializer, **kwds[, lock])

  • typecode_or_type:同上
  • size_or_initializer:若是它是一个整数,那么它肯定数组的长度,而且数组将被初始化为零。不然,size_or_initializer是用于初始化数组的序列,其长度决定数组的长度。
  • kwds:传递给typecode_or_type构造函数的参数
  • lock:同上

使用示例:

import multiprocessing
 
def f(n, a):
    n.value = 3.14
    a[0] = 5
 
if __name__ == '__main__':
    num = multiprocessing.Value('d', 0.0)
    arr = multiprocessing.Array('i', range(10))
    p = multiprocessing.Process(target=f, args=(num, arr))
    p.start()
    p.join()
    print(num.value)
    print(arr[:])

注意:Value和Array只适用于Process类。

八、请问multiprocessing模块中的Manager类的做用是什么?与Value和Array类相比,Manager的优缺点是什么?

Manager(用于资源共享)

Manager()返回的manager对象控制了一个server进程,此进程包含的python对象能够被其余的进程经过proxies来访问。从而达到多进程间数据通讯且安全。Manager模块常与Pool模块一块儿使用。

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array。

管理器是独立运行的子进程,其中存在真实的对象,并以服务器的形式运行,其余进程经过使用代理访问共享对象,这些代理做为客户端运行。Manager()是BaseManager的子类,返回一个启动的SyncManager()实例,可用于建立共享对象并返回访问这些共享对象的代理。

九、写一个程序,包含十个线程,子线程必须等待主线程sleep 10秒钟以后才执行,并打印当前时间;

十、写一个程序,包含十个线程,同时只能有五个子线程并行执行;

十一、写一个程序,要求用户输入用户名和密码,要求密码长度很多于6个字符,且必须以字母开头,若是密码合法,则将该密码使用md5算法加密后的十六进制概要值存入名为password.txt的文件,超过三次不合法则退出程序;

十二、写一个程序,使用socketserver模块,实现一个支持同时处理多个客户端请求的服务器,要求每次启动一个新线程处理客户端请求;

相关文章
相关标签/搜索