1、简述计算机操作系统中的“中断”的作用?

中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。
待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。 当遇到IO操作时或一个进程运行时间过长或被更高的优先级的进程替代时出现中断。有利于合理利用有限的系统资源,提高程序运行效率。

2、简述计算机内存中的“内核态”和“用户态”;

处于用户态的程序只能访问用户空间,而处于内核态的程序可以访问用户空间和内核空间。
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。此时处理器在特权级最低的(3级)用户代码中运行。
用户态切换到内核态的3种方式:
1、系统调用:这是用户态进程主动要求切换到内核态的一种方式
2、异常
3、外围设备的中断

3、进程间通信方式有哪些?

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC的方式通常有:管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

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

  管道:通常指无名管道
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
  队列:是消息的链接表。一个消息队列由一个标识符(即队列ID)来标识。
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

  队列和管道都是将数据存放于内存中,而队列是基于“管道+锁”实现的。

5、请列举你知道的进程间通信方式;

1.管道(无名管道):速度慢,容量有限,只有父子进程能通讯。它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。  
2.FIFO(命名管道):任何进程间都能通讯,但速度慢,它是一种文件类型。    
3.消息队列:是消息的链接表,存放在内核中。消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除,所以要注意第一次读的时候,要考虑上一次没有读完数据的问题。容量受到系统限制。消息队列可以实现消息的随机查询  
4.信号量:信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。   
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

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

Stevens给出的定义(其实是POSIX的定义)是这样子的:  
A synchronous I/O operation causes the requesting process to be blocked until that I/O operationcompletes;  
An asynchronous I/O operation does not cause the requesting process to be blocked;   
同步IO:当程序发生IO操作时,会将进程阻塞,直到IO操作完成才能继续执行后面的代码。如:blocking IO,non-blocking IO,IO multiplexing。
异步IO:进程不会发生阻塞。如:asynchronous IO。

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

使用Value或者Array把数据存储在一个共享的内存表中,用于实现进程间共享状态。
Value( typecode, arg1, … argN, lock ) 
在共享内容中常见ctypes对象。typecode要么是包含array模块使用的相同类型代码(如’i’,’d’等)的字符串,要么是来自ctypes模块的类型对象(如ctypes.c_int、ctypes.c_double等)。
所有额外的位置参数arg1, arg2 ….. argN将传递给指定类型的构造函数。lock是只能使用关键字调用的参数,如果把它置为True(默认值),将创建一个新的锁定来包含对值的访问。
如果传入一个现有锁定,比如Lock或RLock实例,该锁定将用于进行同步。如果v是Value创建的共享值的实例,便可使用v.value访问底层的值。例如,读取v.value将获取值,而赋值v.value将修改值。

 RawValue( typecode, arg1, … ,argN) 
同Value对象,但不存在锁定。

 Array( typecode, initializer, lock ) 
在共享内存中创建ctypes数组。typecode描述了数组的内容,意义与Value()函数中的相同。initializer要么是设置数组初始大小的整数,要么是项目序列,其值和大小用于初始化数组。lock是只能使用关键字调用的参数,意义与Value()函数中相同。
如果a是Array创建的共享数组的实例,便可使用标准的python索引、切片和迭代操作访问它的内容,其中每种操作均由锁定进行同步。对于字节字符串,a还具有a.value属性,可以吧整个数组当做一个字符串进行访问。

 RawArray(typecode, initializer ) 
同Array对象,但不存在锁定。当所编写的程序必须一次性操作大量的数组项时,如果同时使用这种数据类型和用于同步的单独锁定(如果需要的话),性能将得到极大的提升。
# 进程间共享状态,当然尽最大可能防止使用共享状态,但最终有可能会使用到.
# 1-共享内存
# 可以通过使用Value或者Array把数据存储在一个共享的内存表中
from multiprocessing import Process,Value,Array
import time


def f(n, a, name):
    time.sleep(1)
    n.value = name * name
    for i in range(len(a)):
        a[i] = -i


process_list = []
if __name__ == '__main__':
    num = Value('d',0.0)  # d表示一个双精浮点类型
    arr = Array('i',range(10))  # i表示一个带符号的整型
    for i in range(10):
        p = Process(target=f,args=(num, arr, i))
        p.start()
        process_list.append(p)
    for j in process_list:
        j.join()
    print(num.value)
    print(arr[:])
# 更加灵活的共享内存可以使用multiprocessing.sharectypes模块
View Code

相关文章:

  • 2021-12-23
  • 2021-12-10
  • 2021-11-13
  • 2022-12-23
  • 2021-11-13
  • 2022-12-23
  • 2021-06-23
  • 2022-01-18
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-24
  • 2021-12-04
  • 2021-06-16
  • 2021-12-04
相关资源
相似解决方案