操作系统给一个程序分配的内存
假如你在玩植物大战僵尸,你想把你的阳光值改成无限,那么该怎么办?
以32位机,字节编址的机器为例
根据上图可知,存储阳光值变量的地址为:
0x000000F2
要点:
- 用户自己编写的程序是否知道物理内存的存在?
- 两个不同的程序,在程序内部都访问了
0x000000F2
地址,他们对应的值是否一样(或:他们所指向的内存单元是否一致)?- 阳光值的变量地址为:
0x000000F2
,该地址是物理地址还是虚拟地址?
源代码编译为二进制程序
什么时候产生逻辑地址?真题【2011-30】
2^10=1024 > 1K 1M 1G
32位机器,把所有地址都分配给进程,可以让进程感觉有多大的内存可以用? 4GB = 2^32B
你是银行行长,你只有一亿现金,但是你给每个人的贷款额度也都是一亿。因为大概率不会有人直接借走一亿。
虚实地址转换
程序给CPU一个虚拟地址,CPU把虚拟地址换成物理地址,CPU通过物理地址查询内存并把数据返回给程序
角色 | 对应看到 |
---|---|
玩家 | ☀️阳光值 |
高级程序员(C/Java/Python等) | 💻变量 sumShine |
汇编程序员 | 👴变量的虚拟地址: 0x000000F2 |
CPU | 通过MMU把0x000000F2 转换为 0x00001 |
- MMU机构
- 如何区分中断和异常?
- 缺页是中断还是异常?
如何自己编写外挂来修改其他程序的内存?
首先,每个进程的虚拟地址空间都是独立的,而且程序员是无法操作内存的物理地址,那要怎么改阳光值?
进程
- 定义:是一个程序的执行实例,是操作系统资源分配的基本单位
- 特点:
-
独立性:每个进程都有自己的地址空间、全局变量、文件描述符等资源。
-
资源分配:操作系统为每个进程分配独立的资源,如内存、文件、I/O设备等。
-
安全性:进程之间相互独立,一个进程的崩溃不会影响其他进程。
-
开销大:创建和销毁进程需要较多的系统开销(如内存分配、表项维护)。
- 通信方式:管道、消息队列、共享内存、信号等
线程
- 定义:线程是进程中的一个执行单元,是CPU调度的基本单位。
- 特点:
-
共享性:同一进程的线程共享进程的地址空间、全局变量、文件描述符等资源。
-
独立性:每个线程有自己的栈、程序计数器和寄存器。
-
效率高:创建和销毁线程的开销较小,线程切换的速度较快。
-
安全性较低:因为线程共享进程的资源,一个线程的崩溃可能导致整个进程的崩溃。
进程与线程的对比
属性 | 进程 | 线程 |
---|---|---|
定义 | 操作系统资源分配的基本单位 | CPU调度的基本单位 |
地址空间 | 独立 | 共享 |
资源 | 独立 | 共享 |
创建和销毁开销 | 大 | 小 |
通信方式 | 复杂(IPC) | 简单(共享内存) |
崩溃影响范围 | 进程间独立,一个进程崩溃不影响其他进程 | 线程共享进程资源,一个线程崩溃可能影响整个进程 |
使用场景
- 进程:适用于需要较高隔离性和独立性,以及需要分配较多资源的任务。例如,独立的应用程序、服务等。
- 线程:适用于需要高效并发执行,共享数据和资源的任务。例如,多线程服务器、并行计算等。
通过理解进程和线程的特点和差异,可以根据具体应用需求选择合适的并发模型,以优化系统性能和资源利用率。
那么假设操作系统提供了一种特殊的系统调用,能够让你写的程序给其他应用进程中注入一个线程,那么你的程序是不是可以改其他应用程序的内存?
比如你写了一个外挂程序,通过从
植物大战僵尸.exe
注入一个线程,这个线程执行的是你自己写的代码程序,就能够完成对游戏内存的自由修改。