操作系统进程和线程——针对实习面试
目录
- 操作系统进程和线程
- 什么是进程和线程?
- 进程和线程的区别?
- 进程有哪些状态?
- 什么是线程安全?如何实现线程安全?
- 什么是线程安全?
- 如何实现线程安全?
- 进程间的通信有哪几种方式?
- 什么是僵尸进程和孤儿进程?它们的区别是什么?
- 进程是怎么调度的?说说常见的调度算法
操作系统进程和线程
什么是进程和线程?
进程和线程是操作系统中的基本概念,它们描述了程序在计算机上的执行实体:
进程(Process)
进程是操作系统进行资源分配和调度的一个独立单位。它是应用程序运行的实例,拥有独立的内存空间。以下是进程的一些关键特点:
- 独立性:进程是独立运行的,拥有自己的一套独立的地址空间。
- 动态性:进程是动态创建和销毁的,它有生命周期,包括创建、就绪、运行、阻塞和结束等状态。
- 并发性:多个进程可以在单个CPU上交替执行,形成并发执行。
- 拥有资源:进程是拥有资源的单位,它拥有独立的内存空间和系统资源,如文件句柄、I/O设备等。
- 进程通信:进程间通信(IPC)需要特定的机制,如管道、消息队列、共享内存等。
线程(Thread)
线程是进程中的一个实体,是CPU调度和分派的基本单位。线程自身不拥有系统资源,只拥有一点在运行中必不可少的资源(如执行栈),但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。以下是线程的一些关键特点:
- 轻量级:线程比进程更小的能独立运行的基本单位,开销更小。
- 共享性:同一进程下的线程共享进程的资源,如内存空间、文件句柄等。
- 独立执行:线程可以独立执行,拥有自己的程序计数器、寄存器集合和栈。
- 并行性:同一进程内的多个线程可以并行执行,尤其是在多核处理器上。
- 线程通信:线程间可以直接读写共享变量来进行通信,但需要同步机制来避免竞态条件。
进程与线程的关系
- 一个进程可以包含多个线程,这些线程共享进程的资源。
- 线程是进程的一部分,一个进程至少有一个线程,即主线程。
- 线程的创建和销毁的开销比进程小,切换也更快。
- 线程之间的通信更简单,因为它们共享相同的内存空间,但这也意味着需要处理同步问题。
简而言之,进程是程序独立运行的实例,而线程是进程中的实际执行单元,它们共同构成了操作系统中程序运行的基本框架。
进程和线程的区别?
-
资源管理:
- 进程:进程是资源分配的基本单位,每个进程都有自己的一套独立的地址空间,这意味着进程间的资源是不共享的。
- 线程:线程是CPU调度和执行的单位,同一进程内的线程共享进程的地址空间和资源,如内存、文件句柄等。
-
创建和管理开销:
- 进程:创建和管理进程的开销相对较大,因为涉及到独立的内存空间分配和进程控制块的创建。
- 线程:线程的创建和管理开销较小,因为它们可以利用进程中已有的资源。
-
通信方式:
- 进程:进程间通信(IPC)需要特定的机制,如管道、消息队列、共享内存等。
- 线程:线程间可以直接读写共享变量来进行通信,无需额外的通信机制。
-
独立性:
- 进程:进程是独立运行的实体,一个进程的崩溃不会直接影响到其他进程。
- 线程:线程之间是相互依赖的,同一进程下的一个线程崩溃可能会影响到其他线程。
-
上下文切换:
- 进程:进程间的上下文切换涉及到整个进程状态的保存和恢复,包括寄存器、内存等。
- 线程:线程间的上下文切换只涉及到线程私有数据的保存和恢复,因为它们共享进程的地址空间。
-
执行流:
- 进程:每个进程至少有一个执行流,即线程(主线程)。
- 线程:线程是进程中的一个执行流,可以有多个线程并行执行。
这些区别体现了进程和线程在资源管理、开销、通信、独立性、上下文切换和执行流方面的不同,它们在操作系统中扮演着不同的角色,并适用于不同的应用场景。
进程有哪些状态?
进程在其生命周期中会经历几种不同的状态,这些状态描述了进程的执行和调度情况。以下是进程的几种常见状态:
-
创建状态(New):
- 进程刚刚被创建,还没有被放入进程调度队列中。
-
就绪状态(Ready):
- 进程已准备好执行,等待被调度器分配CPU时间。它需要等待分配到CPU资源。
-
运行状态(Running):
- 进程正在CPU上执行。在单核系统中,同一时刻只能有一个进程处于运行状态。
-
阻塞状态(Blocked or Waiting):
- 进程因为等待某些事件(如I/O操作、获取资源等)而暂停执行。在等待特定条件满足之前,它不能继续执行。
-
终止状态(Terminated):
- 进程执行完成或因错误、异常而被终止。一旦进程终止,它将释放所有资源,并从系统中消失。
-
挂起状态(Suspended):
- 进程被暂时挂起,通常是为了节省资源或响应用户请求。挂起状态的进程不会占用CPU时间,但仍然保持在内存中。
挂起状态可以进一步细分为:
- 挂起就绪状态(Ready Suspended):进程已经准备好执行,但被挂起。
- 挂起阻塞状态(Blocked Suspended):进程在阻塞状态时被挂起。
-
新创建阻塞状态(New and Blocked):
- 进程被创建后直接进入阻塞状态,例如,创建后立即请求某些资源,但在资源可用之前进程不能运行。
这些状态之间的转换由操作系统的调度器和进程的执行逻辑控制。进程状态的转换对于操作系统的调度策略和资源管理至关重要。
什么是线程安全?如何实现线程安全?
什么是线程安全?
线程安全(Thread Safety)是指在多线程环境中,当多个线程访问某个类的实例时,不需要额外的同步措施,该类的实例就能保证数据的完整性和一致性。简而言之,就是当多个线程同时访问某个共享资源时,如果每个线程都能正确地执行,那么程序的运行结果将是正确的。
线程安全问题通常发生在多个线程访问共享数据时,如果没有适当的同步措施,可能会导致数据竞争(Race Condition),从而产生不可预测的结果,比如数据损坏、程序崩溃等。
如何实现线程安全?
实现线程安全有多种方法,以下是一些常见的策略:
-
互斥锁(Mutex):
- 使用互斥锁(Mutex)是确保同一时间只有一个线程可以访问共享资源的常用方法。当一个线程获取了互斥锁,其他线程必须等待直到锁被释放。
-
读写锁(Read-Write Locks):
- 读写锁允许多个读操作同时进行,但写操作是互斥的。这适用于读操作远多于写操作的场景,可以提高性能。
-
信号量(Semaphores):
- 信号量用于控制对共享资源的访问数量,可以限制同时访问资源的线程数。
-
原子操作(Atomic Operations):
- 原子操作是指不可分割的操作,要么完全执行,要么完全不执行。现代编程语言和硬件通常提供了原子操作的支持,用于保证操作的原子性。
-
条件变量(Condition Variables):
- 条件变量用于线程间的同步,允许线程在某个条件不满足时挂起,并在条件满足时被唤醒。
-
避免共享状态:
- 设计无状态或局部状态的程序,避免共享状态,从而避免线程安全问题。
-
不可变对象:
- 不可变对象(Immutable Objects)一旦创建就不能被修改,因此它们天然是线程安全的。
-
线程局部存储(Thread-Local Storage, TLS):
- 每个线程都有自己的数据副本,因此不存在共享数据的竞争问题。
-
使用线程安全的类和库:
- 许多编程语言提供了线程安全的类和库,可以直接使用这些工具来简化线程安全的实现。
-
同步代码块(Synchronized Blocks):
- 在Java等语言中,可以使用synchronized关键字来同步代码块或方法,确保同一时间只有一个线程可以执行。
实现线程安全需要根据具体的应用场景和需求来选择合适的策略。在设计和实现多线程程序时,考虑线程安全是非常重要的,以确保程序的正确性和稳定性。
进程间的通信有哪几种方式?
进程间通信(Inter-Process Communication,IPC)是多任务操作系统中不同进程之间传递数据和信号的机制。以下是一些常见的进程间通信方式:
-
管道(Pipes):
- 管道是一种最基本的IPC形式,允许一个进程的输出直接成为另一个进程的输入。有名管道(Named Pipes)允许不相关的进程进行通信。
-
消息队列(Message Queues):
- 消息队列允许进程以消息的形式交换数据,消息被存储在队列中,直到被接收。
-
信号(Signals):
- 信号是一种由操作系统提供的软件中断,用于通知进程某个事件已经发生。
-
共享内存(Shared Memory):
- 共享内存是一种效率很高的IPC方式,它允许两个或多个进程共享一个给定的存储区。进程可以直接读写这块内存,无需数据的拷贝。
-
信号量(Semaphores):
- 信号量是一种计数器,用于控制对共享资源的访问,常用于实现进程间的同步。
-
事件(Events):
- 事件是一种同步机制,允许一个进程通知另一个进程某个特定事件已经发生。
-
屏障(Barriers):
- 屏障是一种同步机制,用于等待多个进程到达一个共同点后再继续执行。
这些IPC方式各有优缺点,适用于不同的场景和需求。在实际应用中,开发者需要根据具体的应用场景和性能要求选择合适的进程间通信方式。
什么是僵尸进程和孤儿进程?它们的区别是什么?
僵尸进程(Zombie Process)
僵尸进程是指一个进程已经完成其执行,但还没有被其父进程回收其资源(特别是进程描述符)的进程。在操作系统中,当一个子进程结束运行后,它会保留其进程信息(包括进程ID、终止状态等),等待其父进程通过wait()
或waitpid()
系统调用来读取。如果父进程没有调用这些系统调用,那么子进程的这些信息就不会被释放,这个子进程就成为了一个僵尸进程。
特点:
- 僵尸进程不占用CPU资源,因为它已经不再运行。
- 僵尸进程仍然保留在系统中,直到父进程调用
wait()
或waitpid()
来清理。 - 僵尸进程的主要问题是它们占用进程ID和其他资源,可能导致系统资源耗尽。
孤儿进程(Orphan Process)
孤儿进程是指一个父进程在子进程结束之前已经结束运行的进程。当一个进程创建了一个子进程,然后自己结束了,而没有等待子进程结束,那么这个子进程就成为了孤儿进程。
特点:
- 孤儿进程会被操作系统的init进程(进程ID为1)收养,init进程成为它们的新父进程。
- init进程会等待孤儿进程结束,并回收它们的资源。
- 孤儿进程不会变成僵尸进程,因为它们被init进程管理。
僵尸进程和孤儿进程的区别
-
状态不同:
- 僵尸进程是已经结束但尚未被父进程回收资源的进程。
- 孤儿进程是父进程已经结束而子进程还在运行的进程。
-
处理方式不同:
- 僵尸进程需要父进程调用
wait()
或waitpid()
来清理。 - 孤儿进程由init进程自动收养并处理。
- 僵尸进程需要父进程调用
-
资源占用:
- 僵尸进程占用系统资源,直到父进程进行清理。
- 孤儿进程不会占用额外资源,因为它们被init进程管理。
-
存在时间:
- 僵尸进程可能长时间存在,直到父进程清理。
- 孤儿进程一旦结束,就会被init进程清理。
理解僵尸进程和孤儿进程的概念和区别,有助于更好地管理和优化多进程程序的资源使用和进程控制。
进程是怎么调度的?说说常见的调度算法
进程调度是操作系统中一个重要的功能,它负责决定哪个进程应该获得CPU时间片以执行。进程调度算法决定了进程执行的顺序和时间,影响着系统的响应时间、吞吐量和公平性。以下是一些常见的进程调度算法:
-
先来先服务(FCFS, First-Come, First-Served):
- 这是最简单的调度算法,按照进程到达就绪队列的顺序进行调度。先到达的进程先得到服务。
-
短作业优先(SJF, Shortest Job First):
- 也称为最短作业优先,选择预计运行时间最短的进程进行调度。SJF有两个版本:非抢占式和抢占式(最短剩余时间优先SRTF)。
-
优先级调度(Priority Scheduling):
- 每个进程被赋予一个优先级,调度器总是选择优先级最高的进程执行。可以结合时间片轮转使用,称为优先级时间片轮转。
-
时间片轮转(RR, Round-Robin):
- 所有就绪队列中的进程被分配一个固定的时间片,称为时间片或量子。进程可以在其时间片内运行,时间片用完后,如果进程尚未完成,则被放回就绪队列的末尾。
-
多级反馈队列(MFQ, Multilevel Feedback Queue):
- 结合了时间片轮转和优先级调度的特点,使用多个队列,每个队列有不同的优先级和时间片大小。
每种调度算法都有其特定的应用场景和优缺点。操作系统会根据系统的需求和目标选择合适的调度算法,以优化系统性能和用户体验。
相关文章:
操作系统进程和线程——针对实习面试
目录 操作系统进程和线程什么是进程和线程?进程和线程的区别?进程有哪些状态?什么是线程安全?如何实现线程安全?什么是线程安全?如何实现线程安全? 进程间的通信有哪几种方式?什么是…...
使用 cnpm 安装 Electron,才是正确快速的方法
当然,下面是总结的几种安装 Electron 的方法,包括使用 npm 和 cnpm,以及一些常见的问题解决技巧。 ### 1. 使用 npm 安装 Electron #### 步骤 1: 初始化项目 在你的项目目录中初始化一个新的 Node.js 项目: bash npm init -y …...
【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南
文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…...
【第八课】Rust中的函数与方法
目录 前言 函数指针 函数当作另一个函数的参数 函数当作另一个函数的返回值 闭包 方法 关联函数 总结 前言 在前面几课中,我们都或多或少的接触到了rust中的函数,rust中的函数和其他语言的并没有什么不同,简单的语法不在这篇文章中赘…...
c语言学习25二维数组
1 二维数组 1.1二维数组认识 二维数组本质是一个数组。 举例: int a[10][3] 数组名 a; 元素个数10; 数组元素类型:int [3]; 数组元素下标:0~9 这是一个数组,有十个元素,每个元…...
如何理解Lua 使用虚拟堆栈
虚拟堆栈的基本概念 Lua使用虚拟堆栈来实现Lua和C(或其他宿主语言)之间的交互。这个虚拟堆栈是一个数据结构,用于存储Lua的值,如数字、字符串、表、函数等。它在Lua状态机(lua_State)内部维护,为…...
【倍数问题——同余系】
题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10, M 1e3 10; int maxx[M][4]; void consider(int r, int x) {if(x > maxx[r][1]){maxx[r][3] maxx[r][2];maxx[r][2] maxx[r][1];maxx[r][1] x;}else if(x > maxx[r][2]){maxx[…...
「San」监听DOM变化的方法
在 San框架 中监听组件内部字体大小并调整宽度,可以结合 自定义事件 或 数据绑定 来实现动态调整。San 框架没有直接的监听 DOM 尺寸变化的内置方法,但可以通过以下步骤实现: 方法一:使用 ResizeObserver 监听字体变化 在组件的 …...
如何选择服务器
如何选择服务器 选择服务器时应考虑以下几个关键因素: 性能需求。根据网站的预期流量和负载情况,选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构,以便…...
嵌入式驱动面试总结
操作系统: 中断的处理流程,中断处理需要注意些什么 软中断和硬中断区别 linux驱动用过那些锁,信号量,互斥锁 自旋锁和互斥锁的区别 二值信号量和互斥信号量有什么区别 进程锁怎么实现的,说一下流程; …...
Uniapp 简单配置鸿蒙
Uniapp 简单配置鸿蒙 前言下载并配置鸿蒙IDEHbuilder X 配置基本的信息生成相关证书登录官网获取证书IDE配置证书添加调试设备可能出现的问题前言 如今鸿蒙的盛起,作为多端开发的代表也是开始兼容鸿蒙应用的开发,接下来我将介绍如何在uniapp中配置鸿蒙。 注意:hbuilder X的…...
线程池的实现与应用
一、线程池 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,…...
基于Java Springboot单位考勤系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
近源渗透|HID ATTACK从0到1
前言 对于“近源渗透”这一术语,相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段,实地侵入企业办公区域,利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息,并以隐蔽的…...
【linux】插入新硬盘如何配置:格式化、分区、自动挂载(Ubuntu)
文章目录 具体方法GPT分区表(GUID Partition Table)(建议都用这种分区方法)MBR分区表方法(最大支持2TB分区)(Master Boot Record) 附加:如何查看硬盘的型号另外ÿ…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-block.py
block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn.M…...
代码随想录算法训练营第五十三天|Day53 图论
字符串接龙 https://www.programmercarl.com/kamacoder/0110.%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8E%A5%E9%BE%99.html 思路 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX 1000 // 假设最大字符串数 #define WORD_LENGTH 100 // 假…...
LeetCode:203.移除链表元素
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.…...
知识见闻 - 数学: 均方根 Root Mean Square
What is Root Mean Square (RMS)? 在统计学上,均方根(RMS)是均方的平方根,而均方是一组数值的平方的算术平均数。均方根也称为二次均值,是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…...
机器硬件调优
grub参数 ipv6.disable1 ipv6.autoconf0 intel_pstatedisable nohzoff idlepoll intel_idle.max_cstate0 processor.max_cstate0 mceignore_ce nmi_watchdog0 transparent_hugepagenever pcie_aspm.policyperformance audit0 irqaffinity0 nosoftlockup grub2-mkconfig -o /bo…...
如何更改手机GPS定位
你是否曾想过更改手机GPS位置以保护隐私、玩游戏或访问受地理限制的内容?接下来我将向你展示如何使用 MagFone Location Changer 更改手机GPS 位置!无论是在玩Pokmon GO游戏、发布社媒贴子,这种方法都快速、简单且有效。 第一步:下…...
HarmonyOS(57) UI性能优化
性能优化是APP开发绕不过的话题,那么在HarmonyOS开发过程中怎么进行性能优化呢?今天就来总结下相关知识点。 UI性能优化 1、避免在组件的生命周期内执行高耗时操作2、合理使用ResourceManager3、优先使用Builder方法代替自定义组件4、参考资料 1、避免在…...
Mysql的加锁情况详解
最近在复习mysql的知识点,像索引、优化、主从复制这些很容易就激活了脑海里尘封的知识,但是在mysql锁的这一块真的是忘的一干二净,一点映像都没有,感觉也有点太难理解了,但是还是想把这块给啃下来,于是想通…...
hive3.1.2编译spark3安装包
此安装包是《去破解站长》在公司真实生产环境所使用的安装包。 引言:Hive引擎包括:默认MR、tez、sparkDownload:www.qupojie.com 1、Hive on Spark 1、Hive onSpark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法&…...
网络安全,文明上网(1)享科技,提素养
前言 在这个信息化飞速发展的时代,科技的快速进步极大地丰富了我们的生活,并为我们提供了无限的可能性。然而,随着网络世界的不断扩张,增强我们的网络素养成为了一个迫切需要解决的问题。 与科技同行,培育网络素养 技术…...
ESP32 烧录问题
ESP32 烧录问题 1.无法连接 Connecting......................................A fatal error occurred: Failed to connect to ESP32: No serial data received.这个表示通过串口连接esp32失败,可能存在多种原因,比如串口选择错误。 所选串口不是连接…...
CnosDB 实时流式计算:优化时序数据处理与降采样解决方案
在处理时序数据时,数据写入周期通常与数据采集设备的频率相关,有时每秒钟就需要处理大量的数据点。长时间处理如此多的数据会导致存储问题。一个有效的解决方案是使用流式计算,将原始数据进行降采样。 流式计算在时序数据库中指对实时数据流…...
ApiChain 从迭代测试用例到项目回归测试 核心使用教程
项目地址:ApiChain 项目主页 环境变量 环境变量是在特定的开发环境(开发、测试、uat等)下,保存的一份数据集,环境变量是发送网络请求或者执行单测的一个重要数据源。环境变量根据作用范围可以分为全局环境变量、项目…...
数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall
数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 贵在坚持! 数据样例项目地址: * 相关项目 1)数据集可视化项…...
django从入门到实战(四)——模型与数据库
1. 模型的定义与数据迁移 1.1 模型的定义 在 Django 中,模型是一个 Python 类,用于定义数据库中的数据结构。每个模型类对应数据库中的一张表,类的属性对应表中的字段。 示例: from django.db import modelsclass Blog(models…...
北京直销网站开发/磁力岛
在Unity手游开发中,经常用到插值运算,我们可以使用Mathf.Lerp自行去实现效果,但是使用插件提高了我们的开发效率,这里归结一下DoTween的基本使用方式以及效果说明: 直接代码: 1 using DG.Tweening;2 using …...
sanitize_user wordpress/公众号引流推广平台
为什么80%的码农都做不了架构师?>>> 软硬件环境 Intel 酷睿i5 480M,2.66GHz(笔记本) 5400转硬盘 6G内存 Win10 64 位操作系统 PHP version: 7.0.6 Server version: 5.7.10 - MySQL Community Server (GPL) PDO事务占位…...
大中型企业网络设计方案/做seo推广一年大概的费用
create table test_innodb_insert_lock(id int not null primary key auto_increment,uk int not null unique key) engine innodb;开启三个终端执行窗口,模拟三个sessionsession_1,insert成功session_2,等待...session_3,等待Mysql(当前问题是在使用innodb引擎的前…...
开发小程序模板/西安seo诊断
昨天的文章中介绍F4系列单片机的内部Flash读写,包括之前文章中介绍了FatFS文件系统读写U盘的操作。本篇文章就是将两者结合,实现F4系列单片机程序的U盘升级。首先对内部Flash空间进行划分,前128K用于存储BootLoader程序,后面的空间…...
网站建设 开发/域名污染查询网站
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼89C51系列单片机都不带SPI口,所在在这种情况下,我们可以模拟SPI口来现实我们要的功能,程序如下://-----------------------函数声明,变量定义--&am…...
黑白色调网站/关键词排名查询工具
名人名言昨日翻译“A successful man is one who can lay a firm foundation with the bricks others have thrown at him.” ——David Brinkley成功的人能够把别人扔向他的板砖成为他的根基。——戴维布林克利今日名言“Those who dare to fail miserably can achieve greatl…...