MMU的作用:
- 虚拟内存和物理内存的映射
进程控制块PCB
- 一个结构体
- 进程的基本状态:初始、就绪、运行、挂起、终止。
- 环境变量:
- 获取环境变量:char *getenv(const char *name)
- 进程API:
- 创建一个新的进程:
- pid_t fork(void)创建一个进程
- 失败返回 -1
- 成功返回两次
- 父进程返回子进程的id
- 子进程返回 0
- pid_t fork(void)创建一个进程
- 获取进程id
- pid_t getpid(void)获得当前进程
- pid_t getppid(void)获取当前进程父进程的id
- 创建一个新的进程:
- 查看进程:
- ps aux 、
- ps ajx(查看血缘)
- kill 杀死进程
- sleep()让程序进入挂起态,就不在抢占cpu,再次获取资源就可以进入就绪态
- 进程共享
- 代码和数据都是共享的
- 不同:未决信号集,定时器不同
- 子进程和父进程:读时共享,写时复制(在物理内存上新开辟一块内存)
exec族函数
- 执行其他函数
- execl():执行程序时,使用PATH变量,不需要文件路径
- execlp():需要文件路径,代码段替换
孤儿进程和僵尸进程
- 孤儿:父亲死了,子进程被int进程领养
- 僵尸:子进程死了,父进程没有回收子进程的资源(PCB)pcb残留
- 杀死父进程,init领养僵尸,进行回收
- 回收僵尸
- 作用:
- 阻塞等待
- 回收子进程资源
- 查看死亡原因
- wait(int *staus)
- status 传出参数
- 死亡原因:
- 正常死亡
- 非正常:信号杀死
- waitpid(pid_t pid,int *staus,int option)
- pid:选择回收的进程
- option:如果配置为WNOHANG,没有子进程退出立刻返回
- 返回值:如果配置了WNOHANG:
- 如果没有子进程退出,返回0
- 如果有子进程退出,返回退出的pid
- 返回失败输出-1
- 作用:
IPC
- IPC:进程间通信,通过内核提供的缓冲区进行数据交换的机制
- IPC的通信方式:
- 常见的通信方式:
- 单工:广播
- 半双工:同一个时刻数据,数据一个方向流(对讲机)
- 全双工:电话
- pipe 管道 --最简单(有血缘关系的半双工通信)
- 父子进程一个写,一个读
- 创建子进程之前pipe
- int pipe(int pipefd[2]);
- pipefd 读写文件描述符,0-代表读,1-代表写
- 返回值:失败返回-1,成功返回0
- 尽量兄弟进程间互相通信,易于回收
- fifo 有名管道
- 创建一个fifo伪文件
- mkfifo myfifo 终端命令创建
- int mkfifo(const char *pathname,mode_t mode)
- 内核会针对fifo文件开辟缓冲区:实际上就是文件读写
- 创建一个fifo伪文件
- mmap 文件映射共享IO --速度最快
- void *mmap(void *addr, size_t length, int prot, int flag, int fd, off_t offset);
- addr:NULL
- length:映射区长度
- prot
- PROT_READ 可读
- PROT_WRITE 可写
- flags
- MAP_SHARED 共享的
- MAP_PRIVATE 私有的
- fd 文件描述符,open打开一个文件
- offset 偏移量(必须是4k的整数倍)
- 返回值
- 成功返回地址
- 失败返回MAP_FAILED
- 释放映射区:int munmap(void *addr, size_t length);
- void *mmap(void *addr, size_t length, int prot, int flag, int fd, off_t offset);
- 本地socket --最稳定
- 信号 --携带信息量最小
- 共享内存
- 消息队列
- 常见的通信方式: