Linux 概述
OSI (Open Source Initiative,开放源代码促进会)
定义:基于社区开发的、非私有的代码,可令成本更低、开发效率更高、商业应用更加灵活。
Linux版本两种表现形式
- 内核(Kernel)版,
- 发行(Distribution)版 。
版本号规定:版本号为偶数的是稳定版本,为奇数的是发展版本。
常见发行版本
- Ubuntu
- CentOS
- Fedora core
- Red Hat
Linux系统结构
- /bin:常用系统程序目录。
- /boot:开机设定目录,也是摆放核心vmlinuz的地方。
- /dev:摆放系统设备装置文件的目录。
- /etc:系统配置文件,尤其是passwd、shadow文件。
- /etc/rc.d/init.d:系统开机的时候载入服务的scripts的摆放地点。
- /home:系统使用者的目录。
- /lib:Linux执行或编译程序函数库目录。
- /mnt:软驱与光驱接入挂载的地方
- /proc:系统核心与执行程序的一些信息
- /root:系统管理员的目录
- /tmp:临时文件目录
- /usr/bin、/bin:一般执行文件摆放的地方。
- /usr/sbin、/sbin:系统管理员常用指令集。
- /var:摆放系统日志文件的地方。
- /lost+fount:摆放系统不正常产生错误时遗失的片段。
版本号为偶数的是稳定版本,为奇数的是发展版本。
程序扩展名
- .c —c语言源程序
- .C .cc .cxx —c++语言源程序
- .s .S —汇编语言源程序
- .h —头文件
- .o —目标文件(可执行文件)
- .a .so .sa —库文件
GCC 命令
- -c 编译成目标(.o)文件
- -l 库文件名 连接库文件 EG: -lphtread
- -o 文件名 将生成的可执行文件保存到指定文件中,默认是a.out
- 一般使用:gcc -o name name.c
- 如果使用 gcc name.c 会生成 a.out
- 加载其他地方的头文件 gcc –I /usr/openwin/include power.c
exec 函数
- 当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。
- 调用exec并不创建新进程,所以前后的进程PID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
管道通信
管道是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称为pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),而接收管道输出的接收进程(即读进程)可从管道中接收数据。管道通信是基于文件系统形式的一种通信方式。
Pthreads数据类型
- pthread_t 线程ID
- pthread_mutex_t 互斥锁对象
- pthread_cond_t 条件变量
POSIX 线程库
- pthread_create():创建线程函数;
- pthread_create(&tid,NULL,runner,argv[1]);
- pthread_exit():主动退出线程;
- 执行成功则返回0,失败返回-1,而错误号保存在全局变量errno中。
- 主线程中使用pthread_exit只会使主线程自身退出,产生的子线程继续执行;用
return则所有线程退出。子线程或主线程使用exit,则整个线程全部终止。 - pthread_exit(NULL);
- pthread_join():用于将当前线程挂起来等待线程的结束。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。
- pthread_join(tid1, NULL);
- pthread_cancel():终止另一个线程的执行。
互斥锁
pthread_mutex_t
- 互斥锁初始化:pthread_mutex_init()
- pthread_mutex_init (&mutex, NULL);
- 互斥锁上锁:pthread_mutex_lock()
- 互斥锁解锁:pthread_mutex_unlock()
- 消除互斥锁:pthread_mutex_destroy()
条件变量 Condition
pthread_cond_t
- pthread_cond_init 初始化一个条件变量
- pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
- pthred_cond_wait 调用的线程阻塞直到条件变量收到信号
- pthread_cond_wait(&cond, &mutex);
- pthread_cond_signal 向一个条件变量发送信号
- pthread_cond_broadcast 将所有等待该条件变量的线程解锁
Linux 内核模块
动态可加载内核模块(Loadable Kernel Module LKM)
模块在内核模式运行,实际上是一种目标对象文件,没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能。
insmod 安装模块
- 调用init_module()
lsmod 查看模块
rmmod 卸载模块
- 自动运行在cleanup_module()函数中定义的过程。
查看printk信息
- cat /var/log/syslog 或 dmesg | tail -5
ksyms
- 显示内核符号和模块符号表的信息。
- cat /proc/kallsyms
Linux 内核
内核子系统
- 系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。它实现了一些基本的功能,例如 read 和 write。
- 进程调度:控制着进程对CPU的访问。
- 内存管理:允许多个进程安全地共享内存区域
- 虚拟文件系统(VFS):隐藏各种不同硬件的具体细节,为所有设备提供统一的接口。
- 网络:提供了对各种网络标准协议的存取和各种网络硬件的支持。
- 进程间通信(IPC):支持进程间各种通信机制,包括共享内存、消息队列及管道等。
Linux 指令
ls 显示指定目录、文件
- -a 列出目录下文件
- -d 显示目录
- -i 显示索引节点
- -l 列出详细信息
cat 显示指定文件
- -n 编号行数
tail 显示文件的后 N 行,默认是后 10 行。
- -c 后多少字节
- -n 后多少行
- -f 动态显示文件末N行。
mkdir 创建目录 / rmdir 删除空目录
touch 创建文件
rm 删除文件 -r 删除目录及下文件
cd 打开目录 ~主目录/.当前目录/..当前父目录
pwd 显示当前用户的工作目录
cp 源文件 目标文件
ln 为源文件创建一个链接,但不复制源文件。
硬链接(hard link):给文件一个副本(别名),同时建立两者之间的连接关系,修改其中一个,与其连接的文件同时被修改,如果删除其中一个,其余的文件不受影响。磁盘上只有一份数据。硬链接是存在同一个文件系统中。
软链接(symbolic link):(符号链接相当于软链接,即快捷方式)软链接的方式产生一个快捷方式,删除了软文件这个链接文件就没用了。
chmod 命令修改权限 chmod 777 filename
tar 命令打包
- -c 创建打包 / -z 解压 / -x 解除打包文件的内容 / -v 详细报告 / -f 使用打包文件或设备,一般必选
- eg:打包压缩 tar -zcvf / 解压还原 tar -zxvf
mount 挂载 / umount 卸载
df 查看磁盘使用情况 -h
mkfs 格式化磁盘
ping、traceroute、route
关机:shutdown -h now; halt; poweroff; init 0
重新启动:shutdown -r now; reboot; init 6
strace 命令可以查看操作系统命令所调用的系统调用,如 strace ls
inode
文件控制信息单独组成一个称为inode (索引节点,一个数 据结构)。每个文件对应一个inode,它们有唯一的编号,称为inode号(索引节 点号,一个整型值)。
文件系统类型:FAT、NTFS、Ext2、Ext3、Ext4、Iso9660
休眠状态不是 Linux进程的状态。
Linux 在进行虚拟地址转换时采用的是二级页表。
网络设备没有inode节点。
Linux把文件分为普通文件、目录文件、特别文件三类。
页表不必全部在内存,可以不占用连续的内存空间。
进程描述符就是进程控制块。
并行工作进程个数 NR_TASKS 通常为 512。
设备驱动器:Linux利用控制寄存器来控制硬设备完成输入输出的软件。
Linux把外部设备划分为块设备、字符设备和网络设备,IDE硬盘属于块设备。
less可以逐页显示文件内容。
守护进程daemon:负责文件在网络环境中的共享,负责打印子系统,管理Internet应用服务,常驻后台。
export命令为后续应用程序设置环境变量。
umask为022,则文本权限为rw-r–r–
安装所有在 /etc/fstab 中定义文件系统用 mount -a
Linux 用 /dev/hdb2 标识在 IDE0 上的 slave 硬盘的第二个扩展分区。
file chapter[12689].eps
bush shell set 显示环境变量和它们当前设置的列表
0标准输入1标准输出2标准错误输出
grep 筛出指定字符串、文件
默认文件系统ext4
init进程的PID为1
设置shell #!/bin/bash
U盘挂载 mount -t vfat /dev/sdb /mnt/usb
head -n 20 textfile | tail 显示中间10行
ln -s ./linux-2.6.36/ /usr/src/linux
magic number 唯一表示该文件系统的id
CPU调度算法SJF没有在LINUX的2.6版本中使用。
指定文件目录位置又叫加载点。
内核可执行文件需要安装在/boot才起作用。
Linux使用请求页式存储管理。
bzImage 在arch/i386/boot 文件夹。
struct *mm 指向用户进程虚拟地址信息的域。
struct file是描述 VFS 的一个文件对象。
Linux使用了 struct page、Buddy算法、Slab技术管理物理空间。
fork->sys_fork->do_fork
休眠状态不是Linux进程的状态
man 2 查看系统调用
SCHED_RR 适合于运行时间长的实时进程
proc只在内核运行时存在
VFS的目录项是 struct dentry
超级块在文件系统中储存在多个地方
if = f1 以f1作为源文件,代替标准输入。
read调用内核函数 sys_read
页目录表地址存放在CR3寄存器。
ext2对磁盘空闲空间采用位图法。
slab分配器的主要目的:为申请不足一页帧的小对象申请与释放物理内存,以减少碎片。
Linux的页置换策略是LRU。
0 条评论