软件开发新手入门五大核心技能之计算机基础常识(四)

简介: 教程来源 http://uklgy.cn/ 本章介绍操作系统核心机制:进程/线程模型、IPC通信方式;并发控制中的竞态条件、锁与死锁;虚拟内存与分页机制;文件系统结构及权限管理。辅以Java、Python、C语言实例,深入浅出解析资源调度与内存管理原理。

第四章 操作系统基础 —— 管理资源的管家

4.1 进程与线程
进程:资源分配的基本单位,拥有独立的内存空间。线程:CPU 调度的基本单位,共享进程资源。

// Java 创建线程的两种方式
// 方式1:继承 Thread
class MyThread extends Thread {
    public void run() {
        System.out.println("Thread running: " + Thread.currentThread().getName());
    }
}

// 方式2:实现 Runnable
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable running: " + Thread.currentThread().getName());
    }
}

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        MyThread t1 = new MyThread();
        t1.start();

        Thread t2 = new Thread(new MyRunnable());
        t2.start();

        // 使用 Lambda
        Thread t3 = new Thread(() -> {
            System.out.println("Lambda thread");
        });
        t3.start();

        // 等待线程结束
        t1.join();
        t2.join();
        t3.join();
    }
}

进程间通信(IPC)方式: 管道、消息队列、共享内存、Socket、信号量。

# Python 多进程(绕过 GIL)
from multiprocessing import Process, Queue
import os

def worker(q, name):
    q.put(f"Hello from {name}, PID={os.getpid()}")

if __name__ == "__main__":
    q = Queue()
    processes = []
    for i in range(4):
        p = Process(target=worker, args=(q, f"Process-{i}"))
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

    while not q.empty():
        print(q.get())

4.2 并发与锁
多个线程访问共享资源时会出现竞态条件,需要同步机制。

// 银行转账竞态条件演示
class BankAccount {
    private int balance = 1000;

    // 不加 synchronized 会出现数据不一致
    public void withdraw(int amount) {
        if (balance >= amount) {
            // 模拟耗时操作,增加线程切换概率
            try { Thread.sleep(10); } catch (InterruptedException e) {}
            balance -= amount;
        }
    }

    public int getBalance() { return balance; }
}

public class RaceConditionDemo {
    public static void main(String[] args) throws InterruptedException {
        BankAccount account = new BankAccount();
        Runnable task = () -> {
            for (int i = 0; i < 100; i++) {
                account.withdraw(10);
            }
        };

        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        t1.start(); t2.start();
        t1.join(); t2.join();

        // 预期余额 1000 - 2000 = -1000(但实际可能不同)
        System.out.println("Balance: " + account.getBalance());
    }
}

// 修复:使用 synchronized 或 ReentrantLock
public synchronized void withdraw(int amount) { ... }

死锁(Deadlock):两个线程互相等待对方释放资源。

// 经典死锁示例
public class DeadlockDemo {
    private static final Object lock1 = new Object();
    private static final Object lock2 = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (lock1) {
                System.out.println("Thread1: 持有 lock1");
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                System.out.println("Thread1: 等待 lock2");
                synchronized (lock2) {
                    System.out.println("Thread1: 获得 lock2");
                }
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lock2) {
                System.out.println("Thread2: 持有 lock2");
                try { Thread.sleep(100); } catch (InterruptedException e) {}
                System.out.println("Thread2: 等待 lock1");
                synchronized (lock1) {
                    System.out.println("Thread2: 获得 lock1");
                }
            }
        });

        t1.start(); t2.start();
        // 程序卡住,不会打印后续信息
    }
}

避免死锁的方法: 固定加锁顺序、使用超时锁、使用 tryLock。

4.3 内存管理 —— 虚拟内存与分页
操作系统通过虚拟内存让每个进程认为自己拥有连续的内存空间,实际映射到物理内存和磁盘。

// 演示页错误(Page Fault)
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int main() {
    // 分配大数组(超过物理内存)
    size_t size = 1024 * 1024 * 1024L;  // 1GB
    int *arr = (int*)malloc(size);
    if (!arr) {
        printf("分配失败\n");
        return 1;
    }

    struct timeval start, end;
    gettimeofday(&start, NULL);

    // 首次访问会触发大量缺页中断(慢)
    for (size_t i = 0; i < size / sizeof(int); i += 4096) {
        arr[i] = i;
    }

    gettimeofday(&end, NULL);
    long elapsed = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
    printf("首次写入耗时: %ld 微秒\n", elapsed);

    // 第二次访问,数据已在内存(快)
    gettimeofday(&start, NULL);
    for (size_t i = 0; i < size / sizeof(int); i += 4096) {
        arr[i] = i;
    }
    gettimeofday(&end, NULL);
    elapsed = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
    printf("第二次写入耗时: %ld 微秒\n", elapsed);

    free(arr);
    return 0;
}

4.4 文件系统
文件系统管理持久存储,常见类型:ext4、NTFS、APFS。

文件路径与权限:

# Linux 文件权限示例
-rwxr-xr-- 1 user group 1234 May 30 10:00 script.sh
# 第1位:-普通文件 d目录 l链接
# 2-4位:所有者权限 rwx
# 5-7位:组权限 r-x
# 8-10位:其他用户权限 r--

