必会题
1.简述你对进程的理解
进程是应用程序在操作系统中的一种实例表现,一个应用程序至少会对应一个进程。
进程是系统进行资源分配基本单位,每启动一个进程操作系统都需要为其分配运行资源。
在创建子进程时,子进程会复制当前父进程的执行环境。
线程是依附在进程里面的,没有进程就没有线程,一个进程默认提供一条线程,进程可以创建多个线程
2.进程在执行过程中的状态有几种?
就绪态:运行的条件都已经慢去,正在等在cpu执行
执行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
练习题
1.UDP和TCP哪种协议可以发送广播消息?如何发送广播消息?
复习UDP和TCP的区别
UDP(TCP是一对一连接的)
设置socket选项为广播:setsockopt(socket.SOL_SOCK,socket.SO_BROADCAST,True),并设置发送目的地址为广播地址("xxx.xxx.xxx.255")
2.什么是程序?什么是进程?
程序是一些可执行的静态文件,比如我们写的**.py
一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元
3.进程和线程的区别?
定义的不同:
- 进程:进程是系统进行资源分配和调度的一个独立单位.
- 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
区别:
- 一个程序至少有一个进程,一个进程至少有一个线程.
- 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
- 线线程不能够独立执行,必须依存在进程中
- 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人
优缺点:
- 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。
4.进程的状态有哪些,分别表示什么含义?
就绪态:运行的条件都已经慢去,正在等在cpu执行
执行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
5.进程的创建方式?启动方式?
p = multiprocessing.Process(target=func_name) #不要加括号
p.start()
6.如何查看当前进程信息?
multiprocessing.current_process()
7.获取当前进程编号的方式?
current_process.pid
os.getpid()
8.如何获取父进程的编号?
os.getppid()
9.怎么根据进程号强制销毁对应进程?
os.kill(pid, 9)
10.创建线程常用参数及意义?
group:进程组,目前只能设置为None
target:要执行的任务函数,不加括号
name:指定进程名
args:给任务函数传参,类型为元组
kwargs:给任务函数传参,类型为字典,键名为形参
11.完成TCP文件下载器多线程版本 客户端
import threading,os from socket import * def down_load_file(recv_data): recv_data = recv_data.decode() index = recv_data.find(" ") file_name =recv_data[0:index] print(file_name,"----") file_content = recv_data[index+1:] with open(file_name,'w') as f: f.write(file_content) def main(): # 创建socket tcp_client_socket = socket(AF_INET, SOCK_STREAM) # 目的信息 server_ip = input("请输入服务器ip:") server_port = int(input("请输入服务器port:")) # 链接服务器 tcp_client_socket.connect((server_ip, server_port)) # 输入需要下载的文件名 dir_name = input("请输入要下载的文件夹名:") # 发送文件下载请求 tcp_client_socket.send(dir_name.encode("utf-8")) new_dir = "[download]"+dir_name os.mkdir(new_dir) os.chdir(new_dir) while True: # 接收对方发送过来的数据 recv_data = tcp_client_socket.recv(1024*1024) if recv_data: t = threading.Thread(target=down_load_file,args=(recv_data,)) t.start() # 关闭套接字 tcp_client_socket.close() if __name__ == "__main__": main()
12TCP文件下载器多线程版本 服务端
import threading from socket import * import sys,os def send_file(sock,file_name): try: with open(file_name,"r") as f: content = file_name+' '+f.read() sock.send(content.encode()) except Exception as e: print(e) print("结束") def main(): if len(sys.argv) != 2: print("请按照如下方式运行:python3 xxx.py 7890") return else: # 运行方式为python3 xxx.py 7890 port = int(sys.argv[1]) # 创建socket tcp_server_socket = socket(AF_INET, SOCK_STREAM) # 本地信息 address = ('', port) # 绑定本地信息 tcp_server_socket.bind(address) # 将主动套接字变为被动套接字 tcp_server_socket.listen(128) while True: # 等待客户端的链接,即为这个客户端发送文件 client_socket, clientAddr = tcp_server_socket.accept() # 接收对方发送过来的数据 dir_name = client_socket.recv(1024*1024) if dir_name: os.chdir(dir_name) file_list =os.listdir("./") for i in file_list: t = threading.Thread(target=send_file,args=(client_socket,i)) t.start() # 关闭监听套接字 tcp_server_socket.close() if __name__ == "__main__": main()
13. 进程能否共享全局变量?
不能,他们拥有的是独立的空间和资源
14. 主进程是否等待子进程?
是的,但是异步方式添加到进程池时,主进程不会等待
15. 如何让主进程退出时不等待子进程?
设置子进程的daemon属性为True:p.daemon=True
p.terminate()
16. 进程间是怎么进行通信的?
进程拥有相互独立的空间和资源,要进行通信需要借助Queue()
17. 进程池的作用?
如果需要创建很多的子进程时,进程池会大大的节省工作代码量
节省创建和回收进程资源的开销
18. 进程池使用流程?
常见pool对象----添加任务(同步和异步的方式)----关闭
19.进程中进程间如何通信
使用multiprocessing.Manager().Queue()