进程
一、冯诺依曼体系结构
这里的存储器指的是内存,而磁盘、U盘等都是外存;
输入设备和输出设备都是外设,输入设备包括:键盘、摄像头、话筒、磁盘、网卡、鼠标;输出设备包括:显示器、播放器、磁盘、网卡;
CPU包括运算器和控制器,分别进行算术逻辑运算和流程控制;
外设和CPU之间使用总线连接起来,进行传输;
CPU寄存器是纳秒级别,内存是微秒级别,外设是毫秒级别的;由木桶原理可知,最终的效率是由外设决定的,速度相差太大。而内存可以起到适配速度差的效果,最终表现出来的就是内存的速度;
执行可执行文件的时候,会将磁盘数据预加载到内存中,之后的交互过程实际上是CPU与内存之间的,并行IO过程靠的就是CPU与内存的交互,而CPU的运算过程必须保证是串行的;
冯诺依曼体系结构规定程序运行先载入到内存中,这是由硬件决定的,即软件依赖硬件;
二、操作系统
2.1认识操作系统
操作系统是一款进行软硬件资源管理的软件。
对于软件的运行通常是从上往下贯穿执行的,依次是用户->用户操作接口(shell、库函数)->系统调用->操作系统内核(内存模块、进程模块、文件模块、驱动模块)->驱动程序->硬件;
操作系统的核心工作就是通过对下管理好软硬件资源,对上提供一个良好的使用和操作环境;
系统调用是用c实现的函数,专门用来调用操作系统;由于操作系统不相信用户,防止非法地访问,只是对外提供来系统调用接口;
2.2操作系统管理
先描述再组织,将被管理对象的属性提取出来,然后用某中数据结构将对象存储起来;即用结构体对象来描述不同的对象,这其实就是计算机世界对现实世界的抽象建模;
三、进程的认识
3.1进程
一个正在运行的程序叫做进程。进程之前一定是相互独立的;
shell
ps axj
#查看所有进程
top
#查看当前运行的进程
kill -9 pid
#杀死pid进程
kill -l
#查看所有信号
操作系统将进程对象管理起来,使用结构体对象PCB(进程控制块)描述,然后使用双向链表进行组织;
Linux中的结构体对象是task_struct,存放着当前进程的属性,包括标识符如pid,状态,优先级,程序计数器用来恢复进程上下文,内存指针找代码和数据,记账信息:记录调度时间;
/proc目录下存放着进程的信息,通过pid来查找相应的目录,exe指的是当前程序所在的目录,cwd指的是当前工作目录。每一个命令行都是是一个bash进程;
shell
getpid()#获取当前进程pid
getppid()#获取父进程pid
fork()#创建子进程
子进程和父进程如果看到的是同一份资源,为了保证进程的独立性,其中进行写入的一方要进行写时拷贝;
3.2进程状态
3.2.1一般进程状态
一般的操作系统进程状态分为运行、阻塞、挂起;
运行队列的进程处于运行态,随时可以被调度器进行调度;为防止一个进程长时间占有CPU时间,导致其他进程饥饿,使用了时间片进行管理,即时间片时间一到,就切换进程;
由于需要硬件响应,进程会从运行队列移动到等待队列,等待响应,此时进程处于阻塞状态;
当内存资源严重不足时,会将等待队列的阻塞态进程等较为闲置的进程换出到磁盘,缓解内存压力,等到压力减小时再换回,此时换到磁盘的进程叫做挂起态;
3.2.2Linux进程状态
shell
dd
#模仿高IO像磁盘写入
exit(0)
#进程终止,退出码为0
R:运行状态,R+表示的是前台运行;
S:浅阻塞状态,等待响应;
D:深度睡眠状态,该进程一般是处于磁盘读写时,不会接收任何请求,直至读写完成;
T:暂停状态,18(继续信号)/19(暂停信号)控制;
t:暂停状态,gdb调试时断点暂停;
X:死亡状态,终止;
Z:僵尸状态,等待父进程回收,在此期间内不可以被杀死,最终会导致内存泄露;
如果父进程被回收了,那么子进程就变成了孤儿进程,会被操作系统领养释放;
3.3进程优先级
进程根据优先级的不同,会优先被调度器进行调度;
shell
ps -l#查看当前终端的优先级
ps -al#查看所有优先级
新的优先级=旧的优先级+nice值,PRI:优先级,NI:nice值。nice值范围[-20,19];不能随意修改优先级;
更改优先级的本质就是修改nice值
shell
nice -n nice值 命令
renice -n nice值 pid
进入top后按"r"-->输入进程PID-->输入nice值
3.4进程调度
Linux O(1)调度算法
操作系统根据优先级进行调度,O(1)调度算法以空间换时间,使用位图管理队列数组,有两个队列数组,分别是run和wait队列数组,数组大小为140个队列,队列数组安数组下标,优先级逐渐降低。同一个优先级维护在一个队列,通过实现了两个数组的指针实现两个数组的轮换。通过位图是否为零,来判断队列是否为空。时间片运行时间结束,将进程连接到等待队列,使用CR3和eip寄存器来恢复上下文;
3.5环境变量和命令行参数
3.5.1环境变量
环境变量表存放在系统的配置文件中,根据环境变量实现一些默认动作如:指令的默认查找路径,白名单添加;环境变量是系统提供的一组kv变量,不同的用户使用不同的环境变量
常见的环境变量:
PATH,记录着取那些路径下查找指令,修改使用PATH=$PATH:增加内容;
shell
env
#查看环境变量
getenv("PATH")
#获取环境变量
3.5.2命令行参数
命令行参数,int argc,char* argv[];用来实现指令带选项,实现不同的功能;
命令行参数以空格为分隔符,argc指的是字符串数量,argv是字符串表;
最终形成了两个向量表,一个命令行参数表,一个环境变量表,都以NULL结尾;
3.5.3设置环境变量
shell
$myvalue=123
#定义本地变量
export myvalue
#将本地变量导出环境变量
unset myvalue
#取消环境变量
set
#查看所有变量(环境变量与本地变量)
3.5.4内建命令
命令分为常规命令(由bash的子进程完成)和内建命令(由bash亲自完成)
shell
chdir()
#修改进程当前工作目录
extern char**environ
#第三方变量指向环境变量表