# 修改权限
chmod 755 script.sh  # 所有者全权,组和其他读+执行
chmod u+x script.sh  # 给所有者加执行权限
# Python 操作文件系统
import os
import shutil

# 创建目录
os.makedirs("test_dir/sub_dir", exist_ok=True)

# 列出文件
for item in os.listdir("."):
    print(item)

# 递归遍历
for root, dirs, files in os.walk("."):
    for file in files:
        print(os.path.join(root, file))

# 复制
shutil.copy("src.txt", "dst.txt")

# 移动/重命名
shutil.move("old.txt", "new.txt")

# 删除
os.remove("temp.txt")
shutil.rmtree("test_dir")

来源:
http://vbzcj.cn/

相关文章
正则表达式 命名捕获组
命名捕获组
6580 147
|
1月前
|
SQL 网络协议 NoSQL
软件开发新手入门五大核心技能之计算机基础常识(五)
教程来源 http://vbzcj.cn/ 本章系统讲解网络与数据库核心知识:涵盖OSI/TCP/IP模型、IP/端口、TCP三次握手/四次挥手、HTTP协议、DNS解析;以及SQL基础、索引优化、ACID事务、NoSQL(如Redis)等,理论结合Python实战示例。
|
1月前
|
存储 缓存 固态存储
软件开发新手入门五大核心技能之计算机基础常识(一)
教程来源 http://oieaw.cn/ 本文以“内功”喻计算机基础,系统讲解CPU、内存、存储等硬件原理及冯·诺依曼体系,涵盖指令执行、缓存机制、内存布局、I/O特性等核心知识,并辅以可运行代码与典型问题分析,助程序员夯实底层认知,提升性能优化与系统设计能力。
|
1月前
|
存储 自然语言处理 算法
软件开发新手入门五大核心技能之计算机基础常识(三)
教程来源 http://lemci.cn/ 本章系统讲解数据结构基础:数组(连续存储、O(1)访问)、链表(指针链接、O(1)增删)、栈(LIFO)、队列(FIFO)、哈希表(O(1)查找)、树与图(层次/网络关系),辅以多语言代码实例,揭示高效组织数据的核心逻辑。
软件开发新手入门五大核心技能之计算机基础常识(二)
教程来源 http://htnus.cn/ 本章详解计算机底层语言——二进制:从物理实现优势出发,讲解二进制与十进制互转、原反补码原理(含-128特例)、IEEE 754浮点数标准(解释0.1+0.2≠0.3),以及ASCII到Unicode/UTF-8的字符编码演进与乱码修复。
|
1月前
|
人工智能 前端开发 JavaScript
免费可商用 PHP 管理后台 CatchAdmin V5.3.1 发布 后台打包直降 5s 内
CatchAdmin V5.3.1 是免费可商用的 Laravel 13 + Vue 3 后台框架,开箱即用、模块解耦、权限完备(菜单/按钮/数据三级控制)。本次升级至 Tailwind CSS v4 & Vite 8,打包提速至 5s 内,并强化 AI 开发支持(Skills/AGENTS.md/MCP),助你极速构建企业级后台。(239字)
508 131
|
6月前
|
数据安全/隐私保护 iOS开发 Docker
MacOS安装DockerDesktop完整指南(从下载到汉化一步到位)
本教程详细讲解在MacOS上安装DockerDesktop并实现汉化的完整步骤,涵盖系统要求、下载安装、配置验证及中文界面设置,适合新手快速上手,助你轻松掌握Mac上的Docker使用。
|
1月前
|
人工智能 运维 监控
OpenClaw是什么能干什么 新版OpenClaw完整入门教程 核心功能与阿里云部署实操指南
在AI智能体全面普及的2026年,各类自动化代理工具层出不穷,OpenClaw凭借开源免费、私有化部署、多平台适配、强大任务执行能力迅速走红,成为个人办公、团队协作、开发运维、消息自动交互的热门选择。很多新手初次接触OpenClaw时,都不清楚它到底是什么、具备哪些核心能力、适合什么场景,也不知道如何在阿里云服务器上快速完成部署配置。
372 3
|
1月前
|
运维 网络安全 数据安全/隐私保护
Docker 部署 GitLab CE 完整版教程
GitLab Community Edition(简称GITLAB-CE)是一款开源的DevOps平台,集成了代码仓库管理、版本控制、 issue 跟踪、CI/CD 流水线、Wiki 和容器仓库等功能,为软件开发团队提供一站式的协作解决方案。通过Docker容器化部署GITLAB-CE,可大幅简化安装流程、提高环境一致性,并便于快速扩展和迁移。本文将详细介绍如何通过Docker快速部署GITLAB-CE,并提供生产环境优化建议及故障排查方案。
739 0
Docker 部署 GitLab CE 完整版教程
|
1月前
|
人工智能 安全 测试技术
Claude Opus从4.7到4.8迭代升级 Claude大模型Agent能力深度评测
2026年大模型行业竞争进入白热化阶段,各大厂商持续快速迭代版本,GPT、Codex等模型不断更新升级,持续抢占市场份额。在此背景下,Anthropic仅间隔六周时间,火速推出Claude Opus 4.8版本,从发布节奏就能看出厂商的紧迫感。
490 0