java基础,多线程、并发、数据结构、再者数据库mysql的一些,索引、存储引擎、查询优化等,还有分布式、消息、jvm、java内存模型
线程与进程的区别联系
- 系统中能独立运行并作为资源分配的基本单位,由一组机器指令、数据和堆栈组成。是系统进行独立调度和分派的一个基本单位。有了线程后--线程作为调度和分派的基本单位,因而线程是能独立运行的基本单位。
- 由程序段,相关的数据段,和PCB三部分构成进程实体 == 进程,创建进程就是创建PCB(保证进程的独立运行)。
- 用户级线程和内核线程无关,线程切换也不需要切换到内核空间。
- 一个程序至少有一个进程,一个进程至少有一个线程.
(1)线程是进程的一个实体,一个进程可以拥有多个线程,多个线程也可以并发执行。一个没有线程的进程也可以看做是单线程的,同样线程也经常被看做是一种轻量级的进程。并且进程可以不依赖于线程而单独存在,而线程则不然。
(2)进程是并发程序在一个数据集合上的一次执行过程,进程是系统进行资源分配和调度的独立单位,线程是进程的实体,它是比进程更小的能够独立执行的基本单元,线程自己不拥有任何系统资源,但是它可以访问其隶属进程的全部资源。
(3)与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表少得多。
进程的作用与定义:是为了提高CPU的执行效率,为了避免因等待而造成CPU空转以及其他计算机硬件资源的浪费而提出来的。
线程的引入:例如,有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进 程的方式来进行处理,但是创建一个进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换 是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了"线程(thread)"的概念。
并行和并发
在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行, 但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。
倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。
并发是一种现象:同时运行多个程序或多个任务需要被处理的现象
这些任务可能是并行执行的,也可能是串行执行的,和CPU核心数无关,是操作系统进程调度和CPU上下文切换达到的结果 解决大并发的一个思路是将大任务分解成多个小任务:
进程通信方式有哪些?
1. 共享存储器系统/共享内存
共享内存,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写;
2. 管道通信系统
又叫做pipe文件 命名管道和非命名管道之分, 非命名管道 : 只能用于父子进程通讯。 命名管道 : 可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式。FIFO是一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个 FIFO,因此也成为命名管道。
3. 消息传递系统
3.1. 直接通信方式
发送进程利用OS提供的通信原语,直接把消息发给目标进程。
send(receiver, message);
receive(sender, message);
3.2. 间接通信方式/消息队列/信箱通信
发送和接收进程:利用共享中间实体/消息队列进行消息发送和接收。
信箱通信原语
send(mailbox, message);
receive(mailibox, message);
4. 客户机-服务器系统
4.1. 套接字
网络通信程序接口之一,对TCP/UDP的封装。
4.2. 远程过程调用和远程方法调用/RPC
RPC,是一个通信协议,一台主机上的系统调用另一台主机上的系统。
5. 信号量
不能传递复杂消息,只能用来同步
几种方式的比较:
管道:速度慢,容量有限
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
信号量:不能传递复杂消息,只能用来同步
共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。
几种线程间的通信机制
1、锁机制
1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。
1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥。
1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁 的保护下进行的。条件变量始终与互斥锁一起使用。
2、信号量机制:包括无名线程信号量与有名线程信号量
3、信号机制:类似于进程间的信号处理。
线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。
线程是否具有相同的堆栈
每个线程有自己的堆栈。局部变量,计数器等等
同步的方式有哪些?
概念
- 临界资源 :必须互斥访问的资源。
- 临界区:在每个进程中访问临界资源的那段代码。
1. 硬件同步机制
利用锁。 关中断,Test And Set指令(一条原语),Swap指令
2. 信号量机制
-
整形信号量
-
记录性信号量:避免了忙等,如果s.value < 0,则自我阻塞,放弃处理机,插入等待链表中。
当s.value = 1;表示只允许一个进程访问临界资源,此时信号量转换为互斥信号量,用于进程互斥。
-
AND型信号量 一个进程需要2个以上共享资源。一次性全部分给进程。
-
信号量集 对进程信号量Si测试不再是1,而是资源分配下限值,要求Si >= Ti ;
3. 管程机制
定义了一个数据结构和能为并发进程所执行的一组操作。就是方便管理。不会让大量的同步操作分布在各个进程中
ThreadLocal与其它同步机制的比较
Threadlocal就从另一个角度来解决多线程的并发访问,Threadlocal会为每一个线程维护一个和该线程绑定的变量副本,从而隔离了多个线程的数据共享,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
如果你需要进行多个线程之间进行通信,则使用同步机制; 如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal。
进程死锁的条件
-
互斥条件:资源只能由一个进程使用。其他只能等待
-
保持和再请求条件
-
不可抢占条件
-
循环等待条件 存在进程--资源循环链
处理死锁的方法
(1)预防死锁 (2)避免死锁 (3)检测死锁 (4)解除死锁
预防死锁 怎么破坏这四个条件 2. 保持和再请求条件:一次性给完 3. 不可抢占条件:一般不破坏 4. 循环等待条件:对资源排号(从小到大),必须按顺序请求资源。
避免死锁 银行家算法
- 可利用资源向量Available
- 最大需求矩阵
- 分配矩阵
检测死锁 看图,满足一个进程之后如果存在环,则死锁。
解除死锁 (1)抢占资源 (2)撤销进程
内存碎片,有什么解决办法
内存碎片分为:内部碎片和外部碎片。
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
使用伙伴系统算法,解决了外碎片,但有了内碎片。
socket编程的三种通信模型,BIO,NIO,AIO
阻塞,非阻塞,io多路复用,epoll支持文件符数目没有限制,fd集合只会从用户进程拷贝到内核一次,自己维护一个事件队列,不用每次遍历fd集合发现是否有就绪状态。
解释一下P操作与V操作。
P就是请求资源,V就是释放资源
什么是中断?中断时CPU做什么工作?
CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
分段和分页
-
页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。
-
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
局部性原理
时间局限性 空间局限性
作业调度和进程调度
作业调度:从后备队列中按照一定的算法选择出若干个作业,将作业调入内存,给他们建立进程,成为就绪进程,插入就绪队列 进程调度:从进程的就绪队列中按照一定的算法选出一个进程将处理机分配给它。
进程调度机制
- 机制
- 排队器,就绪进程排成一个队列
- 分派器,选出一个进程去切换。
- 上下文切换器。
- 方式
- 非抢占方式,进程执行不因中断啥的停止,自己停止
- 抢占方式,防止一个进程长时间占用处理机。
- 算法
- 轮转调度算法,按FCFS排成就绪队列,每隔固定时间切换
- 优先级调度,抢占和非抢占。
- 多级队列调度,实现不同的调度算法
- 多级反馈队列,从上到下时间变长,每个队列FCFS。从上往下调度。
页面置换算法&作业调度算法
置换算法 最佳置换算法,未来最久不被访问 先进先出, LRU:这个点以前最久未使用和最少使用 Clock置换算法/改进型 进程调度 先来先服务 短作业优先 优先级调度 高响应比优先
常见组织方式
连续组织 链接组织 索引组织
CPU在上电后,进入操作系统的main()之前必须做什么?
加电后,会触发CPU的reset信号,导致CPU复位,然后CPU会跳到 (arm下0x00000000,x86下0xfffffff0) 执行指令, 主要是做CPU初始化,确定CPU的工作模式,mmu初始化。建立页表段表,初始化中孤单控制器和中断向量表,初始化输入和输出,初始化 nandflash,把OS的TEXT区加载到sdram,然后跳转到sdram的main()
简术OSI的物理层Layer1,链路层Layer2,网络层Layer3的任务。
网络层:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
你知道操作系统的内容分为几块吗?什么叫做虚拟内存?他和主存的关系如何?内存管理属于操作系统的内容吗?
-
操作系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。
-
虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为4K,物理内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。
-
页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总和。
用户态和内核态的区别
内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。
用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。
为什么要有用户态和内核态?
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态和内核态。
用户态切换到内核态的3种方式 a. 系统调用 b. 异常,比如缺页异常。 c. 外围设备的中断 系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
makefile文件的作用是什么?
makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个 make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具。
SSH协议
使用SSH可以在本地主机和远程服务器之间进行加密地传输数据,实现数据的安全。而OpenSSH是SSH协议的免费开源实现,它采用安全、加密的网络连接工具代替了telnet、ftp等古老明文传输工具。
SSH(Secure Shell)是建立在应用层和传输层基础上的安全协议。
SSH是由服务端和客户端的软件组成,服务端是一个守护进程,它在后台运行并响应来自客户端的连接请求。
SSH的工作机制大体是:本地客户端发送一个连接请求到远程的服务端,服务端检查申请的包和IP地址再发送密钥给SSH客户端,本地再将密钥发回给服务端,到此为止,连接建立。
UNIX显示文件夹中文件名的命令是什么?能使文件内容显示在屏幕的命令是什么?
ls ,cat
Linux文件属性有哪些?(共十位)
-rw-r--r-- 那个是权限符号,总共是 - --- --- --- 这几个位。
第一个短横处是文件类型识别符:
- 表示普通文件;
c 表示字符设备(character);
b 表示块设备(block);
d 表示目录(directory);
l 表示链接文件(link);
后面第一个三个连续的短横是用户权限位(User),
第二个三个连续短横是组权限位(Group),
第三个三个连续短横是其他权限位(Other)。
每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。
如果每个权限位都有权限存在,那么满权限的情况就是:-rwxrwxrwx;
权限为空的情况就是- --- --- ---。
chmod u+rw aaa (给用户权限位设置读写权限,其权限表示为:- rw- --- ---)
chmod g+r aaa (给组设置权限为可读,其权限表示为:- --- r-- ---)
chmod ugo+rw aaa (给用户,组,其它用户或组设置权限为读写,
权限表示为:- rw- rw- rw-)
chmod u-x aaa(去掉用户可执行权限,权限表示为:- rw- rwx rwx)
Linux中常用到的命令
根据端口号查看进程:lsof -i:80
top动态显示进程
查看进程PID :ps -aux | grep ***
杀死进程 :kill -9 pid,-9 表示强制终止
显示文件目录命令 : ls
改变当前目录命令 : cd 如cd / /home
建立子目录 : mkdir mkdir xiong
删除子目录命令 : rmdir 如 rmdir /mnt/cdrom
删除文件命令rm : 如 rm /ucdos.bat
文件复制命令cp : 如 cp /ucdos/* /fox
获取帮助信息命令man : 如 man ls
显示文件的内容less : 如 less mwm.lx
重定向与管道type 如type readme>>direct,将文件readme的内容追加到文件direct中
查找关键字 :grep 'word' filename
head -n 1000:显示前面1000行
tail -n 1000:显示最后1000行
在/home目录下查找以.txt结尾的文件名:find /home -name "*.txt"
强制删除目录以及目录里的东西
rm -rf dirname
rm [选项] 文件
-f -force 忽略不存在的文件,强制删除,无任何提示
-i --interactive 进行交互式地删除
-r | -R --recursive 递归式地删除列出的目录下的所有目录和文件
-v --verbose 详细显示进行的步骤
4.1 目录切换命令
cd usr: 切换到该目录下usr目录cd ..(或cd../): 切换到上一层目录cd /: 切换到系统根目录cd ~: 切换到用户主目录cd -: 切换到上一个操作所在目录
4.2 目录的操作命令(增删改查)
-
mkdir 目录名称: 增加目录 -
ls或者ll(ll是ls -l的别名,ll命令可以看到该目录下的所有目录和文件的详细信息):查看目录信息 -
find 目录 参数: 寻找目录(查)示例:
- 列出当前目录及子目录下所有文件和文件夹:
find . - 在
/home目录下查找以.txt结尾的文件名:find /home -name "*.txt" - 同上,但忽略大小写:
find /home -iname "*.txt" - 当前目录及子目录下查找所有以.txt和.pdf结尾的文件:
find . \( -name "*.txt" -o -name "*.pdf" \)或find . -name "*.txt" -o -name "*.pdf"
- 列出当前目录及子目录下所有文件和文件夹:
-
mv 目录名称 新目录名称: 修改目录的名称(改)注意:mv的语法不仅可以对目录进行重命名而且也可以对各种文件,压缩包等进行 重命名的操作。mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。后面会介绍到mv命令的另一个用法。
-
mv 目录名称 目录的新位置: 移动目录的位置---剪切(改)注意:mv语法不仅可以对目录进行剪切操作,对文件和压缩包等都可执行剪切操作。另外mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。
-
cp -r 目录名称 目录拷贝的目标位置: 拷贝目录(改),-r代表递归拷贝注意:cp命令不仅可以拷贝目录还可以拷贝文件,压缩包等,拷贝文件和压缩包时不 用写-r递归
-
rm [-rf] 目录: 删除目录(删)注意:rm不仅可以删除目录,也可以删除其他文件或压缩包,为了增强大家的记忆, 无论删除任何目录或文件,都直接使用
rm -rf目录/文件/压缩包
4.3 文件的操作命令(增删改查)
-
touch 文件名称: 文件的创建(增) -
cat/more/less/tail 文件名称文件的查看(查)cat: 查看显示文件内容more: 可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看less: 可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看tail-10: 查看文件的后10行,Ctrl+C结束
注意:命令 tail -f 文件 可以对某个文件进行动态监控,例如tomcat的日志文件, 会随着程序的运行,日志会变化,可以使用tail -f catalina-2016-11-11.log 监控 文 件的变化
-
vim 文件: 修改文件的内容(改)vim编辑器是Linux中的强大组件,是vi编辑器的加强版,vim编辑器的命令和快捷方式有很多,但此处不一一阐述,大家也无需研究的很透彻,使用vim编辑修改文件的方式基本会使用就可以了。
在实际开发中,使用vim编辑器主要作用就是修改配置文件,下面是一般步骤:
vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q! (输入wq代表写入内容并退出,即保存;输入q!代表强制退出不保存。)
-
rm -rf 文件: 删除文件(删)同目录删除:熟记
rm -rf文件 即可
4.4 压缩文件的操作命令
1)打包并压缩文件:
Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。
而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。
命令:tar -zcvf 打包压缩后的文件名 要打包压缩的文件
其中:
z:调用gzip压缩命令进行压缩
c:打包文件
v:显示运行过程
f:指定文件名
比如:假如test目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我们要打包test目录并指定压缩后的压缩包名称为test.tar.gz可以使用命令:tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt或:tar -zcvf test.tar.gz /test/
2)解压压缩包:
命令:tar [-xvf] 压缩文件
其中:x:代表解压
示例:
1 将/test下的test.tar.gz解压到当前目录下可以使用命令:tar -xvf test.tar.gz
2 将/test下的test.tar.gz解压到根目录/usr下:tar -xvf test.tar.gz -C /usr(- C代表指定解压的位置)
1、查看日志 前 n行:
cat 文件名 | head -n 数量
demo:
cat test.log | head -n 200 # 查看test.log前200行
2、查看日志 尾 n行:
cat 文件名 | tail -n 数量
demo:
cat test.log | tail -n 200 # 查看test.log倒数200行
3、根据 关键词 查看日志 并返回关键词所在行:
方法一:cat 路径/文件名 | grep 关键词
demo:
cat test.log | grep "http" # 返回test.log中包含http的所有行
方法二:grep -i 关键词 路径/文件名 (与方法一效果相同,不同写法而已)
demo:
grep -i "http" ./test.log # 返回test.log中包含http的所有行(-i忽略大小写) www.cnblogs.com/television/…