必会题

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.进程和线程的区别​?

定义的不同:


  1. 进程:​进程是系统进行资源分配和调度的一个独立单位​.
  2. 线程:线程是进程的一个实体,是​CPU调度和分派的基本单位​,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

区别:


  1. 一个程序至少有一个进程,一个进程至少有一个线程.
  2. 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
  3. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  4. 线线程不能够独立执行,必须依存在进程中
  5. 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人

优缺点:

  1. 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。


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文件下载器多线程版本  客户端

1import threading,os
2from socket import *
3
4def down_load_file(recv_data):
5 recv_data = recv_data.decode()
6 index = recv_data.find(" ")
7 file_name =recv_data[0:index]
8 print(file_name,"----")
9 file_content = recv_data[index+1:]
10 with open(file_name,'w') as f:
11 f.write(file_content)
12
13def main():
14 # 创建socket
15 tcp_client_socket = socket(AF_INET, SOCK_STREAM)
16
17 # 目的信息
18 server_ip = input("请输入服务器ip:")
19 server_port = int(input("请输入服务器port:"))
20
21 # 链接服务器
22 tcp_client_socket.connect((server_ip, server_port))
23
24 # 输入需要下载的文件名
25 dir_name = input("请输入要下载的文件夹名:")
26
27 # 发送文件下载请求
28 tcp_client_socket.send(dir_name.encode("utf-8"))
29 new_dir = "[download]"+dir_name
30 os.mkdir(new_dir)
31 os.chdir(new_dir)
32
33 while True:
34 # 接收对方发送过来的数据
35 recv_data = tcp_client_socket.recv(1024*1024)
36 if recv_data:
37 t = threading.Thread(target=down_load_file,args=(recv_data,))
38 t.start()
39
40 # 关闭套接字
41 tcp_client_socket.close()
42
43if __name__ == "__main__":
44 main()


12TCP文件下载器多线程版本  服务端

1import threading
2from socket import *
3import sys,os
4
5def send_file(sock,file_name):
6 try:
7 with open(file_name,"r") as f:
8 content = file_name+' '+f.read()
9 sock.send(content.encode())
10 except Exception as e:
11 print(e)
12 print("结束")
13
14def main():
15 if len(sys.argv) != 2:
16 print("请按照如下方式运行:python3 xxx.py 7890")
17 return
18 else:
19 # 运行方式为python3 xxx.py 7890
20 port = int(sys.argv[1])
21
22 # 创建socket
23 tcp_server_socket = socket(AF_INET, SOCK_STREAM)
24 # 本地信息
25 address = ('', port)
26 # 绑定本地信息
27 tcp_server_socket.bind(address)
28 # 将主动套接字变为被动套接字
29 tcp_server_socket.listen(128)
30
31 while True:
32 # 等待客户端的链接,即为这个客户端发送文件
33 client_socket, clientAddr = tcp_server_socket.accept()
34 # 接收对方发送过来的数据
35 dir_name = client_socket.recv(1024*1024)
36 if dir_name:
37 os.chdir(dir_name)
38 file_list =os.listdir("./")
39 for i in file_list:
40 t = threading.Thread(target=send_file,args=(client_socket,i))
41 t.start()
42
43 # 关闭监听套接字
44 tcp_server_socket.close()
45
46if __name__ == "__main__":
47 main()


13. 进程能否共享全局变量?

不能,他们拥有的是独立的空间和资源


14. 主进程是否等待子进程?

是的,但是异步方式添加到进程池时,主进程不会等待


15. 如何让主进程退出时不等待子进程?

设置子进程的daemon属性为True:p.daemon=True

p.terminate()


16. 进程间是怎么进行通信的​?

进程拥有相互独立的空间和资源,要进行通信需要借助Queue()


17. 进程池的作用?

如果需要创建很多的子进程时,进程池会大大的节省工作代码量

节省创建和回收进程资源的开销


18. 进程池使用流程?

常见pool对象----添加任务(同步和异步的方式)----关闭


19.进程中进程间如何通信

使用multiprocessing.Manager().Queue()