-
进程和线程间的通信方式
Linux进程:管道、有名管道、信号、信号量、共享内存、消息队列、套接字
Linux线程:互斥体、信号量、条件变量
Windows进程:管道、共享内存、消息队列、信号量、套接字
Windows线程:临界区、互斥量、信号量、事件 -
死锁产生的原因和死锁的条件
原因:系统资源的竞争、进程推进顺序非法
条件:互斥条件、不剥夺条件、请求和保持条件、循环等待条件 -
如何采用单线程处理高并发
采取I/O复用来提高单线程处理多请求的能力(epoll和select)
采用事件驱动模型,基于异步回调来处理事件 -
线程的状态
新建(NEW)、可运行(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、死亡(DEAD) -
进程的状态
运行状态:进程正在处理器上运行,在单处理器环境下,每一时刻最多只有一个进程处于运行状态。
就绪状态:进程已处于准备运行的状态,即进程获得了除处理器之外的一切所需要的资源,一旦得到处理器即可运行。
阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行。如等待某资源为可用(不包括处理器)或等待输入/输出完成。即使处理器空闲,该进程也不能运行。
创建状态:进程正在被创建,尚未转到就绪状态。
结束状态:进程正从系统中消失。可能是进程正常结束或其它原因中断退出运行。 -
系统调用brk和mmap
从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最高地址指针_edata往高地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。
这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。 -
进程和线程的区别
进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
-
常用的Linux命令
关机
shutdown -h now 立刻关机
shutdown -h 5 5分钟后关机
poweroff 立刻关机
重启
shutdown -r now 立刻重启
shutdown -r 5 5分钟后重启
reboot 立刻重启--help命令
shutdown --help:
ifconfig --help:查看网卡信息
man命令(命令说明书)
man shutdown
注意:man shutdown打开命令说明书之后,使用按键q退出目录切换 cd
命令:cd 目录
cd / 切换到根目录
cd /usr 切换到根目录下的usr目录
cd ../ 切换到上一级目录 或者 cd ..
cd ~ 切换到home目录
cd - 切换到上次访问的目录创建目录
命令:mkdir 目录
mkdir aaa 在当前目录下创建一个名为aaa的目录
mkdir /usr/aaa 在指定目录下创建一个名为aaa的目录删除目录或文件【删】
命令:rm [-rf] 目录删除文件:
rm 文件 删除当前目录下的文件
rm -f 文件 删除当前目录的的文件(不询问)删除目录:
rm -r aaa 递归删除当前目录下的aaa目录
rm -rf aaa 递归删除当前目录下的aaa目录(不询问)全部删除:
rm -rf * 将当前目录下的所有目录和文件全部删除
rm -rf /* 【自杀命令!慎用!慎用!慎用!】将根目录下的所有文件全部删除命令:find 目录 参数 文件名称工程管理器,顾名思义,指管理较多的文件。Make工程管理器就是个“自动化编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。Make将只编译改动的代码文件,而不用完全编译。目录修改【改】mv 和 cp
重命名目录
命令:mv 当前目录 新目录
例如:mv aaa bbb 将目录aaa改为bbb
注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行 重命名的操作剪切目录
命令:mv 目录名称 目录的新位置
示例:将/usr/tmp目录下的aaa目录剪切到 /usr目录下面 mv /usr/tmp/aaa /usr
注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作拷贝目录
命令:cp -r 目录名称 目录拷贝的目标位置 -r代表递归
示例:将/usr/tmp目录下的aaa目录复制到 /usr目录下面 cp /usr/tmp/aaa /usr
注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归搜索目录【查】
命令:find 目录 参数
示例:find /usr/tmp -name 'a*' 查找/usr/tmp目录下的所有以a开头的目录或文件 -
Makefile
Make工程管理器就是个“自动化编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。Make将只编译改动的代码文件,而不用完全编译 -
gcc/g++
用gcc和g++分别编译test.c这个c文件,发现都是可执行的,实际上对于C文件gcc和g++所做的事情确实是一样的,g++在编译C文件时调用了gcc.gcc和g++的区别主要是在对cpp文件的编译和链接过程中,因为cpp和c文件中库文件的命名方式不同,那为什么g++既可以编译C又可以编译C++呢,这时因为g++在内部做了处理,默认编译C++程序,但如果遇到C程序,它会直接调用gcc去编译.
-
gdb
GDB是Linux下非常好用且强大的调试工具。
按照自定义的方式启动运行需要调试的程序。
可以使用指定位置和条件表达式的方式来设置断点。
程序暂停时的值的监视。
动态改变程序的执行环境。GDB中的命令很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。
12.shell
shell 是一种脚本语言
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
shell命令解析器:
系统提供 shell命令解析器: sh ash bash
查看自己linux系统的默认解析:echo $SHELL
13.什么是虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为「连续的虚拟内存地址」,以借此「欺骗」程序,使它们以为自己正在使用一大块的「连续」地址。
也就是说虚拟内存能提供一大块连续的地址空间,对程序来说它是连续的,完整的,实际上虚拟内存是映射在多个物理内存碎片上,还有部分映射到了外部磁盘存储器上。虚拟内存有以下两个优点:
1.虚拟内存地址空间是连续的,没有碎片
2.虚拟内存的最大空间就是cup的最大寻址空间,不受内存大小的限制,能提供比内存更大的地址空间
14.说说三种内存管理机制
页式管理:页号+页内偏移,通过页号找到块号,通过块号,算出块的起始地址,最后块的起始地址+页内偏移
段式管理:段号+段内偏移 通过段号找到段的起始地址,然后段的起始地址+段内偏移
分段分页管理:段号+页号+页内偏移 先通过段号找到页的起始地址,通过页表当中的页号找到对应的块号,再通过块号计算出起始地址,块的起始地址+页内偏移
15.大端和小端,用C++代码怎么确定
大端低地址存放高位,高地址存放地位。小端相反。