文章目录
一、 冯诺依曼体系结构
计算机硬件上的结构:
输入设备:键盘,鼠标,话筒,摄像头……网卡,磁盘
输出设备:显示器、磁盘、网卡,打印机……
输入/输出设备称为外设,Input/Output->IO,站在内存的角度理解IO
CPU = 运算器 + 控制器
存储器:内存
磁盘是外部存储
二、操作系统(Operator System)
1、概念
任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。
操作系统一款进行软硬件管理的系统软件。
操作系统包括:
• 内核(进程管理,内存管理,⽂件管理,驱动管理)
• 其他程序(例如函数库,shell程序等等)
2、设计OS的目的
- 操作系统向下对软硬件资源管理。(不是目的,是手段)
- 操作系统对上,为用户程序(应用程序)提供一个良好的执行环境。(目的)
- 软硬件体系结构是层状结构
- 访问操作系统,必须使用系统调用——其实就是函数调用,只不过是系统提供的
- 我们的程序,只要你判断出它访问了硬件,那么它必须贯穿整个软硬件体系结构
- 库可能在底层封装了系统调用
操作系统核心:管理(先描述,再组织)
3、系统调用
操作系统要向上提供对应的服务
操作系统,不相信任何用户
用户不能直接访问操作系统内部的信息,必须通过系统调用返回信息。
三、进程的基本概念与基本操作
1、概念
-
课本概念:程序的一个执行实例,正在执行的程序等。
-
内核观点:担当分配系统资源(CPU时间,内存)的实例。
-
进程 = 内核数据结构对象 + 自己的代码和数据
2、描述进程——PCB
- 进程信息被放在⼀个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct
- 进程的所有属性,都可以直接或者间接通过进程控制块找到
在linux具体的进程:
- 进程 = PCB(task_struct) + 自己的代码和数据
3、task_struct
4、getpid 获取进程ID
谁调用这个函数就获取谁的进程ID
5、ps axj 所有的以特定格式的进程
也可以使用 top 命令来查,但查看全部太多了不方便我们看
只查看当前我们的进程:
显示进程对应的信息:
连续执行两条指令,用分号依次隔开:
也可以使用 && 隔开两条指令,效果跟分号一样
6、kill - 9 + pid 杀掉进程
-9是信号
7、ls /proc 通过目录结构查看进程
对应的每个数字目录都是一个进程,数字对应的是进程的pid
目录里面存的是进程对应的各种属性
cdw(current work dir) : 存放当前路径
exe :存放可执行程序所在的路径
函数 chdir修改当前路径
8、getppid 获取父进程
Linux系统所以的进程都是被它的父进程创建的
一个父进程可以有多个子进程,进程也是进程树
-bash是命令行解释器:本质也是一个进程
- OS会给每一个登录的用户,分配一个bash(-bash代表远程登录)!
9、fork创建子进程
本来是一个执行流的遇到fork会变成两个执行流
- 子进程没有自己独立的代码和数据,因为目前没有程序新加载
让父子执行不同的代码
创建失败返回值小于0
在父进程里的代码中fork()返回值是子进程的pid
在子进程里的代码中fork()返回值是等于0的
- 进程具有独立性
- 数据默认是共享的,但父子如何一方,进行修改数据,OS就会把修改的数据在底层拷贝一份,让目标进程修改这个拷贝!(写时拷贝)
四、进程的状态
进程状态就是task_struct内的一个整数
- 运行:进程在调度队列中,进程的状态都是running!
- 阻塞:等待某种设备或者资源就绪,键盘、显示器、网卡、磁盘、摄像头、话筒……
- 进程状态的变化,表现之一,就是要在不同的队列中进行流动。本质都是数据结构的增删查改!
- 挂起:当操作系统的内存资源不足时,把进程的代码和数据换入到磁盘中,真正运行进程时再换入到内存里
1、Linux内核中进程的状态
R:运行状态
S:阻塞状态,可中断休眠,浅睡眠
D:深度睡眠,不可中断休眠
t:gdb时进程被debug暂停
T:用户Ctrl+z,进程暂停
X:结束状态
Z:僵尸状态,为了获取退出信息