操作系统学习(一)

一.shell

1.什么是shell

我们如何使用计算机?在windows中我们通过点击图形界面来启动应用程序,在linux中通过输入命令行来启动程序,这两种方式本质都是要用户来控制计算机。但真正控制计算机的只有操作系统内核,而用户由于安全性、繁琐度等因素的影响,不能也没有必要来控制内核。这样的要求下,shell就出现了,这样的应用程序需要作为用户和内核之间的桥梁,简化用户操作的同时又保护了内核的安全。

所以,shell本质是一个应用程序,连接用户和linux内核,让用户更安全高效的使用linux内核。它并不是内核的一部分,只是在内核的基础上编写的一个应用程序。但它也有其特殊性,就是开机立马启动,并呈现在用户面前。用户通过 shell 来使用 Linux,不启动 shell 的话,用户就没法使用 Linux。

2.shell如何连接用户和内核

shell也是一个命令解释器,它在操作系统的最外层,接受用户的输入解释给操作系统,处理好操作系统的输出结果后又反馈到显示器中给用户。

其实,shell本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下shell都会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被shell隐藏了起来,它自己在背后默默进行,我们看不到而已。而接口其实就是一个个的函数,使用内核就是在调用这些函数。

比如,我们都知道在shell中输入cat log.txt命令可以查看 log.txt 文件中的内容。然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节shell统统不知道,它只能去调用内核提供的open()和read()函数,告诉内核我要读取 log.txt 文件,然后内核就按照shell的指示去读取文件,并将读取到的文件内容交给shell,再由shell呈现给用户(其实呈现到显示器上还得依赖内核)。


二.多进程并发执行

1.什么是进程

进程是一段程序/任务的执行过程,而负责执行该任务的是CPU。

这里用一张思维图来总结:

2.什么是并发

打开window任务管理器,会发现几百个进程任务正有条不紊的运行,只有八核的处理器如何做到的?其实我们看到的所谓同时运行的任务,是“并发”在发挥作用。在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行的。

实际上,在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,比如你在单核的CPU上一边打游戏一边听歌,你感受到的是游戏和音乐播放器一起运行,实际却是CPU在音乐播放器进程和游戏进程之间来回切换执行的。

并发性可以理解为电脑的处理器上一个线程里运行了两个程序,一会程序1执行一会程序2执行,虽然从物理层面来看两个程序都是同一时间运行的,但实际是执行完程序1后切换到程序2再执行的一个来回切换的过程,只不过是在同一时间段去运行。所以,并发性就可以理解为是在同一时间间隔去执行程序,并不是真正的同一时间点去运行。

3.什么是并行

并行性可以理解为根据电脑的处理器数量开启多个进程去处理程序,是真正意义上的同一时间运行。比如你在多核的CPU上打开了音乐播放器的同时又打开了csdn编写文章,这两个任务在不同的处理器上运行,互不干扰,是真正在同一时间点去运行程序。当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行。要强调的是,系统要有多个CPU才会出现并行。

4.并发与并行的区别

两个人在吃午饭。A在吃饭过程中,吃米饭、吃蔬菜、吃牛肉这三件事就是并发执行的。对于A来说,整个过程中看似是同时完成的,但其实是在吃不同的东西之间来回切换的。

还是两个人吃午饭。在吃饭过程中,A吃了米饭、蔬菜、牛肉。B也吃了米饭、蔬菜和牛肉。两个人之间的吃饭就是并行的。两个人之间可以在同一时间点一起吃牛肉,或者一个吃牛肉,一个吃蔬菜,之间是互不影响的。

并发,指的是多件事情在同一时间段内发生了;并行,指的是多件事情在同一时间点上发生了。

并发的多个任务之间是互相抢占资源的,并行的多个任务之间是不互相抢占资源的。

只有在多CPU的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的。

5.Linux实现模拟多进程并发执行

环境:archlinux、shell-zsh

(1)创建两个脚本文件ping1.sh和ping2.sh:

touch+文件名

(2)用vim编辑两个文件并保存:

vim+文件名

vim用法:http://c.biancheng.net/view/805.html

wc -l:统计文件的行数

wc用法:https://blog.csdn.net/asd3331380/article/details/121888318

(3)运行程序、观察结果、总结结论:

time+./文件名

发现权限不够,chmod修改权限,chmod用法:https://www.runoob.com/linux/linux-comm-chmod.html

发现权限已被修改,再次执行:

ping1.sh程序顺序执行,每个循环3s,共需15s左右;

ping2.sh多加了一个后台执行符号&,此时应是5个循环任务在后台并发执行,共需要3s左右时间。

