操作系统面试高频(一)线程与进程

1.什么是线程?进程,线程,彼此有什么区别?⭐⭐⭐

进程

  • 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位。
  • 是操作系统结构的基础。
  • 进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程

  • 线程是操作系统最小的运算调度单位。
  • 线程包含在进程中,是进程中实际执行任务的单位。
  • 在一些操作系统中,线程也被称为轻量级进程

线程和进程区别:

  • 线程是进程的一部分,是进程内的实际执行单位,而进程则是操作系统分配资源的基本单位。
  • 每个进程都有独立的地址空间和系统资源,而线程共享同一进程的地址空间和系统资源。
  • 线程之间的切换比进程之间的切换更快,因为线程共享相同的上下文和资源。
  • 线程间通信更加方便,可以直接读写共享内存,而进程间通信需要通过特定的机制(如管道、消息队列等)。
  • 进程的创建和销毁比线程的开销更大。
  • 进程是相对独立的,一个进程的崩溃不会影响其他进程,而线程是相互依赖的,一个线程的崩溃会导致整个进程的崩溃。

2.什么时候用进程,什么时候用线程?⭐⭐

使用进程的情况:

  1. 需要独立的地址空间和系统资源:如果任务需要运行在独立的环境中,不同任务之间的数据隔离较为重要,那么可以选择使用进程。
  2. 需要更高的安全性和稳定性:如果一个任务的崩溃不应该影响其他任务的正常运行,使用进程可以保证更高的安全性和稳定性。
  3. 并行计算需求:如果任务需要充分利用多核处理器的计算能力,可以通过多个独立的进程并行执行来提高计算效率。

使用线程的情况:

  1. 共享数据和资源:如果任务之间需要共享数据和资源,并且数据同步和通信较为频繁,使用线程可以更方便地访问和操作共享资源。
  2. 轻量级任务:如果任务比较轻量级,且并行执行可以提高效率,使用线程可以进行更快速的切换和调度,减少开销。
  3. 实时性要求:如果任务对实时性要求较高,使用线程可以更快响应事件和处理任务。

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++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,在我看来这些是求职者在面试中必须掌握的知识点。最后呢祝各位能找到自己合适的工作。

全部评论
1 回复 分享
发布于 2023-10-29 11:06 四川
打卡
点赞 回复 分享
发布于 2024-05-13 11:19 内蒙古

相关推荐

03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
评论
2
20
分享

创作者周榜

更多
牛客网
牛客企业服务