【操作系统】进程或线程间的通信与调度

进程、线程的区别

  1. 定义:
    • 进程是程序的一次执行过程,是系统资源分配和调度的基本单位;
    • 线程是进程的一个实体,是CPU调度和执行的最小单位。
  2. 拥有资源:
    • 进程拥有独立的地址空间,包括代码区、全局/静态区、堆区、栈区等资源;
    • 同一个进程中的不同线程共享进程中的地址空间,共享代码区、全局/静态区、堆区、文件、工作目录等,独占线程上下文(线程ID、线程所属栈区、栈指针、程序计数器、函数运行寄存器)。
  3. 创建和销毁:
    • 进程创建和销毁由操作系统内核执行系统调用,开销较大;
    • 线程创建和销毁由线程自行执行,无需系统调用,开销较小。
  4. 切换代价:
    • 进程具有独立的地址空间,进程间上下文切换需切换内存,开销较大;
    • 线程共享进程的内存空间,上下文切换仅需保存和恢复线程上下文,开销较小。
  5. 通信方式:
    • 进程间通信需要额外机制,如管道、消息队列、共享内存、信号、信号量、套接字;
    • 线程间通信仅需基本的机制,如锁(互斥锁、自旋锁、条件变量、读写锁)、信号、信号量、共享内存。
  6. 并发性:
    • 进程并发性低,因为进程间地址空间独立,通信和同步开销大;
    • 线程间并发性高,因为线程间共享内存,通信和同步开销小。

并行和并发的区别

  1. 并行是在同一时刻执行多个任务,每个任务都在不同的处理单元(如多个CPU核心)上执行。
  2. 并发是在相同的时间段内执行多个任务,任务可能交替执行,通过时间片轮转或者事件驱动等调度实现。

用户态和内核态的区别

用户态和内核态是操作系统为了保护系统硬件资源和实现权限控制而设计的两种不同的CPU运行级别。

  1. 用户态:进程或程序只能访问受限的资源和执行受限的指令集,不能直接访问操作系统的核心部分,也不能直接访问硬件资源。
  2. 内核态:内核态是操作系统的特权级别,允许进程或程序直接访问操作系统核心部分,包括硬件资源、系统调用,内存管理、文件系统等。

内核态和用户态切换的时机

  1. 系统调用:当用户程序需要请求操作系统提供的服务时,会通过系统调用进入内核态。
  2. 异常:当程序执行过程中出现错误或异常情况时,CPU会自动切换到内核态,以便处理这些异常。
  3. 中断:外部设备产生的中断信号会使CPU从用户态切换到内核态,并执行相应的中断处理程序,然后再切换回用户态。

进程调度算法

  1. 先来先服务:按照请求顺序进行调度。简单,但会导致较长作业阻塞较短作业。
  2. 最短作业优先:按估计运行时间由短到长调度。在不断到达短作业的情况下,会导致长作业一直无法被调度。
  3. 最短剩余时间优先:按照估计剩余运行时间由短到长调度。当新作业到达时,将其估计运行时间与当前作业剩余运行时间比较,若新作业耗时较短,则挂起当前作业,运行新作业。
  4. 优先级调度:为每个作业分配一个优先级,优先级高的作业先调度。为防止优先级低的作业一直无法被调度,会根据等待时长提高优先级。
  5. 时间片轮转:为每个进程分配一个时间片,每当一个进程的时间片用完时,切换到下一个进程。
  6. 多级队列:结合时间片轮转和优先级调度,根据优先级将进程分为不同队列,每个队列都有自己的时间片轮转。

进程间通信方式

  1. 管道:在父子进程间工作的半双工通信方式,同一时间数据只能单向流动。
  2. 命名管道:与管道类似,但允许非父子进程使用管道通信。
  3. 消息队列:即消息的链表,发送消息时将消息加入链表,接收消息时从链表取出。可以设置消息优先级。
  4. 共享内存:速度最快的进程间通信。不同进程将一块虚拟地址映射到同一块物理地址,使得不同进程可以访问相同的内存地址资源。
  5. 信号量:用于控制不同进程或线程对共享资源的访问,避免发生同时访问造成的冲突或错误。
  6. 信号:用于进程间异步发送通知,告知发生某种事件或条件,并执行对应的中断处理程序。
  7. socket套接字:可用于同主机进程间通信和不同主机进程间跨网络通信,可用于TCP/IP或UDP网络通信。
  8. 互斥锁:用于不同进程访问相同系统资源时的互斥,确保一个资源在同一时间只被一个进程访问。
  9. 条件变量:通常与互斥锁配合使用,用于在符合给定条件时,进程间实现同步。

