计算机理论基础
main主程序
main函数有三个参数
* argc->主函数参数的个数
* argv->字符数组 存放的参数内容
* envp->字符数组 存放的环境变量(从父进程继承下来的环境变量)
* 环境变量 envp 参数内容 argv都是以NULL结尾。
环境变量相关命令
添加环境变量:export LD_LIBRARY_PATH
查看变量的值:echo $LD_LIBRARY_PATH
清除指定的环境变量:unset LD_LIBRARY_PATH
main函数参数测试:
以上程序运行结果如下:
参数内容可以通过编译main时在后直接加入参数 例:
环境变量测试:
执行该代码便会在代码中找到所添加的环境变量:
ps->bash
用户操作计算机硬件 ,计算机硬件通过shell操作传递给内核函数调用。
shell是用户和linux内核交互的接口程序。
shell其实就是终端(在提示符输入命令,经过shell先解释后传递给内核)
shell 通过$PATH (环境变量)寻找可执行程序(应用程序)。若找到可执行程序,可执行程序被分解为系统调用,传递给内核执行。
bash-> born again shell (bash其实就是shell分类中的一种)
并行和并发
并行:在同一时刻能够同时执行多个进程(上图中两个进程),每核,CPU在每一时刻执行一个进程,所以要同时进行多个进程的运行,需要多核CPU。
并发:在某一时间段,需要处理多个任务(进程)。单核CPU,在某一时刻只能处理一个任务,多个进程通过进程切换,进行执行。
调度算法(时间片轮转法:比如三个程序 a,b,c单核CPU,首先a运行十秒,接下来去c后面排队,接下来b运行十秒,然后去排队,接下里c十秒进行排队,这样依次下去,等待每个程序运行结束。此处的10秒过大,实际上也就10MS,运行时因为时间太短,所以我们视觉上也就是一块运行,视觉上类似于并行,所以也叫伪并行)
串行处理:多个任务,单核CPU,一个进程全部处理完成,接下来处理一个进程,等待处理完再处理下一个进程。
printf
数组默认值
看上图中的代码:我们再Windows上用编写以上代码,其中arr[n]中n首先会错误,在c++中可以运行,但是输出2号元素会输出随机值,但是在linux中数组可以出现变量(arr[n]可以使用),并且输出值为0.均为默认值,不会出现随机值。
缓存缓冲
执行该代码:会等待10秒钟才会输出hello,
Windows:无缓存,Linux:有缓存,
为什么等待10秒钟:首先printf中hello存入缓冲区中,遇到return 0,结束时会刷新缓冲区,就会输出hello
刷新缓冲区:
1.程序结束前,return exit _exit 退出
2.碰见’\n’(强制刷新)
3.碰见fflush 刷新缓冲区(强制刷新)
4.缓冲区放满
return exit _exit 三者的区别:
return :关键字,仅仅为语言层面的应用,代表当前功能的结束。(比如画图进程,画一个圆,return便是画圆结束)
exit:函数调用,系统级别,进程的退出(比如画图进程,exit便是画图进程结束)
_exit:内核级别的函数,exit函数内部实现结束,调用_exit进程终止,(只结束程序,不会刷新缓冲区)
exit(0)<==>fflush(stdout)+_exit(0)
linux内存
物理内存和虚拟内存
物理内存:真正存在的内存条
虚拟内存:在硬盘上划分一块区域作为内存,划分的这一块内存称为虚拟内存。(物理内存不足用虚拟内存来替代)
X86: 4G的寻址能力,地址线32根,
CPU的地址线可以直接进行寻址的空间内存大小,比如8086只有20根地址线,其寻址空间便是1MB,也就是说8086能支持1MB的物理内存,即使我们安装了128M的内存条,也只能说8086只拥有1M的物理内存空间,同理32位的386以上的CPU,可以支持最大的4G的物理内存空间。
物理内存和虚拟内存的区别
虚拟内存和物理内存相反,是根据系统需要从因公安许你地匀出来的内存空间,是一种计算机系统内存管理技术,属于计算机程序,而物理内存作为硬件。因为有时候当你处理大的程序时,系统内存不够用,此时就会把硬盘当内存来用,来交换数据作为缓冲区,不过物理内存的处理速度时虚拟内存的30倍以上。
虚拟内存提供的三个重要的能力:
1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。
2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理
3) 它保护每个进程的地址空间不被其他进程破坏
图解:
Linux:用户态 内核态 3:1
Windous:2:2
物理地址
加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查。
逻辑地址
CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。
页表
一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。
计算机基本组成
五大部件:1)运算器:也叫数逻辑单位,完成对数据的格中常规运算,如加减乘除,也包括逻辑运算,移位,比较等。
2)控制器:他是整个计算机系统的控制中心,他指挥计算机各部分协调的工作,保证计算机按照预先规定的目标和步骤进行操作和处理。
3)存储器:存储程序和各种数据。
4)输入设备:把人所熟悉的信息比如:图片,声音,文字等转换位计算机能够识别的信息存储起来,(键盘)
5)输出设备:把计算机能识别的信息转换为人能识别的信息,进程呈现(屏幕)。
CPU(包含运算器和控制器) 内存 I/O设备之间由总线进行连接。
系统总线:分为地址总线,地址总线,控制总线。
地址总线:寻找地址。数据总线:运送数据。控制总线:控制地址总线和数据总线。
计算机工作过程
1.用户打开程序
2.系统把程序代码段和数据段送入计算机的内存
3.控制器从存储器中取指令
4.控制器分析,执行指令,为取吓一跳指令做准备
5.取下一条指令,分析执行,如此重复操作,直至执行完程序中全部指令,便可获得全部指令
程序运行过程
main.c 代码与数据 通过编译链接过程 加载到内存(主存)代码段.text 数据段.data,CPU(控制器)从主存上取 指令 执行,执行完当前指令,继续下一条指令,继续执行。循环往复
进程概述
进程:一个正在运行的程序。进程=程序+数据+PCB。
PCB:进程控制块,是进程存在的唯一标识。用来描述进程的属性信息。系统是根据PCB来对并发执行的进程进行控制和管理的。
一个程序的启动,先出现PCB,再有进程。一个进程的消失,先进行进程实体的消失,接下来才会有伴随着PCB的销毁。
系统正在运行的程序称为进程。是操作系统资源分配和调度的基本单位。
进程状态: