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

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 内蒙古

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
东东鱼:说得残酷一点,私企的hr不会因为你当了八年兵而高看你一眼,他们只要来了马上能干活的员工,你想找市场营销相关的工作,但是目前来看你的简历上没有相关的经验。你简历上的一些技能很多高中生都会的,那你说hr会怎么选呢? 当过兵考公考编有没有优势?往这方面靠一下吧,或者退伍费用来做一点小生意也是很不错的
点赞 评论 收藏
分享
评论
2
19
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务