进程的同步和互斥及其实现

  1. 进程同步:多个并发执行的进程之间协调管理他们的执行顺序,以确保进程按照一定的顺序或时间间隔执行。
  2. 进程互斥:在某个时刻只允许一个进程访问某个共享资源。当一个进程正在使用共享资源时,其他进程不能同时访问该资源。
  3. 信号量:表示资源的数量或状态。通过PV操作控制信号量的增减,从而控制进程之间的同步或互斥。
    • P操作为减少信号量,相当于申请资源。若信号量仍大于零,则说明资源未占用,进程使用资源。
    • V操作为增加信号量,相当于归还资源。若信号量仍小于零,则说明资源被占用,有进程被阻塞,归还资源后唤醒该资源。
  4. 互斥锁:用于实现进程互斥。每个共享资源关联一个互斥锁,只有获取锁才能使用该共享资源。进程访问该资源时需要先获取锁,使用完该资源后释放锁。
  5. 临界区:将可能引发互斥冲突的代码和资源置于临界区。该区域同时仅能有一个进程访问。进入临界区时需要获取锁,退出临界区时释放锁。
  6. 条件变量:常与互斥锁共用,用于在进程之间传递消息,确保在特定条件下等待或唤醒。

死锁

两个或多个进程相互持有对方所需的共享资源的互斥锁且不释放,导致都在等待对方释放锁,形成僵持局面,各个进程无法继续执行。

需要满足以下四个条件:

  1. 互斥条件:一个进程在占用某个资源时,其他进程无法访问该资源。
  2. 请求保持条件:一个进程阻塞在请求资源时,不会释放自己已持有的资源。
  3. 不可剥夺条件:资源只能由持有进程自行释放,其他进程无法强行获取该资源。
  4. 循环等待条件:多个进程之间形成循环等待链,每个进程都在等待下一个进程释放资源。

避免死锁

  1. 破坏条件:如破坏循环等待条件,让所有进程按照相同的顺序请求资源。
  2. 检测死锁:通过资源分配图、银行家算法等检测系统是否存在死锁。
  3. 解除死锁:通过抢占资源、终止循环等待链中的某进程或资源回收等方式解除死锁。

常用Linux命令

  1. ls:列出当前目录下的文件和子目录
  2. cd:切换目录
  3. pwd:显示当前工作目录的路径
  4. touch:创建新文件
  5. mkdir:创建新目录
  6. rm:删除文件或目录
  7. cp:复制文件或目录
  8. mv:移动文件或目录,或重命名
  9. cat:显示文件内容
  10. vi:编辑文件
  11. head:查看文件开头
  12. tail:查看文件结尾
  13. grep:查找文件或其他内容里符合条件的字符串
  14. find:查找文件或目录
  15. chmod:更改文件或目录的权限
  16. chown:更改文件或目录的所有权
  17. ps:列出运行中的进程
  18. kill:终止进程
  19. df:显示磁盘空间使用情况
  20. tar:创建和提取归档文件
  21. ifconfig:查看ip地址
  22. ping:测试网络连接
  23. ssh:通过SSH协议远程登录到其他计算机
  24. apt:包管理器,安装/更新/删除软件包

Linux查看进程、关闭进程、查看端口占用情况

  1. 查看进程:ps命令查看进程。ps aux查看所有进程,ps和grep连用查看特定进程。
  2. 关闭进程:用ps或top找到进程PID,再用kill PID来关闭进程。常用kill -9强制关闭进程。
  3. 查看端口:用lsof -i: 端口号查看占用特定端口的进程,或用netstat -tulnp | grep 端口号显示监听在该端口的服务及进程ID。

select、poll、epoll

  1. select:
    • 将当前进程的所有文件描述符一次性从用户态拷贝到内核态,再由操作系统内核轮训每个文件描述符,判断是否有IO就绪事件。当有数据到达时,内核将所有fd从内核态复制回用户态,并返回已就绪fd的数量。在用户态遍历所有fd,检查就绪fd,执行对应的事件处理函数。
    • 由于底层数据结构为BitsMap,导致能够监听的文件描述符个数有上限,为1024个。需频繁进行用户态和内核态的切换和拷贝,性能开销大。轮训和遍历检查时间复杂度高,为O(n)。
  2. poll:
    • 与select几乎相同。主要不同的点在于poll的底层数据结构为结构体数组,因此突破了1024个文件描述符的监听上限。
  3. epoll:
    • 先用epoll_wait创建一个epoll_fd,其中包含一个红黑树和一个就绪事件链表。再调用epoll_ctl将需要监听的文件描述符加入epoll_fd的红黑树。当该文件描述符有就绪事件时,通过回调函数将其加入就绪事件链表。当用户调用epoll_wait时,返回该就绪事件链表和其中文件描述符的个数。
    • 由于使用了红黑树,故向epoll_fd中注册文件描述符的时间复杂度为O(logn)。由于给每个文件描述符上的事件注册了回调函数,会直接加入就绪事件链表,故epoll方法检测事件的时间复杂度为O(1)。此外,红黑树和链表的底层数据结构避免了文件描述符存在上限的问题。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值