注意:wait是等待前面的后台任务全部完成才往下执行,否则程序本身是不会等待的,这样对后面依赖前面任务结果的命令来说就可能出错。例如可能上面wc -l的命令就报错:”不存在aa这个文件“。

那么,什么是后台执行呢?


三.后台执行

当我们在终端或控制台工作时,可能不希望由于运行一个进程而占据屏幕,因为还有更重要的事情要做,比如阅读电子邮件。对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨),此时,后台执行就起了作用。

&:当在前台运行某个作业时,终端被该作业占据。此时可以在命令后面加上& 实现后台运行。例如:./test.sh &

实践:

1.创建并编辑test.sh文件,直接运行;
2.使用ctrl+z来暂停运行,此时进程变成暂停并变成后台进程,用jobsps aux | grep "test.sh" 查看后台运行的进程信息;
3.使用bg %number 来启动暂停的进程,number是jobs中[ ]中的编号;
4.使用kill %number来杀死进程。

注意:需要用户交互的命令不要放在后台执行,因为这样你的机器就会一直等待。不过,作业在后台运行一样会将结果输出到屏幕上,这样会影响你在控制台输出命令。所以如果放在后台运行的作业会产生大量的输出,最好把它的输出重定向到某个文件中:command > out.file 2>&1 &

这样,所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。

另一种杀死进程的方法:先把进程切换到前台后ctrl+c退出。


四.分时和实时系统

1.系统介绍

实时操作系统

实时操作系统是指当外界事件或数据产生时,能接受并以足够快的速度予以处理,其处理的结果又能在规定时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的操作系统。其特点是及时响应和高可靠性。实时系统又分为硬实时系统和软实时系统,硬实时系统要求在规定的时间内必须完成操作;软实时则只要按照任务的优先级,尽可能快地完成操作即可。

分时操作系统

使一台计算机同时为几个、几十个甚至几百个用户服务的一种操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。由于时间间隔很短,每个用户都感觉是独占了计算机一样。

2.系统特点

实时操作系统

(1)多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。系统内核分配CPU给这些任务来获得并发性。
(2)抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务中,优先级最高的任务被分配CPU资源。换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。
(3)任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。系统必须提供这些任务间的快速且功能强大的通信机制。内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。

(4)任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,任务级和中断级之间需要存在通信。

分时操作系统

(1)多路性:系统允许将多台终端同时连接到一台主机上,并按分时原则为每个终端分配系统资源,提高资源利用率,降低使用费用。多用户同时在各自终端上使用同一CPU。

(2)独立性:各终端之间相互独立,互不干扰,每个用户都感觉像自己独占了主机一样。

(3)及时性:用户的请求能在很短的时间内就得到系统的响应。

(4)交互性:用户可通过终端与系统进行人机对话,请求多方面的服务。

3.系统应用场景

实时操作系统

主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。例如:机器人的运动控制、无人驾驶等。

分时操作系统

现在流行的PC,服务器都是采用这种运行模式,Linux也是分时系统。

4.分时系统和实时系统的比较

多路性:两者都具有多路性。软实时与分时系统中的多路性表现为系统按分时原则为多个任务终端用户服务;硬实时则指系统周期性地对多路现场信息进行采集以及对多个对象或多个执行机构进行控制

独立性:两者都具有独立性。每个终端用户在向分时系统提出服务请求时,是彼此独立的操作,互不干扰;而在实时控制系统中信息的采集和对对象的控制,也彼此互不干扰

及时性:分时系统的及时性是以人所能接受的等待时间来确定;而实时系统的及时性则是以控制对象所要求的开始时间或截止时间来确定的,一般为秒级、百毫秒级直至毫秒级。

交互性:实时信息处理系统具有交互性,但这里人与系统的交互,仅限于访问系统中某些特定的专用服务程序。它不像分时系统那样能向终端用户提供数据处理服务、资源共享等服务

可靠性:分时系统要求系统可靠,而实时系统则要求系统高度可靠,因为任何差错都可能带来巨大的经济损失甚至无法预料的灾难性后果。因此,在实时系统中,采取了多级容错措施来保证系统的安全及数据的安全。

思维图如下:


五.批处理

批处理,也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。类似于Unix中的Shell脚本。

批处理文件,是由一条条DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。一般情况下,每条命令占据一行;当然也可以将多条命令用特定符号(如&、&&、|、||等)分隔后写入同一行中。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。 ——来自百度百科

linux下的批处理文件,基本就是shell脚本文件

下面使用前面编写的ping1.sh来举例:

#!/bin/bash

for((i=0;i<5;i++));do

{

sleep 3;echo 1>>aa && echo "done!"

}

