目录
- 堆内存与栈内存
- 进程和线程
- 同步与异步
- 阻塞与非阻塞
- ...
1. 内存区域
1. 堆区:由new分配的内存块,由程序员手动分配和释放,分配和释放的过程中可能出现内存泄漏,若
程序员不释放,程序结束时可能由操作系统回收
2. 栈区:由操作系统自动分配和释放,无需程序员手动操作
3. 全局区(静态区):存放全局变量和静态变量,程序开始时分配,结束时释放
4. 常量区:存放常量的区域,程序开始时分配,结束时释放
5. 代码区:存放二进制代码的区域
内存区域划分
1. 管理方式:栈类似数据结构中的栈,采用先进后出的方式;堆则是链表
2. 碎片问题:栈区是一段连续的内存区域,不存在碎片问题;堆区采用链表的方式,内存区域不连续,
频繁的分配和释放会造成大量的碎片
3. 空间大小:32位系统下,堆内存可以达到4GB;栈最大不超过8MB,栈空间不足时提示栈溢出
4. 生长方向:栈由高地址向低地址分配;堆由低地址向高地址分配
5. 分配方式:栈区内存由系统自动分配和释放;堆区内存由程序员手动控制,分配时需要指明大小,容
易造成内存泄露,不过进程结束时会由系统回收
6. 分配效率:栈由系统自动分配,速度较快,程序员无法控制;堆是由new分配的内存,一般速度较慢,
使用方便
2. 进程和线程
1. 一个进程中至少含有一个线程(主线程)
1. 存在多线程时,线程间相互共享进程用户地址空间(虚拟地址空间)
3. 进程销毁时,进程内的所有线程都会被同时销毁
1. 进程是资源分配的最小单位,线程是程序执行/资源调度的最小单位
2. 进程有自己的独立地址空间,每启动一个进程系统都会为它分配地址空间,并建立数据表来维护代码
段、堆栈段和数据段;同一进程中的多个线程共享代码段,数据段(全局变量和静态变量),扩展段(堆
存储)。但是每个线程拥有自己的栈段,用来存放所有局部变量和临时变量。
3. 线程之间通信更方便,同一进程的多个线程共享全局变量、静态变量等数据;进程间的通信需要以通
信的方式(IPC)进行
4. 多进程程序更健壮,多线程程序只要有线程死掉,整个进程也会跟着死掉,而进程之间则互不影响
1. 管道:半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(父子关系)的进程间使用
2. 命名管道:半双工的通信方式,数据只能单向流动,允许无亲缘关系进程间的通信
3. 消息队列:消息的链表,存放在内核中并由消息队列标识符标识,是 UNIX 下不同进程之间可实现共
享资源的一种机制,其中的消息具有特定的格式以及特定的优先级,独立于发送与接收进程
4. 信号量:用于实现进程间的互斥与同步的计数器,而不是用于存储进程间通信数据
5. 共享内存:映射一段能被其他进程访问的内存,共享内存由一个进程创建,但多个进程都可以访问
6. 套接字:可以让不在同一台计算机但通过网络连接计算机上的进程进行通信
3. 同步与异步
-
同步:在发出一个调用时,在没有得到结果之前,该调用就不返回,调用者主动等待这个调用的结果
-
异步:调用在发出之后,这个调用就直接返回了,所以没有返回结果,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用
4. 阻塞与非阻塞
-
阻塞:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回
-
非阻塞:在不能立刻得到结果之前,该调用不会阻塞当前线程
网友评论