补充知识
一个完整的Linux系统包括哪些东西?
1.内核(kernel):操作系统最核心的软件,和硬件打交道
2.系统调用(system call):是内核给外面的应用程序的接口,例如:fork(),kill()
3.应用程序:实现具体的某个功能的程序,例如:mkdir
4.shell解释器:是一个程序,给命令行操作使用的
5.库函数:是实现某个功能的程序,可以被其他的程序调用,这些库都是公开的,大家都可以去调用
内核(kernel):操作系统最核心的软件,和硬件打交道,也是一个程序--》linus。
作用:
1.对cpu进行调度管理
2.对内存进行分配
3.对进程进行管理(创建、调度、销毁)
4.对磁盘里的文件系统进行管理
5.对网络以及其他的硬件进行管理
硬件:
cpu:中央处理器用来计算使用。
内存:存放运行的程序的数据(停电会丢失数据) --》存放数据的地方。
磁盘:存放不运行的程序的数据(图片、程序代码、视频)。
网卡:网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。
声卡 (Sound Card):也叫音频卡(港台称之为声效卡),是计算机多媒体系统中最基本的组成部分,是实现声波/数字信号相互转换的一种硬件。
进程:正在内存里运行的程序。
进程由哪些组成?
1.PCB 进程控制块 process control block:pid、状态、位置等
2.code 程序代码
3.data 进程产生的数据
pid (process id) : 进程的编号。
fd(file descriptor 文件描述符 ):是进程里打开哪些文件,给文件的一个编号。
一个进程打开了100个文件,这个进程对这个100个文件进行编号,每个文件的编号就是一个文件描述符。
系统为每一个进程维护了一个文件描述符
文件描述符是非负整数 --》0,1,2,3,N
默认情况下内核允许一个进程最多可以打开1024个文件
内核给每个进程背后都创建了一个文件描述符表,此表里记录了这个进程打开的所以文件
文件描述符表:id,文件指针:里面存放的是一个文件的地址
# 查看一个进程可以打开的文件数量
[root@sc pts]# ulimit -n
1024
[root@sc pts]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7183
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7183
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
# 临时修改内核里允许一个进程可以打开的文件数量
[root@ansible_nfs proc]# ulimit -n 1000000
一个进程里可以产生很多的线程;可以把线程当作一个进程。
cpu进行调度的时候是根据线程:
1个进程里只有1个线程
1个进程里有100个线程
线程可以节约资源:内存,cpu的调度(上下文切换的速度)。
解释器:将人输入的命令解释给Linux系统听,本身也是一个程序。
1.语法分析
2.查看命令存放的位置
3.告诉内核去运行程序
shell
定义
解释器:shell解释器 --》bash
[root@jack 8-20]# echo $SHELL
/bin/bash
xshell背后的终端运行的就是bash--》就是一个解释器。
内部命令:安装好bash就有的。
外部命令:需要额外安装的,bash里没有的。
脚本:里面存放的是需要执行的Linux命令。
shell脚本:就是一个程序,里面可以执行很多的Linux命令--》批量完成很多需要单个输入的Linux命令。
使用脚本的好处:快速完成很多重复事情,节约时间和精力。
编写脚本
[root@jack test]# vim mkdir100.sh
[root@jack test]# cat mkdir100.sh
#!/bin/bash # --》声明我们的这个脚本使用/bin/bash这个解释器去执行
for i in {1..100}
do
mkdir tangyuhao$i
done
# for 循环 i是变量
# in 去哪里
# {1..100} 代表1到100的数字--》表示一个集合
# 当集合里的内容被取完的时候,for循环就结束了
# do 做事情
# done 做完了
# 按照shell编程的规矩来写就是语法
执行脚本
[root@jack test]# bash mkdir100.sh
*是通配符,代表任意字符。
? 代表一个任意字符。
删除所有以tangyuhao开头的文件,不管后面是什么。
[root@sc test]# rm -rf tangyuhao*
定义变量
[root@jack ~]# city=changsha # 定义变量city赋值changsha
[root@jack ~]# echo $city # 输出变量的值
changsha
[root@jack ~]# unset city # 取消定义变量city
[root@jack ~]# echo $city # 变量被取消后,会是空值 -->没有内容、不会报错
命令替换
var=$(命令)
[root@aliyun ~]# echo $(seq 5)
1 2 3 4 5
单引号和双引号的区别
1.单引号:所见即所得
2.双引号:可以引用变量,某些特殊的字符有特殊作用
元字符
有特殊作用的字符: $ ! * ? ~
[root@sc read]# name="he"
[root@sc read]# echo '$name'
$name
[root@sc read]# echo "$name"
he
为什么xshell连接不上?
Connecting to 192.168.0.185:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
解决:关闭防火墙
[root@jack 8-20]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
c语言的简单使用
[root@sc test]# vim hello.c
[root@sc test]# cat hello.c
#include<stdio.h> //导入头函数
int main() //声明一个main函数
{
printf("hello,world\n"); //输出hello,world
return 0;
}
c语言是高级语言--》给人看的。
机器只能识别二进制
0101
编译:按照某种编码将人能识别的程序翻译成机器能识别的程序的过程。
gcc 是一个Linux下的编译器。
安装gcc工具
[root@sc test]# yum install gcc -y
将hello.c文件编译成hello程序
[root@sc test]# gcc -o hello hello.c
[root@sc test]# ls
hello hello.c
运行当前目录下的hello
[root@sc test]# ./hello
hello,world