Linux相关知识练习
每日几题:
1. 基础命令
telnet curl wget分别可以测试哪些协议的应用的连通性?free 命令各项指标的意义和联系,怎么样释放cache?
命令 | 协议 |
---|---|
telnet | tcp/ip,telnet就是查看某个端口是否可访问 |
curl | http,Curl命令在linux操作系统中经常来测试网络和url的联通性,模拟正常的网络访问。支持HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件等功能 |
wget | tcp/ip wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理 |
free 命令相对于top 提供了更简洁的查看系统内存使用情况
buffer 与cache 的区别
两者都是==RAM==中的数据。简单来说,buffer是即将要被写入磁盘的,cache是被从磁盘中读出来的。
buffer是用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
cache经常被用在磁盘的I/O请求上, 如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
手动释放缓存
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。
也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:
/proc/sys/vm/drop_caches的值,默认为0
手动执行sync命令
(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
只是清理page cache
#> sync; echo 1 > /proc/sys/vm/drop_caches
清理dentries and inodes
#> sync; echo 2 > /proc/sys/vm/drop_caches
#> sync; echo 2 > /proc/sys/vm/drop_caches
清理PageCache, dentries and inodes
#> sync; echo 3 > /proc/sys/vm/drop_caches
特别注意: 在生产系统中,强烈建议不要使用echo 3 > /proc/sys/vm/drop_caches, 而是使用echo 1 > /proc/sys/vm/drop_caches。 echo 3 > /proc/sys/vm/drop_caches 可能造成运行系统的异常。
2. 脚本题
请写一个脚本,实现以下功能。输入一个字符串,判断这个字符串是不是一个ip,如果是请输出是A类,B类,还是C类,并将ip追加到一个ip_check_result.txt;如果不是请输出不是ip。
#! /bin/bash
read -p "please input a ipaddress: " ipadd
var1=`echo $ipadd | awk -F'.' '{print $1}'`
var2=`echo $ipadd | awk -F'.' '{print $2}'`
var3=`echo $ipadd | awk -F'.' '{print $3}'`
var4=`echo $ipadd | awk -F'.' '{print $4}'`
for i in $var1 $var2 $var3 $var4
do
if [[ $i -lt 0 ]] || [[ $i -gt 255 ]] || [[ $i -eq null ]];then
echo "The string $ipadd is a wrong ip!" && exit 0
fi
done
if [[ $var1 -gt 0 ]] && [[ $var1 -le 127 ]];then
echo "Class A: $ipadd" && echo "Class A: $ipadd">>ip_check_result.txt
elif [[ $var1 -ge 128 ]] && [[ $var1 -lt 192 ]];then
echo "Class B: $ipadd"&& echo "Class B: $ipadd" >>ip_check_result.txt
elif [[ $var1 -ge 192 ]] && [[ $var1 -lt 224 ]];then
echo "Class C: $ipadd" && echo "Class C: $ipadd">>ip_check_result.txt
fi
3. 概念题
进程和线程的区别,多进程之间通信方式,多进程和多线程应用的特点和优劣。
进程和线程的区别:
线程与进程的区别可以归纳为以下4点:
地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
调度和切换:线程上下文切换比进程上下文切换要快得多。
在多线程操作系统中,进程不是一个可执行的实体。
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。
一、管道
管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。
1、特点:
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
二、FIFO
FIFO,也称为命名管道,它是一种文件类型。
1、特点
FIFO可以在无关的进程之间交换数据,与无名管道不同。
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
三、消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
1、特点
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
四、信号量
信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
1、特点
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
支持信号量组。
五、共享内存
共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。
1、特点
共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
因为多个进程可以同时操作,所以需要进行同步。
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
五种通讯方式总结
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
多进程和多线程应用的特点和优劣:
方面 | 多进程 | 多线程 |
---|---|---|
数据共享 | 数据私有,每个进程独立占有 | 共享进程的数据 |
内存 CPU | 占用内存多,cpu使用率较低 | 占用内存少,cpu使用率较高 |
可靠性 | 进程间资源隔离,是私有的,所以可靠性高 | 在进程内运行,一个异常会导致整个进程异常 |