进程
程序:二进制文件,占用磁盘空间
进程:启动的程序,占用内存空间,cpu
ps au 显示依赖终端的进程
ps aux 显示包括不依赖终端的进程
ps aux | grep 内容
ps ajx 显示包括PPID PID PGID SID
如果抓到形成,至少会有两条显示
ps -9 PID 无条件杀死一个进程孤儿进程:爹死了,孩子(孤儿)活着的进程,被init进程领养。子进程可以释放用户区空间,由父进程释放pcb。
僵尸进程:孩子(僵尸)死了,父亲不释放子进程pcb。
PCB:进程控制块,位于内核区记录进程信息的结构体。
包括:进程id,进程5种状态之一,需要恢复CPU寄存器的信息,虚拟地址空间信息,当前工作目录,用户id和组id,会话和进程组,进程可以使用的资源上限。
初始态:刚生出的进程。
就绪态:有执行资格,没有执行权(等待CPU)。
运行态:有执行资格,有执行权(获得CPU)。
挂起态:sleep后,没有执行资格,没有执行权。
终止态:死亡的进程。
进程是由进程通过fork创建。
线程是由进程通过pthread_create创建。 linux下线程就是轻量级的进程。 进程成为主线程,和子线程共用同一块地址空间和PID。但在内核区有独立的pcb。用户去的堆,栈,.text,.bss,.data,动态库加载区,环境变量,命令行参数中唯一不共享的就是栈。所以多线程之间可以共享全局变量,堆。如果有5个线程,8M的栈会被平分,更节约资源。
查看LWP查看线程ID,ps -Lf PID
多进程共享:代码,文件描述符,内存映射区。
多线程共享:堆,全局变量。
守护进程:后台进程,独立于终端,周期性执行某任务
- 进程的虚拟地址空间
虚拟地址空间通过页表映射到物理内存,页表由操作系统维护。linux中,内核进程和用户进程所占比1:3。
a.栈向低地址扩展(即”向下生长”),是连续的内存区域,先进后出不会存在内存碎片;
b.堆向高地址扩展(即”向上生长”),程序员管理,是不连续的内存区域,碎片多可能会效率低下。
c.环境变量
d.命令行参数
e.数据区—该区又分为bss段,rodata段和data段: bss段(block start by symbol)—保存未初始化或者初始化为0的全局变量 rodata段—用于保存常
f.代码区—存放函数体的二进制代码
线程同步思想:多线程访问共享资源,需要加锁进行同步。并行-〉串行。
1.互斥锁。
读写都互斥,串行,效率低。
2.读写锁。
可以并行读取A读,B读,独占进行写A读,B阻塞。
适合读比较多的场景。
3.管道
本质上是缓冲区,有读端,写端两个部分,对应两个文件描述符。
查看缓冲区大小:ulimit -a