进程
程序运行的最小单位,一般一个可执行文件一个进程。
内存地址空间:代码段、数据段(静态区、常量区)、堆、栈、PCB(进程控制块)
父子进程
通过fork完全拷贝一份父进程的内存地址空间,这2个地址空间独立
执行顺序:不确定谁先获取时间片
vfork:复制一份地址空间,但是是空白的,配合excl等使用
孤儿进程:父进程先挂,子进程还在运行,由init进程托管
僵尸进程:子进程挂了,父进程不回收资源(办法:父进程wait回收、父进程挂掉等init接管)
进程状态:阻塞、就绪、执行。
进程上下文:触发中断,保存上下文(栈、寄存器等),执行中断,再恢复现场
进程调度:最短时间、先进先出、优先级等方式
并发:一个CPU同一时刻只能运行一个程序,通过时间片轮流执行来实现并发的效果
并行:多个CPU运行
进程间通信
2个进程是相互独立的地址空间,通信需要内核(进程A用户空间-》内核空间-》进程B用户空间)。
无名管道:用于父子兄弟等有血缘关系的进程,单向传输(读端写端),64K大小限制,当另一端关闭时,读会阻塞,写会管道破裂
有名管道:同无名管道,但可用于2个没关系的进程
socket:本机、局域网、远程RPC
信号:发出信号,触发信号处理函数
消息队列
内存映射
一个进程占2^32=4G大小,3G为用户空间,1G为内核空间。3G的用户空间通过页表映射到物理内存上。
虚拟地址到页表:32位的虚拟地址,高20位的值表示在页表的第几行,低12位表示在这个4K大小里的偏移。
页表到物理内存:页表上有一串不连续的地址(间隔4K),找到指定的行,取出行里的值,这个地址对应物理内存的首地址,并且对应物理内存的4K大小。
共享内存
通过内存映射,将用户空间映射到内存。2个进行的用户空间映射到同一片物理内存上即可通信(需要同步)。避免了用户空间和内核空间的拷贝,速度最快。
线程
进程调度的最小单位,一个进程可包含多个线程,多个线程共享这个进程的地址空间。共享代码段、数据段、堆栈等,共享用户组、文件描述符、信号处理等,但有自己的进程ID、私有栈等。
临界区资源
互斥锁
读写锁:可同时读,写时互斥
条件变量
信号量:计数,加锁减一,解锁加一
死锁
异常、忘记解锁、加锁顺序不对等造成的
智能锁