操作系统面试高频(一)线程与进程
1.什么是线程?进程,线程,彼此有什么区别?⭐⭐⭐
进程
- 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位。
- 是操作系统结构的基础。
- 进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程
- 线程是操作系统最小的运算调度单位。
- 线程包含在进程中,是进程中实际执行任务的单位。
- 在一些操作系统中,线程也被称为轻量级进程
线程和进程区别:
- 线程是进程的一部分,是进程内的实际执行单位,而进程则是操作系统分配资源的基本单位。
- 每个进程都有独立的地址空间和系统资源,而线程共享同一进程的地址空间和系统资源。
- 线程之间的切换比进程之间的切换更快,因为线程共享相同的上下文和资源。
- 线程间通信更加方便,可以直接读写共享内存,而进程间通信需要通过特定的机制(如管道、消息队列等)。
- 进程的创建和销毁比线程的开销更大。
- 进程是相对独立的,一个进程的崩溃不会影响其他进程,而线程是相互依赖的,一个线程的崩溃会导致整个进程的崩溃。
2.什么时候用进程,什么时候用线程?⭐⭐
使用进程的情况:
- 需要独立的地址空间和系统资源:如果任务需要运行在独立的环境中,不同任务之间的数据隔离较为重要,那么可以选择使用进程。
- 需要更高的安全性和稳定性:如果一个任务的崩溃不应该影响其他任务的正常运行,使用进程可以保证更高的安全性和稳定性。
- 并行计算需求:如果任务需要充分利用多核处理器的计算能力,可以通过多个独立的进程并行执行来提高计算效率。
使用线程的情况:
- 共享数据和资源:如果任务之间需要共享数据和资源,并且数据同步和通信较为频繁,使用线程可以更方便地访问和操作共享资源。
- 轻量级任务:如果任务比较轻量级,且并行执行可以提高效率,使用线程可以进行更快速的切换和调度,减少开销。
- 实时性要求:如果任务对实时性要求较高,使用线程可以更快响应事件和处理任务。
3.一个线程占多大内存?⭐⭐⭐
一个线程在Linux系统中大约占用8MB的内存。这是因为Linux系统中的线程栈是通过缺页异常来进行内存分配的,不是所有的栈空间都会被实际分配内存。因此,8MB只是一个上限,实际的内存消耗会略微超过实际需要的内存。这个差额主要是由于内部损耗(每个线程内部的一些开销)所引起的,通常在4KB范围内.
4.说说什么是信号量,有什么作用?⭐⭐
信号量是一种同步机制,它本质上是一个计数器,用于多进程或多线程对共享资源的访问。信号量的主要作用是保护共享资源,使得在一个时刻只有一定数量的进程或线程可以访问。
信号量的原理是基于 P(sv) 和 V(sv) 两种操作:
- P(sv) 操作会将信号量的值减1,如果信号量的值大于零,进程或线程可以继续访问共享资源;如果信号量的值为零,进程或线程会被挂起,直到其他进程或线程通过 V(sv) 操作释放信号量。
- V(sv) 操作会将信号量的值加1,如果有进程或线程因等待信号量而被挂起,它们中的一个会被唤醒继续执行;如果没有进程或线程等待信号量,信号量的值会增加。
通过控制信号量的值和对共享资源的访问,可以实现对共享资源的互斥访问和并发控制。
代码举例:
#include <iostream> #include <semaphore> #include <thread> std::counting_semaphore<1> semaphore; // 创建一个信号量,初始值为 1 int counter = 0; // 共享资源 void IncrementCounter() { semaphore.acquire(); // P(sv) 操作 // 访问共享资源 counter++; std::cout << "Counter: " << counter << std::endl; semaphore.release(); // V(sv) 操作 } int main() { constexpr int NumThreads = 3; std::vector<std::thread> threads; // 创建多个线程并启动 for (int i = 0; i < NumThreads; i++) { threads.push_back(std::thread(IncrementCounter)); } // 等待所有线程完成
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
c++/嵌入式面经专栏 文章被收录于专栏
BG双9,目前在某外企。打算把之前校招时做的笔记通过专栏发出来,本专栏适合于C/C++、嵌入式方向就业的同学,本篇面经总结数千篇面经的知识集合,实时更新全网最新的嵌入式/C++最新内容,囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,在我看来这些是求职者在面试中必须掌握的知识点。最后呢祝各位能找到自己合适的工作。