进程和线程的概念与区别
进程和线程的概念。
1、进程
- 进程是计算机中因运行程序的实体。
- 进程是程序的真正运行,用户下达运行程序的命令后,就会产生进程。同一程序可产生 多个进程。
- 进程有三种基本状态:运行状态、就绪状态、阻塞状态。
2、线程
- 线程是程序执行流 的最小单位。一般由线程ID,当前指令指针,寄存器集合和堆栈组成。
- 线程是进程的一个实体,是系统独立调度和分派的基本单位。
- 线程和同它在一个进程下的线程共享内存(但每个线程有自己独立的栈,堆是所有线程共享的)。
3、线程与进程的区别?
(1)调度:在传统操作系统中,拥有资源和独立调度的基本单位都是进程。引入线程之后,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程的切换,而不同进程中进行的线程切换,则会引起进程切换。
(2)拥有资源:进程是拥有资源的基本单位,线程不会拥有资源,但线程可以共享其隶属于进程的共享资源。
(3)并发性:进程可以并发执行,而且同一进程内的多个线程也可以并发执行,从而使操作系统具有良好的并发性,大大提高了系统吞吐量。
(4)系统开销:创建和撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备。在进程切换时,涉及当前执行进程CPU环境的保存以及新调度的进程CPU环境的设置;而线程切换时,只需保存和设置少量的寄存器内容。同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信比较容易实现。
(5)地址空间和其他资源:进程的地址空间之间互相独立,同一进程的各个线程间共享进程的资源,某进程内的线程对于其他进程不可见。
(6)通信方面:进程间通信需要借助操作系统,而线程间可以直接读/写进程数据段来进行通信。
● 典型的调度算法包括:先来先服务(FIFS)、短作业优先算法(SJF)、
优先级调度算法、高响应比优先调度算法、时间片轮转算法、多级反馈队列调度算法。
● 死锁产生的原因和必要条件。
原因: (1)系统资源的竞争。
(2)进程推进顺序非法。
必要条件:
(1)互斥条件。
(2)不剥夺条件。
(3)请求和保持条件。
(4)循环等待条件。
银行家算法是著名的死锁避免算法。
● 常用的置换算法有:最佳置换算法(OPT)、先进先出页面置换算法(FIFO)、最近最久未使用(LRU)置换算法。
4、进程通信
(1)管道(pipe)
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
(2)有名管道 (namedpipe)
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(3)信号量(semaphore)
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(4)消息队列(messagequeue)
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(5)信号 (sinal)
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(6)共享内存(shared memory)
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
(7)套接字(socket)
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。
5、线程间的通信方式
(1)锁机制:包括互斥锁、条件变量、读写锁
- 互斥锁提供了以排他方式防止数据结构被并发修改的方法。
- 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
- 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
wait/notify 等待
Volatile 内存共享
CountDownLatch 并发工具
CyclicBarrier 并发工具
(2)信号量机制(Semaphore)
包括无名线程信号量和命名线程信号量。
(3)信号机制(Signal)
类似进程间的信号处理。
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)