【刷题Day23】线程和进程(浅)
线程和进程有什么区别?
维度 | 进程 | 线程 |
---|---|---|
定义 | 资源分配的基本单位,每个进程都有自己独立的内存空间(代码段、数据段、堆栈等),可以看作是一个正在运行的程序实例。进程之间是相互独立的。 | CPU调度的基本单位,属于进程,一个进程中可以包含多个线程。线程共享进程的内存空间和资源(如文件句柄、数据段),但每个线程有自己独立的栈和寄存器。 |
资源消耗 | 进程时需要为其分配独立的内存空间和系统资源,创建和切换进程的开销较大。 | 线程间共享进程的资源,创建线程所需的开销较小,线程切换的开销远小于进程切换。 |
通信方式 | 因为各自独立的内存空间,进程间通信(IPC)较为复杂,需要使用管道、消息队列、共享内存、套接字等方式。 | 同一进程内的线程共享内存空间,因此线程直接读写内存即可,但注意需要使用同步机制避免数据错误。 |
进程之间的通信方式有哪些?
- 管道(Pipes):管道是一种单向通信方式,用于在父进程和子进程之间或者同一主机上的不同进程之间传递数据。它可以是匿名的,也可以是命名的。
- 命名管道(Named Pipes):与匿名管道类似,但具有一个在文件系统中有名的路径,允许不相关的进程之间进行通信。
- 消息队列(Message Queues):消息队列允许一个进程向另一个进程发送消息,消息在队列中按顺序存储,并且接收方可以按需接收。
- 共享内存(Shared Memory):共享内存允许多个进程访问同一块内存区域,从而实现快速的数据交换。但需要注意同步问题,以避免竞态条件和数据一致性问题。
- 信号量(Semaphores):信号量是一种同步原语,用于管理对共享资源的访问。它可以用于实现进程间的互斥访问和同步操作。
- 信号(Signal):信号是一种异步的通信方式,用于通知目标进程发生了某个事件。信号常用于进程之间发送中断或终止命令。
- 套接字(Sockets):套接字允许在网络上的不同主机上的进程进行通信,是实现网络通信的基础。
- 文件(File):进程可以通过读写文件来进行通信,这种方式通常用于进程之间的间接通信,例如使用临时文件或者共享文件。
进程的调度算法你知道吗?
- 先来先服务(FCFS,First-Come,First-Served): 按照进程到达的顺序进行调度,适用于批处理系统。简单易实现,但可能造成”长任务“拖延其他任务的执行。
- 短作业优先(SJF,Shortest Job First): 优先调度执行时间最短的进程,能减少平均等待时间。分为非抢占式和抢占式(SRTF,Shortest Remaining Time First)。但它需要预先知道任务执行时间,不适用于交互式系统。
- 优先级调度(Priority Scheduling): 根据进程的重要性(优先级)来调度,优先级高的进程先执行。适用于需要不同优先级服务的场景。可能导致”低优先级进程“长期得不到调度,造成饥饿现象。
- 时间片轮转(RR,Round Robin): 为每个进程分配固定的时间片,时间片结束后调度下一个进程。适用于交互式系统,能提升系统响应性。时间片的选择对系统性能有重要影响。
- 最高相应比优先(HRRN,Highest Response Ratio Next): 通过计算响应比来决定下一个被调度的进程,适合在批处理环境中平衡长短任务的等待时间,防止短任务过多导致长任务饥饿。
- 多级反馈队列调度(MLFQ,Multilevel Feedback Queue): 结合多个调度策略,通过将进程放入不同优先级的队列,实现灵活的调度机制。优先级较高的进程先被调度,随着执行时间增加,进程可能被降至低优先级队列。适合多任务、多类型的操作系统。