进程和线程
Youky ... 2021-10-8 About 2 min
# 进程和线程
# 并发和并行
- 并发是指宏观上多个任务同时运行,实际上是交替运行的
- 并行是指多CPU的情况下,多个线程微观上同时运行
# 进程和线程的区别
- 地址空间角度:一个进程内至少要有一个线程,多个线程可以共享进程的地址空间,而进程间的地址空间是独立的
- 进程是资源分配的基本单位,同一个进程内的线程共享进程的资源
- 线程是处理器调度的基本单位
# 为什么需要线程
进程切换的开销很大:
- 处理机的上下文切换
- 与进程相关的数据结构的改变,如页表、各种队列等
因此引入了线程:一个进程分为的多个执行任务的单元体,只为其分配处理机。线程的切换只需切换必须的与处理机相关的信息,减少了开销。
# 进程的状态
- 就绪:一个进程获得了处理机以外的所有资源,得到处理机即可运行的状态
- 运行:正在处理机上运行
- 阻塞:也称为等待状态,进程在等待某件事发生(如等待IO完成)而暂时停止运行
# 进程间通信IPC
# 信号
是一种“发布-订阅”的模式,由操作系统事先定义,接收到该信号的进程可以采取自定义的响应行为
# 信号量
信号量是一种特殊的变量,对它的操作通过PV原语,P表示减少,V表示增加
# 管道
管道是一种半双工通信方式,如在Linux中用管道操作符|
表示两个两个命令之间的数据通信,前一个命令的标准输出会作为下一个命令的标准输入
# 共享内存
允许不同进程共享一段物理内存,进程将该段共享内存映射到自己的地址空间,然后像访问普通内存一样对其进行访问。
不同进程通过向共享内存读写数据来交换信息。
- 优点:简单高效。
- 缺点:存在并发问题
# 消息队列
- 是一个消息的链表,保存在内核中
- 提供了有格式的数据
- 是异步的,接收者必须通过轮询消息队列,才能收到消息
# 套接字Socket
- Socket可以用于不同计算机的进程之间,也可以用于同一台计算机的不同进程之间
- 进行通信的进程首先各自创建一个socket,包含主机号和端口号,声明自己接受来自某端口地址的数据
- 进程通过socket把消息发送到网络层,网络层通过主机地址将其发送到目的主机,目的主机通过端口号将消息发送到目的进程