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

简介: 教程来源 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/

相关文章
|
8天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
3663 16
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
16天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
3602 13
|
10天前
|
人工智能 自然语言处理 供应链
|
12天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
2993 7
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
19天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
3725 25
|
10天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全+三种模式+记忆体系+实战工作流完整手册
Claude Code 是当前最流行的终端级 AI 编程助手,能够直接在命令行中完成代码生成、项目理解、文件修改、命令执行、错误修复等全流程开发工作。它不依赖图形界面、不占用额外资源,却能深度理解项目结构,自动生成规范代码,大幅提升研发效率。
1469 3
|
3天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
498 0
|
17天前
|
存储 Linux iOS开发
【2026最新】MarkText中文版Markdown编辑器使用图解(附安装包)
MarkText是一款免费开源、跨平台的Markdown编辑器,主打所见即所得实时预览,支持Windows/macOS/Linux。内置数学公式、流程图、代码高亮、多主题及PDF/HTML导出,是Typora的轻量免费替代首选。(239字)