done

cat aa|wc -l

rm aa

程序必须 #!/bin/bash 开头。符号#!用来告诉系统它后面的参数是用来执行该文件的程序。

每个命令之间用分号隔开,编写完后需要用chmod附加可执行权限

echo:打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo命令将显示当前回显设置。


六.执行时间

在进行一些性能测试的时候,我们希望能计算一个程序运行的时间,像前面linux模拟多进程并发的ping1.sh和ping2.sh一样,需要我们自己编写一个脚本来测试程序的性能,其中就出现了time命令,下面就来介绍一下time命令:

linux下time命令可以获取到一个程序的执行时间,包括程序的实际运行时间(real time),以及程序运行在用户态的时间(user time)和内核态的时间(sys time)。用法是在待执行的命令前加上time即可。

【命令】time + 执行命令

【格式】time [-p] command [arguments...]

【说明】命令行执行结束时在标准输出中打印执行该命令行的时间统计结果,其统计结果包含以下数据:

(1) 实际时间 (real time):从command命令行开始执行到运行终止的消逝时间;

(2) 用户CPU时间 (user CPU time):命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;

(3) 系统CPU时间 (system CPU time):命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和。

其中,用户CPU时间和系统CPU时间之和为CPU时间,即命令占用CPU执行的时间总和。实际时间要大于CPU时间,因为Linux是多任务操作系统,在执行一条命令时,系统往往还要处理其它任务。

注意:即使每次执行相同命令,但所花费的时间也是不一样的,其花费时间是与系统运行相关的。


七.系统和用户态时间

CPU的两个工作状态,也就是处理器的两种执行状态。

在一个系统中既有操作系统的程序,也有普通用户的程序。众多指令中,有些指令只能由系统来使用,禁止用户程序去直接访问。为了保证操作系统和各个应用程序都能够顺利运行,就必须对它们进行限制,否则就无法保证系统的安全性和稳定性。所以根据运行程序对资源和机器指令的使用权限,把处理器设置为两种不同的状态:

1.系统态(又叫管态、内核态、核心态、特权态)

系统态是操作系统的管理程序运行时的状态,它具有较高的特权级别。当处理器处于管态时,它可以执行所有的指令,包括各种特权指令,也可以使用所有的资源,并且具有改变处理器状态的能力。需要指出的是,管态和超级用户不同,前者是指CPU的状态,后者是指一种特殊的计算机用户。前者主要是从硬件的角度去执行任何指令,而后者是从软件的角度来管理系统的软硬件资源,如用户账户、权限管理、文件访问等。

2.用户态(又叫目态、普通态)

用户态是用户程序运行时的状态,它具有较低的特权级别。在这种状态下不能使用特权指令,不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间。用户态不允许程序进行处理器中要求特权态的操作,以避免操作系统崩溃。每个进程都在各自的用户空间中运行,而不允许存取其他程序的用户空间。

(archlinux下普通用户和超级用户的切换)

在内核态下CPU可执行任何指令,在用户态下CPU只能执行非特权指令。

当CPU处于内核态,可以随意进入用户态;而当CPU处于用户态时,用户从用户态切换到内核态只有在系统调用和中断两种情况下发生,一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过软中断机制进入内核态。

所以,用户CPU时间就是用户的进程获得了CPU资源以后,在用户态执行的时间;系统CPU时间就是用户进程获得了CPU资源以后,在内核态的执行时间。

用户态时间 = 运行状态下的用户空间时间

系统态时间 = 运行状态下系统空间的时间

运行时间 = 用户态时间 + 系统态时间


shell参考: http://c.biancheng.net/view/706.html

进程参考: https://blog.csdn.net/m0_37925202/article/details/78759408

并发参考: https://zhuanlan.zhihu.com/p/609327852

https://cloud.tencent.com/developer/article/1424249

模拟多进程并发参考:https://blog.csdn.net/weixin_44321600/article/details/104671385

https://blog.csdn.net/hellojoy/article/details/77340238

后台执行参考:https://blog.csdn.net/liuyanfeier/article/details/62422742

https://blog.csdn.net/xiaolong_4_2/article/details/82626808

分时和实时系统参考:https://zhuanlan.zhihu.com/p/546650761

https://www.cnblogs.com/still-smile/p/12418459.html

批处理参考:https://blog.csdn.net/chongxin1/article/details/76072567

https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600

执行时间参考:https://www.cnblogs.com/duanxz/p/4469371.html

系统和用户态时间参考:https://blog.csdn.net/weixin_43557723/article/details/109960725

https://blog.csdn.net/volkswageos/article/details/6520973

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TGRD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值