登录社区云,与社区用户共同成长
邀请您加入社区
它不是操作系统的内核概念,而是语言和运行时在用户态实现的并发抽象。Go 的 goroutine 和 Lua 属于有栈协程,Python 的 async/await、JavaScript、C# 属于无栈协程(用状态机实现,只能在 await 点挂起)。被问到"协程和线程的区别"时,先声明你指的是哪一类实现,比直接背一句"协程比线程轻"更稳。
在EtherCAT系统中,SDO与PDO是两种根本不同的数据交换机制:SDO用于设备初始化阶段的对象字典访问,实现参数配置、诊断等非周期性操作;PDO则通过预先映射实现周期性过程数据的高效交换,适用于实时控制。二者均基于对象字典,但分工明确——SDO负责“配置设备”,PDO负责“运行设备”。在IgHEtherCATMaster中,应区分异步SDO请求与周期性PDO通信路径。真正的实时性不仅依赖于E
本文聚焦航空航天与武器装备领域嵌入式系统测试平台选型,提出两大核心评估维度:国产替代与自主可控能力,以及产品技术工程化与服务交付能力。以凯云ETest为例,其ETest与SimuRTS双产品线协同,构建覆盖测试全生命周期的闭环体系,支持国产CPU+OS环境,兼容多操作系统,具备仿真模型管理、实时接口绑定、在线调参等关键功能,广泛应用于军工、航空、轨道交通等领域,助力实现信创环境下高可靠、可复用的测
窗口单位排队叫号系统的国产化适配,涉及芯片、操作系统、数据库、外设、接口、部署环境等多个层面。窗口单位=的信创改造中,排队叫号系统的国产化适配涉及芯片架构、操作系统、外设驱动、接口对接等多个技术层面。取号机、呼叫器、评价器等外设的驱动,在 ARM 平台和国产操作系统下可能不兼容,需要厂商提供适配版本。完成适配的系统可正常完成取号、队列调度、语音叫号、服务评价、数据统计等流程,功能与传统平台一致。虽
性能优化可以说是我们程序员的必修课,如果你想要跳出CRUD的苦海,成为一个更“高级”的程序员的话,性能优化这一关你是无论无何都要去面对的。为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化。除了最常见的代码优化外,在软件架构上、JVM虚拟机层、数据库以及操作系统层面都可以通过各种手段进行调优,从而在整体上提升系统的性能。
银河麒麟和统信UOS是目前国内信创生态中应用最广的两款国产操作系统,均已完成与飞腾、鲲鹏、龙芯等主流国产芯片的适配,是信创项目建设的标准基础软件环境。适配银河麒麟与统信UOS的国产化信息发布系统,广泛适用于政务大厅、三甲医院、园区楼宇、电力营业厅等场景,既能满足日常信息展示需求,亦可顺利通过信创项目验收,是智慧大厅国产化改造的主流优选方案。广州优胜电子深耕信创多媒体信息发布系统领域,自研国产化信息
Redis 的 AOF 通过记录可重放的写操作实现数据持久化,解决内存数据丢失问题。它仅保存影响数据集的命令,使用 RESP 编码,并分四层确保数据落盘:内存、AOF 缓冲区、操作系统页缓存、磁盘。通过 appendfsync 策略(always/everysec/no)权衡性能与耐久性。为减少文件体积和恢复时间,Redis 支持 AOF 重写,从 Redis 7 起采用多部件模型(BASE +
读者-写者问题是并发编程中的经典问题之一,涉及如何协调多个读者和写者对共享资源的访问。通过合理使用信号量或互斥锁,可以保证读者和写者的访问规则。常见的解决方案包括读者优先和写者优先策略,旨在平衡系统的效率和资源的一致性。在实际应用中,这种问题广泛应用于数据库管理系统、文件系统、缓存系统等多进程共享资源的场景。
吸烟者问题是一个经典的并发编程问题,通过合理使用信号量,能够有效地解决多个进程之间的同步和互斥问题。这个问题的解决方案展示了如何利用信号量实现进程间的通信与同步,确保了资源的有效分配和进程间的协调。
多消费者问题是生产者-消费者问题的扩展,涉及多个消费者并发地从共享缓冲区中取出数据进行消费。通过使用信号量机制,可以实现生产者和多个消费者之间的同步和互斥,确保数据的一致性和系统的高效运行。
在前面的章节中,我们的进程内存模型极其原始:代码段、数据段固定加载,堆通过brk/sbrk线性增长,栈从顶部向下延伸。这种模型能运行简单程序,但面对真实软件生态时立刻崩塌:动态链接器无法将.so映射到指定地址;malloc的大块分配被迫复制而非直接映射物理页;共享内存IPC需要内核拷贝;JIT编译器无法生成可执行代码;甚至vim打开大文件都要先read()到堆里再处理。mmap的本质是“将虚拟地址
在双 11 备战期间的全链路军团压测中,最诡异、也最让新手运维摸不着头脑的一种死法是:监控面板上,Java 进程的堆内存曲线平稳如镜,老年代利用率才 40%,年轻代 GC 停顿只有十几毫秒,根本没有任何的迹象。然而,毫无任何征兆地,Java 进程在某一个毫秒突然瞬间蒸发!容器发生 Crash 重启,日志文件在最后一刻戛然而止,甚至连 JVM 崩溃标准的都来不及生成。登录宿主机通过dmesg -T这
进程是资源调度的基本单位一个程序的运行叫做进程而进程里怎么识别认识有独特的标识吗站着操作系统角度理解进程进程是怎么创建的通过结构体来表述PCB是线程的唯一标识PCB是线程的控制块 当有很多进程时 为了方便 通过数据结构组织起来 方便管理PCBpid进程的标识。
xipx=ipxipp∤ip\nmid ip∤ip∣ip\mid ip∣i两种情况。p∤ip\nmid ip∤i:加入一个全新的质因子;p∣ip\mid ip∣i:已有质因子的指数增加 1。因此很多积性函数都可以在线性筛中一起递推。
虚拟内存是OS利用物理内存 + 磁盘交换分区(swap)实现的内存抽象机制。给每个进程提供独立、连续的虚拟地址空间,程序不用关心物理内存碎片化。内存不够的时候,把暂时不用的内存页写到磁盘swap;需要的时候再换回物理内存(缺页中断)。好处:进程隔离、内存复用、让程序可用内存大于实际物理内存。
中间件(Middleware)是位于操作系统和应用程序之间的软件,为应用程序提供运行环境和通用服务。常见的Web中间件包括WebLogic、Tomcat、Nginx、Apache、JBoss、WebSphere等,中间件安全漏洞是渗透测试中最重要的攻击面之一。WebLogic是Oracle公司出品的Java EE应用服务器,广泛应用于企业级应用部署,也是漏洞最多、危害最大的中间件之一。Apache
环境变量是操作系统为进程提供的键值对,用于传递系统信息(如PATH、HOME)。C语言中可通过getenv读取,或通过main函数的envp参数、全局变量environ遍历。实用场景包括获取用户目录、控制程序行为(如调试模式)、搜索可执行文件。setenv和unsetenv可修改当前进程环境变量。环境变量是程序灵活配置的关键,无需改代码即可调整行为。
在前面的章节中,我们的Shell已经能解析复杂命令、管理作业、构建I/O拓扑。但如果你尝试运行,它会报错“command not found”;运行vim,它不知道你的HOME目录在哪;编译程序时,gcc找不到头文件路径。这是因为我们的进程是“失忆”的——它们没有环境块(Environment Block)。环境变量不是简单的“全局变量”,而是进程创建时继承、运行时可修改、跨exec传递的键值对上
在上一章中,我们的Shell拥有了作业控制,成为了一个合格的交互终端。但如果只能手动敲命令,它仍然只是一个“高级计算器”。真正的Unix哲学在于组合与自动化:将多个小工具通过I/O胶水粘合成复杂的数据处理流水线,并将这些流水线固化为可复用的脚本。本章我们将补齐Shell作为“编程语言”的关键拼图:命名管道(FIFO)让无关进程也能通信;Here Document让脚本内嵌多行文本数据;而更丰富的重
端侧部署,指的是把模型直接放在开发板、手机或边缘盒子上推理,而不是调用云端接口。对嵌入式工程师来说,这件事的开场白不该是「先下个模型跑跑看」,而是先摊开一张资源表——就像选芯片前先看 RAM、Flash 和主频一样。嵌入式项目里,方案评审的第一张纸通常是资源预算:代码段多少、堆栈留多少、要不要外挂 DDR。转到大模型,这张纸的栏目名换了一下,思路几乎原样搬过来:原来的「代码段 + 常量表」对应模型
本文系统讲解文件与IO操作的核心概念:操作系统将硬盘数据抽象为文件,包含内容与元信息;文件以树形结构组织,路径分为绝对与相对。Java中File类用于操作文件元信息,而InputStream/OutputStream实现真正读写内容。通过FileInputStream和FileOutputStream可实现字节级读写,推荐使用try-with-resources管理资源。处理文本时,可结合Scan
本文介绍了线程的基本概念,阐述了线程作为操作系统调度单位的作用,强调多线程可实现任务并发执行,提升程序效率。通过对比进程与线程,说明线程共享进程资源但存在安全风险。文章还讲解了多线程创建的多种方式(继承Thread、实现Runnable、Lambda等),并以实例演示线程并发执行的不确定性。最后指出,多线程在多核环境下可实现真正并行,显著提升运行速度。
本文揭示了Java并发编程背后的核心理论:从操作系统中的PV操作、信号量到监控器(monitor),均直接映射至Java的synchronized、Semaphore与ReentrantLock。理解这些经典同步原语,可解释为何wait()需在循环中使用、为何应调用notifyAll()等看似“规则”的设计。通过剖析信号量的三种用途(互斥、同步、资源计数)及生产者-消费者模型,阐明其结构化缺陷如何
本文揭示了操作系统中的PV操作与管程思想如何在Java并发中重生:synchronized、wait/notify源自管程,Semaphore即信号量的直接实现,而ReentrantLock与Condition则是显式管程。理解其背后原理,方能掌握为何wait()需置于while循环、为何用notifyAll()等“江湖规矩”。从OS内核的futex到JVM的AQS,层层抽象皆源于同一思想——用结
背景Java线程池的写法和参数是面试中出现频率很高的基础题。越是基础的东西,特别是对高阶职位的面试者,需要回答的符合自己面试的职位等级。这里也不能说是一个多么好的答案,只是说如果是我,我怎么回答,仅供参考。以下回答可想象为面试官的问题是:谈谈线程池。主要的思路是作为一个宽泛的问题,回答需要体现结构化的思维,这是必选项。在此基础上,可以体现深度,这是加分项。回答线程池设计目标Java的线程主流实现都
在前面的章节中,我们的程序都是静态链接的:每个可执行文件都包含了完整的libc副本。这意味着100个使用printf的程序就要在磁盘和内存中存储100份相同的printf实现。这不仅浪费空间,更致命的是无法独立更新:修复一个libc安全漏洞需要重新编译所有程序。加载时共享(多个进程映射同一物理页的只读代码段)和运行时绑定(通过PLT/GOT表延迟解析符号地址)。本章我们将实现一个最小但完整的动态链
在 openEuler 24.03 上编译部署 JeecgBoot 3.9.5 后端:JDK 17 + Maven 编译、systemd 托管、PostgreSQL 连接配置、LiteFlow 报错修复、PostgreSQL 15+ public schema 授权。附开源工具链,从零到接口可访问。
接手一台新服务器,第一步往往不是装软件,而是搞清楚"这台机器上有哪些人能登录、各自能干什么"。账户和权限理不清,后面所有的安全配置、文件归属、服务启动都建立在沙子上面——最常见的翻车是应用跑在 root 下出事了影响整个系统,或者某天发现一个从没见过的账号正在跑定时任务。这篇把 linux服务器操作系统用户账户类型有哪些这个问题拆开讲:账户分哪几类、系统怎么识别它们、权限怎么给才不出事、账号从创建
在把高并发网关升级到 Java 24 虚拟线程后,很多团队在压测中见证了令人振奋的指标:JVM 堆内存占用极低,哪怕并发调度 50,000 个虚拟线程,堆内存活跃对象也仅占几百兆。然而,在持续进行 3 小时的高压摸高测试后,生产服务器却突然无预警地被操作系统内核杀掉——Linuxdmesg。令人百思不得其解的是,此时 JVM 的监控面板上,堆内存(Heap)使用率甚至还不到 30%,没有任何报警。
在亿级流量削峰填谷的战场上,Kafka 之所以能够以每秒数百万消息的恐怖速率吞吐海量数据,并不是因为它用 Java 写了多么精巧复杂的内存队列,而在于它极其聪明地做到了“不碰 CPU 和用户态内存”——将繁重的磁盘读写与网络传输工作,全部委托给了操作系统底层的。然而,在很多大促实战中,不少团队发现自建的 Kafka Broker 集群吞吐远远达不到官方标称的水平:磁盘 I/O 利用率早早飙到了 1
在上一章中,我们用实现了用户态mutex。这在低竞争场景下尚可工作,但在高并发场景中是灾难性的:100个线程争抢一把锁时,99个线程不断循环检查+让出CPU,消耗大量调度开销却不做任何有效工作。更糟的是,无法保证“锁释放时立即唤醒等待者”——它只是把当前线程移到就绪队列末尾,真正的持锁线程可能还在运行队列深处排队。Futex(Fast Userspace muTEX)解决了这个根本矛盾:无竞争时完
在前面的章节中,我们拥有了Demand Paging和COW,进程的创建成本已大幅降低。但即便如此,进程仍然是“重”的:每次fork都需要复制页表、VMA链表、文件描述符表;每次上下文切换都需要刷新TLB、保存完整内核栈。当一个Web服务器需要同时处理1000个连接时,1000个进程的调度开销足以吞噬大部分CPU时间。线程的本质是“共享地址空间的执行流”。同一进程内的多个线程共享代码段、数据段、堆
的主要作用是帮助操作系统找到并使用当前安装的 Java 运行时环境(JRE)或 Java 开发工具包(JDK)。它通过符号链接(类似于快捷方式)指向实际的 Java 可执行文件目录,从而简化了 Java 版本的管理和切换。要么把%JAVA_HOME%提到C:\Program Files (x86)\Common Files\Oracle\Java\javapath。新安装的Java版本,如果在系统
从的重量级演进,到 AQS 的用户态排队,再到虚拟线程时代的无感知卸载,Java 并发模型的每一次跃迁,本质上都是在把昂贵的“内核态调度”向高效廉价的“用户态协作”不断推进。理解 AQS 为什么能天然亲和虚拟线程,不仅能让我们在选型锁机制时避开致命的 Pinning 泥潭,更能让我们看透 JVM 在操作系统调用栈与用户堆栈之间精妙的折中艺术。在分布式和高并发架构里,很多看似诡异的性能暴跌,底色往往
结合 Spring Boot 与 Lucene 项目,解释磁盘索引的持久化与重启复用、搜索时的文件读取、内存映射和操作系统页缓存,分析大索引下的工作集、缓存回收、容器 OOM 边界,并给出验证与优化思路。
exec时一次性为所有PT_LOAD段分配物理页并拷贝内容;fork时完整复制父进程的所有物理内存。这意味着一个10MB的程序即使只执行了main()的前几行,也必须占用10MB物理内存;一个fork后立即exec的子进程,白白浪费了一次完整的内存复制。这在嵌入式或早期硬件上是不可接受的奢侈。Demand Paging(按需分页)和。推迟昂贵的物理资源分配,直到真正需要的那一刻。缺页异常(Page
在前面的章节中,我们的进程模型是纯粹线性的:要么运行,要么阻塞等待I/O,要么被父进程wait回收。但真实世界的程序需要处理大量异步事件:用户按下Ctrl+C终止程序、定时器到期触发回调、子进程退出通知父进程、非法内存访问触发SIGSEGV。如果没有信号机制,你的Shell无法被中断,后台任务无法感知子进程死亡,除零错误只会导致静默崩溃而非core dump。信号是Unix最古老也最精妙的IPC机
从零准备 openEuler 24.03 服务器基础环境:数据盘挂载与 fstab、4 个专用用户创建、系统盘/数据盘目录规划、JDK 17(BiSheng)安装与 alternatives 切换、Maven 3.9.16 + 阿里云镜像、Node.js 20 安装。为后续编译 JeecgBoot 做准备。
单核CPU可支持Java多线程,但线程为并发而非并行执行。操作系统通过时间片轮转与抢占式调度,在微观上轮流分配CPU资源,营造“同时运行”假象。虽存在上下文切换开销,但多线程在IO密集型场景中能显著提升CPU利用率,有效复用等待时间。纯计算任务则因频繁切换反而降低性能。核心在于区分“并发”(交替推进)与“并行”(同时执行),理解其本质是任务调度与资源利用的优化,而非硬件并行能力。
记录从 JeecgBoot 3.8.3 升级到 3.9.5 的决策过程:3.8.3 的多个安全漏洞(含 RCE、XSS、越权)、功能不足,以及 3.9.5 在安全加固、框架升级、AI 应用、Online 表单方面的关键改进。附信创环境完整部署规划(openEuler + PostgreSQL 17 + Redis 7.4 + Nginx 1.28)。
本文系统梳理了进程与线程、死锁、IO多路复用(select/poll/epoll)、阻塞/非阻塞与同步/异步区别、零拷贝、Reactor模型及CPU缓存原理。重点解析epoll的高效性源于事件驱动与就绪事件返回,对比LT与ET模式优劣;强调IO多路复用为同步非阻塞模型,非异步;结合Linux常用命令(top、ps、netstat、ss、jstack等)阐述线上问题排查思路,涵盖CPU、内存、磁盘、
零拷贝并非完全无复制,而是减少用户态与内核态间的数据拷贝及上下文切换。传统read+write涉及4次复制和4次切换,而sendfile、mmap+write、splice等通过页缓存共享或直接传输优化路径。Java的transferTo()仅是提示,是否真正零拷贝依赖操作系统实现,且仅在大块、静态数据传输中优势明显。实验表明其性能提升源于减少用户态循环,而非必然走高效内核路径。零拷贝不等于“零”
本文分析了Project Loom通过在JVM用户态实现Continuation与ForkJoinPool调度器,将虚拟线程(VirtualThread)与操作系统线程解耦,构建M:N调度模型。其核心是stackChunkOop堆内栈结构,支持动态链式扩容,实现纳秒级上下文切换。挂起(Freeze)时保存执行状态至堆内存,恢复(Thaw)时重建栈帧并跳转指令地址,由GC通过OopMap扫描栈帧引用
C 与 Go 并非简单的替代关系,而是面向不同问题的解决方案。C 追求极致的性能与硬件控制力,适合底层系统开发;Go 追求开发效率与工程化便利,适合现代云原生应用。选择哪种语言,取决于你的应用场景、性能要求与团队技术栈。若你正在开发操作系统或嵌入式系统,C 是必然之选;若你在构建微服务或云原生基础设施,Go 将是更高效的选择。
在前面的章节中,我们的sys_exec只能加载简单的平坦二进制(flat binary):把整个文件读入内存,跳转到入口地址。这种方式要求代码、数据、BSS必须按固定顺序紧密排列,没有段保护,不支持符号调试,更无法兼容GCC/Clang的标准输出。现代操作系统与用户程序的契约是。ELF不是一坨字节流,而是一个自描述的容器:它告诉内核哪些区域是可执行代码、哪些是只读数据、哪些需要零初始化、入口点在哪
在上一章中,我们实现了RamFS,拥有了完整的VFS抽象和inode/dentry模型。断电即失忆。一个无法持久化存储的操作系统,永远只是一个高级玩具。今天,我们将跨越从“内存数据结构”到“磁盘物理布局”的鸿沟,实现真正的Ext2文件系统读取。Ext2是Linux早期事实标准,也是教学文件系统的黄金选择。它的on-disk结构清晰、文档完备、无日志复杂性,完美展示了Unix FS的核心设计:超级块
本实验带你从零掌握 JDK 的安装与使用:根据操作系统和位数选择合适版本并完成安装、配置 JAVA_HOME 与 Path 环境变量、在 CMD 中编译运行第一个 Java 程序,并学会使用 JDK 官方 API 文档查询类与方法,重点理解 java.lang.System 类及 System.out.println() 的作用。
REST API,官方CLI,官方hcloudTerraform provider和Ansible integration,所有这些都是为他们的云系列编写的。涵盖公共云、裸机、VPS和IAM的官方CLI,以及一家官方Terraform提供商,该提供商提供裸机特定的操作系统安装指南和通过API进行iPXE引导配置。Rackspace仍然在一些事情上做得很好,它的SLA是可靠的,它的支持组织是庞大的。
✅互不争抢载体资源SpringBoot3.2 开启时,Tomcat 的载体线程是 Tomcat 自己维护的平台线程池,不是 JDK 的 commonPool。你代码里另外写的又是独立的平台线程集合。三者是完全独立的 OS 线程集合,资源隔离,不存在互相抢。例:Tomcat 载体 max=200;业务有个固定线程池核心 = 10。这 200 个 + 10 个,是操作系统上不同的平台线程,互不抢占。✅
Docker是一款基于Go语言开发的开源应用容器引擎,Docker可以让用户将需要运行的应用服务和依赖环境打包在一个小体积的应用容器中,被打包的容器可以移植到任意可运行Docker环境的操作系统中,极大地缩短了应用服务编译和部署所需的时间。Docker的虚拟化机制也使得在不同操作系统环境下编译的应用服务都可运行在同一Docker宿主机中。Docker中有两个基本概念:镜像(Image)和容器(Co