程序
程序:程序是已编译好的二进制文件,存储在磁盘中,不占用系统资源
程序包括:
- RO段:只读代码段(code段.text段)和常量段(RO data段/.constdata段)
- RW段:(.data段)已初始化成非0的变量段(全局变量和静态变量)
- ZI段:(.bss段)未初始化的为0的变量段(全局变量和静态变量)
进程
进程: 进程是资源分配的最小单位,占用系统资源
进程主要包括:
- RO段:只读代码段(code段.text段)和常量段(RO data段/.constdata段)
- RW段:(.data段)已初始化成非0的变量段(全局变量和静态变量)
- ZI段:(.bss段)未初始化的为0的变量段(全局变量和静态变量)
- 栈:存储局部、临时变量,函数调用时,存储的函数返回指针,用于控制函数的调用和返回。程序开始时自动分配内存,结束时自动释放内存
- 堆:存储动态内存空间,需要程序员手工分配,手动释放。
程序如何变成进程?
当我们启动程序的时候,由DMA模块将程序从磁盘中拷贝到内存中,同时启动DMA中断,让cpu来加载进程
线程
线程:线程是资源调度的最小单位
线程与进程
假设linux系统中有三个进程同时运行,cpu分配每个进程时间片分别是3s、2s、4s.进程A中有两个线程,一个线程对应一个cpu的核心,进程A就会在分配的2s的时间片中用两个线程来处理事情,提高处理的效率。
fork和创建新线程的区别
- 当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和自己的pid。新进程运行时是独立的。
- 在进程里面创建一个新线程的时候,新的执行线程拥有自己的堆栈,当共享了全局变量、文件描述符、信号处理器和当前的子目录状态
优点
- 创建一个新线程的代价要比创建一个新进 程小得多
- 与进程之间的切换相比,线程之间的切换 需要操作系统做的工作至少在理论上要少很多
- 线程占用的资源要比进程少很多