现代计算机大多是冯诺依曼体系结构,这是一种硬件结构,规定了设备组成和设备类型。
存储器:内存,磁盘/U盘是外存是输入输出设备。
输入设备:键盘/磁盘/摄像头/话筒/网卡
输出设备:显示器,播放器硬件,磁盘,网卡....
输入和输出设备都是外部设备,简称外设
运算器:对数据进行算术运算。逻辑运算。
控制器:对硬件流程进行一定控制。
设备之间的连接通过系统总线和I/O总线相连。
存储设备效率:由上往下效率越低容量越大
内存相当于硬件缓存,外设的速度和cpu的速度相差过大,如果直接相连,会导致计算早就完成,但是读写未完成,而使用内存可以在cpu计算的同时,预习加载下一次计算的内容。总体上加快速度。冯诺依曼体系中内存的存在在某种程度下降低成本,提高速度。
在I/O流中内存和cpu直接交互,所以所有的程序都必须加载到内存中运行。
操作系统是一个对软硬件管理的软件,为用户提供稳定,安全,高效的环境。
操作系统包含内核和其他程序(shell ,函数库),操作系统包含内存管理,进程管理,文件管理,驱动管理。
操作系统通过接口(函数)暴露出来给他人使用,就是system call,软件只有通过system call来使用硬件资源。 system的上层还有lib(库函数)如:printf()能输出打屏幕上,一定是封装了system call的接口。再一层一层往下调用。
所有的语言都是在操作系统之上的。
操作系统是如何管理软硬件资源的?先描述再组织
操作系统的管理本质上是获取计算机软硬件的信息再做出决策的过程。
操作系统通过驱动获取硬件信息,硬件的属性是公有的,因此可以通过模板来描述信息,再通过各种数据结构来组织信息。最后通过对数据结构的增删查改来实现对信息处理。
进程:一个加载到内存中的程序。进程也叫任务。
任何一个程序加载到内存时形成真正的进程时,操作系统要先创建描述进程的结构体对象PCB(process ctrl block 进程控制块)。
对于Linux来说,PCB:描述进程的结构体对象。
PCB通过描述进程的属性来表示进程(这不就是面向对象思维通过大量的属性集合来表示物体)
进程的属性:进程编号,进程状态,优先级等
一个进程=内核PCB结构对象+程序的代码和数据
对进程的管理就是对进程内核PCB数据结构对象的数据管理,对进程的阻塞等也是对PCB的操作
PCB:进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,只要有上述功能的都可以叫做PCB,task_struct就是Linux的PCB。
task_struct 是结构体,是Linux内核的一种数据结构或者类型。
task_struct内容分类:
标识符:区别其他进程
状态:任务状态,退出代码,退出信号
优先级:相对于其他程序的优先级
程序计算器:程序中即将被执行的下一条指令地址,就像是寄存器会存放下一条指令的地址
内存指针:包括程序代码和进程相关数据的指针,还有其他进程共享的内存块的指针。
上下文数据:进程时处理的寄存器的数据(休学例子,要加图CPU,寄存器)
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和进程使用的文件列表。
记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等。
其他信息。
Linux内核中,组织task_struct 是用双向链表,一个task_struct对应一个进程,多个task_struct是用链表组织的。
查看进程指令
ps ajx//查看所有进程
ls /proc
proc相当于将内存可视化,这意味着如果进程消失了,proc显示的进程也会减少,每次开关机都proc都会重新创建或者销毁。
打开进程对应的文件夹,查看相关信息
指向
exe指向可执行文件的目录。
cwd指向进程的运行目录。
为什么touch test.c是在本地目录下创建的文件。
touch进程运行默认是在本地目录的,对于创建的文件,进程的结果也是放在本地目录,由此我们可以推断再不同目录下创建文件,实际上是让rouch进程在不同的目录下运行。