内存分配——内存管理(Memory Mangae)
进程如何管理内存,其实是一个非常复杂的事情
核心结论:每个进程的内存,是彼此独立,互不干扰的
通常情况下,进程A不能直接访问进程B的内存;
为了系统的稳定性 如果某个进程代码出bug(比如写越界)
写错影响的范围,只是影响到自己这个进程,不会影响到其他进程
系统上的一个进程崩溃,影响了其他进程,非常糟糕的体验
共享内存也是有限制的
不是所有的内存空间都能共享
这个情况,我们也称为“进程独立性”
进程间通信(Inter Process Communication)
虽然有进程的独立性,但是有时候也需要,多个进程相互配合,完成某个工作
进程间通信和进程的“独立性”并不冲突
系统提供一些公共的空间(多个进程都能访问到),让两个进程借助这种公共空间来交互数据
操作系统提供的“进程间通信”具体的方式,其实有很多种本质上都是上述思路
Java程序员主要使用的进程间通信方式是文件和网络
网络,是可以支持同一个主机的不同进程,也能支持不同主机的不同进程(适用性更高)
后端这里,很可能是一组服务器与另一组服务器之间进行通信
上诉对于进程的讨论,只是序幕。实际上,在Java中不太去鼓励多进程编程
线程就更加重要了
进程
多任务操作系统,希望系统能够同时运行多个程序
如果是单任务系统,完全不涉及进程,也不需要管理,更不需要调度
事实上,进程,是可以很好的解决并发编程这样的问题的
(有些操作系统,上面就只有进程这个概念)
在一些特定的情况下,进程的表现,不尽人意。
比如,有些场景下,需要频繁的创建和销毁进程的时候,此时使用多进程编程,系统开销就会很大
早期编写一个服务器程序,互联网发展早期,网站/web开发这件事开始出现了,最早wen开发是使用c语言来编写的服务器程序(基于一种CGI这样的技术)
基于多进程的编程模式 服务器同一时刻会收到很多请求,
针对每个请求,都会创建出一个进程,给这个请求提供一定的服务,返回对应的响应
一旦这个请求处理完了,此时这个进程就要销毁了
如果请求很多,意味着你的服务器就需要不停的创建新的进程,不停销毁旧的进程,频繁创建和释放
这样的操作,开销很大(资源的申请和释放)
进程是资源(CPU,硬盘,内存,网络宽带)分配最基本的单位
一个进程,刚刚启动的时候,首当其冲,就是内存资源进程需要把依赖的代码和数据,从磁盘加载到内存中
从系统分配一个内存,并非是一件容易的事情
一般来说,申请内存的时候,需要指定一个大小,系统内部就把各种大小的空闲内存,通过一定的数据结构,给组织起来了
实际申请的时候,就需要去这样的空间中进行查找,找到个大小合适的空闲内存