Linux操作系统基础(了解操作系统,操作系统的管理,进程详解)
我们常见的计算机,大部分都遵守冯诺依曼体系。输入设备:键盘,鼠标,摄像头,麦克风,网卡,硬盘等存储器:内存(掉电易失性存储介质)中央处理器:运算器:控制器:输出设备:显示器,声卡,喇叭,硬盘...
Linux操作系统基础
我们常见的计算机,大部分都遵守冯诺依曼体系。
- 输入设备:键盘,鼠标,摄像头,麦克风,网卡,硬盘等
- 存储器:内存(掉电易失性存储介质)
- 中央处理器:
- 运算器:算数运算,逻辑运算
- 控制器:控制电路信号(非数据性,什么时候该进行什么操作,进行操作的时间)
输出设备:显示器,声卡,喇叭,硬盘
从数据信号看,cpu不和输入输出设备交互。
- cpu 寄存器:纳秒
- 内存:微妙
- 硬盘:毫秒
- 距离cpu越近存储效率越高,成本越高,且容量比较小。
- 出于成本和效率,一般由快的设备给慢的设备做缓存。
输入输出设备距离cpu远,所以一般由内存作为缓冲区实现预加载与预写入。
这一些列操作都是计算机操作系统(os)帮我们做的。
当登上qq和某位朋友开始聊天,发消息的数据流动过程:
我:输入设备(键盘)——>存储器——>cpu封包——>存储器——>网卡
朋友:输入设备(网卡)——>存储器——>cpu解包——>存储器——>显示器
1. 操作系统
任何计算机系统都包含一个基本程序的集合,成为操作系统(os),操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序)
1.1 设计os的目的
- 与硬件交互,管理所有的软硬件资源
- 为用户程序提供一个良好的执行环境
1.2 定位
一款纯粹的"管理"软件
如何理解这个"管理"呢
管理:真正的管理是有"绝策权"的,与"执行权"不同。
任何管理都是先描述,在组织
先看下三层:
底层硬件:学生(被管理者)
驱动程序:导员,楼管,图书管理员(执行者)
操作系统:校长(管理者)
- 校长从来不与学生直接见面,通过信息管理,通知执行者导员,对学生进行操作
- 驱动层可以帮管理者拿到被管理者的数据
- 被管理者信息量很大,信息就需要被组织起来,要组织就要先描述。(可以理解为先声明,在定义)
先描述。
struct stu
{
_name;
_sex;
_num;
_grades;
struct stu* next;
}
在组织:
Struct s1,s2,s3...
s1->next=s2;
s2->next=s3;
...
操作系统操作过于复杂,提供了系统调用接口,操作也有部分成本,所以提供了用户操作接口。
在我们实际进行编程或者开发的时候大多数用的都是lib库函数,有的库函数与硬件进行交互那么,他就会调用系统调用。
总结:
- 操作系统是什么?什么是管理?
一款"管理"软件;具有决策权的才叫管理,执行者不算。 - 操作系统怎么进行管理?
通过驱动操作硬件信息。具有同种类型的信息很多,先描述,在组织。 - 操作系统为什么要进行管理?
一套系统,需要一个管理者进行领导,对上给用户一个稳定高效的执行环境,对下管理好软硬件资源提供稳定的软硬件环境。 - lib库函数和系统调用之间的关系
库函数在系统调用的上层,使用库函数与硬件进行交互的话会调用系统调用。
2. 进程
2.1 认识进程
操作系统一般在硬盘根目录的boot目录。
运行起来的时候加载在内存当中
当一个程序运行起来被加载到内存的瞬间就成为了进程。
写一个程序:
2.2 查看进程
2.2.1 第一种方法
首先,运行程序,在另一个窗口通过ps命令查看这个进程
USER :进程的所属用户,
PID :进程的进程ID号,
%CPU :进程占用的 CPU资源 百分比,
%MEM :进程占用的 物理内存 百分比,
VSZ :进程使用掉的虚拟内存量 (Kbytes) ,
RSS :进程占用的固定的内存量 (Kbytes) ,
TTY :与进程相关联的终端(tty),?代表无关,tty1-tty6是本机上面的登入者程序,pts/0表示为由网络连接进主机的程序。
STAT :进程的状态,具体见2.1列出来的部分 ,
START :进程开始创建的时间 ,
TIME :进程使用的总cpu时间,
COMMAND : 进程对应的实际程序。
2.2.2 第二种方法
线运行程序,在另一个窗口通过ls /proc查找
可以看到第一种方法查找到mybin 的pid是9797,在第二种方法中右上角也找到了9797。那个9999是grep命令的进程。
通过ctrl+c终止程序,发现9797没有了。
再次运行呢,又重新分配了pid。(进程1一般都是操作系统)
然后进入9797对应的目录里,这里都是它的基本信息
3. 通过系统调用获取标识符
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4 int main()
5 {
6 while(1)
7 {
8 printf("pid : %d\n" , getpid());
9 printf("ppid : %d\n" ,getppid());
10 sleep(1);
11 }
12 }
~
~
- pid(进程id)
- ppid(父进程id)
运行查看对应的id。
终止,在重新运行,重新分配了pid。父进程没有变化
通过ps aux | grep 22717
查看进程,发现父进程始终是bash命令。shell为命令行解释器,bash是Linux中的命令行解释器(就和pcb是进程,struct task_struct是Linux中的进程一样)
4. 进程需要注意的几个地方
- 内存当中会有很多进程,那么操作系统怎么进行管理呢?
答:很明显 先描述,在组织。 - 进程(Process Control Block简称pcb)在c语言中pcb被定义为
struct task_struct
。 - 就像文件=内容+属性一样。程序文件加载进内存成为进程,那么进程是一定比原文件体积要大的。
- 描述进程的数据结构,就是一批结构体对象。
所以一个进程实际的大小就是可执行程序+所需要的数据结构的集合
struct task_struct
{
1.标识信息
2.运行信息,时间
3.优先级信息
4.上下文(假如程序暂时停止,等到他恢复的时候还要让他继续运行)
5.关系信息
6.信号
7.状态
}
- 在Linux内核,采用双链表进行管理进程
- 为什么bash(命令行解释器)要存在子进程?
答:在对Linux进行操作时,总会有些指令出现bug,那么作为父进程他是不可以被挂掉的,他一出现问题所有的命令不能在被执行,所以每次在命令行运行命令bash创建自己的子进程,即使出现问题子进程挂掉也不影响父进程。
更多推荐
所有评论(0)