一、系统调用
- 创建进程
需要由老的进程执行fork系统调用得到新的子进程;
fork:子进程拷贝一份父进程一模一样的数据结构,内存,程序代码等;(先拷贝,再修改)
- 进程的私有内存
每个进程启动后都会在内存中分配一块空间;(放程序的代码段 + 进程运行时产生的数据段)
- 进程数据段内存分配
局部变量==》栈中;手动回收的数据==》堆中;
只有当进程要向内存中写入数据的时候,发现没有对应的物理内存,才会触发中断,被分配一块物理内存(brk系统调用方法会划出少量的内存空间并紧挨着原来的进程数据段;当请求写入大量的物理内存时用mmap系统调用的方法划出一块完整的空间,但是不一定与原来的数据段内存空间紧邻)
- 一切皆文件:统一了操作的入口
对所有的东西都可以通过六个系统调用进行操作:open、close、create、lseek、read、write(打开、关闭、创建、定位、读、写)
管道文件:将一个进程的输出作为另一个进程的输入;
socket文件:进程间通过网络进行通信;
每一个文件对应一个文件描述符,来供系统调用;
- 进程间通信
- 少量数据:消息队列;
- 大量数据:共享内存;(共享内存的并发访问问题:semaphore规定同一时间可以有几个访问者)
- 跨机器进程通信:系统调用基于TCP/IP协议的Socket建立通信;
系统调用总结图
二、计算机的工作模式
- 每个进程在内存中占据一块空间:进程空间 = 指令集 + 数据集;
- CPU = 控制单元 + 计算单元 + 数据单元;
CPU控制单元中的指令寄存器先从进程的指令集中读取下一条指令 — >
指导计算单元和数据单元执行该指令,其中数据单元会读取进程数据集中的数据 — >
计算完成后将运算结果写回进程的数据集;
总线:主要分为地址总线 + 数据总线;(每一类总线有好几根)
地址总线:决定CPU能访问的内存地址范围;
数据总线:决定CPU一次能从内存中获取的数据量大小;
CPU执行指令总结图:
精简版:
参考文章:
https://time.geekbang.org/column/article/89417