1、简述计算机操作系统中的“中断”作用?
中断装置由一些特定的寄存器和控制线路组成,中央处理器和外围设备等识别到的事件保存在特定的寄存器中。
中央处理器每执行完一条指令,均由中断装置判别是否有事件发生。
若无事件发生,CPU继续执行;
若有事件发生,则中断装置中断原占有CPU的程序的执行,让操作系统的处理事件服务程序占用CPU,对出现的事件进行处理,事件处理完后,再让原来的程序继续占用CPU执行
2、简述计算机内存中的“内核态”和“用户态”
操作系统的核心是内核,独立于普通的应用程序,内核可以访问受保护的内存空间,也可以访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操作系统将虚拟空间划分为两部分,一部分是内核空间,一部分是用户空间。
3、进程间通信方式有哪些?
1、管道
2、有名管道(FIFO)
3、消息队列
4、信号量
5、共享内存
6、套接字(socket)
4、简述你对管道、队列的理解;
管道通常指无名管道
1、它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
2、它只能用于具有亲缘关系的进程中通信(也就是父与子进程或者兄弟进程之间)
3、数据不可反复读取了,即读了之后欢喜红区中就没有了
消息队列
1、消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
2、消息队列独立于发送与接收进程。进程终止时,消息队列及其内容不会被删除。
3、消息队列可以实现消息随机查询。
5、什么是同步I/O,什么是异步I/O?
同步和异步关注的消息通信机制
同步io
用户态向内核态发出一个调用,在没有得到结果之前,该调用返回,一旦返回就有返回值。
换句话说,就是调用者主动等待这个调用的结果
异步io
用户态向内核态发出调用,这个调用立即返回,所以没有返回结果。
换句话说,调用者发出调用后,不会立即得到结果,被调用者通过状态、通知或者回调函数处理这个调用。
6、写一个程序,包含十个线程,同时只能有五个子线程并行执行;
import threading
from threading import Semaphore
import time
def task(sm, i):
sm.acquire()
time.sleep(1)
print(i)
sm.release()
if __name__ == ‘__main__‘:
sm = Semaphore(5)
for i in range(9):
t = threading.Thread(target=task, args=(sm, i ))
t.start()
7、写一个程序,要求用户输入用户名和密码,要求密码长度不少于6个字符,且必须以字母开头,如果密码合法,则将该密码使用md5算法加密后的十六进制概要值存入名为password.txt的文件,超过三次不合法则退出程序;
import hashlib
import re
import json
count = 0
hash = hashlib.md5()
while count < 3:
user = input("user>>").strip()
pwd = input("pwd>>").strip()
print()
if len(pwd) >= 6 and re.search(‘\A[a-zA-Z]‘, pwd):
pwd_md5 = hash.hexdigest()
with open(‘password.txt‘, ‘w‘) as f:
data = {user: pwd_md5}
f.write(json.dumps(data))
print("保存成功")
break
else:
count += 1
print("密码不合法")
8、写一个程序,使用socketserver模块,实现一个支持同时处理多个客户端请求的服务器,要求每次启动一个新线程处理客户端请求;
import socketserver
import threading
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
while True:
self.data = self.request.recv(1024).decode()
print(self.data)
self.request.send(self.data.upper().encode())
if __name__ == ‘__main__‘:
server = socketserver.ThreadingTCPServer((‘127.0.0.1‘, 9999), MyServer)
t = threading.Thread(target=server.serve_forever)
t.start()