❶ 有哪些值得关注的技术博客
第一个:鸟哥的 linux 私房菜 -- 鸟哥的 Linux 私房菜 首页
博客介绍:大名鼎鼎的Linux私房菜,放在第一个位置毋庸置疑。如果你想要系统的学习Linux这儿会是你得不二选择。鸟哥是何许人也?鸟哥的 Linux 私房菜 -- 关于鸟哥
博客目录摘要(更多精彩内容请进博客):
新手建议:Linux 新鲜人必看
开始阅读之前:鸟哥这个网站的字体与风格编排之意义
网站导览:就是您目前看的这个网页
Linux 基础文件:一些很基础的文件汇整
Linux 架站文件:架站文件的汇整
Linux 安全管理:主机主体与网路安全的文件汇整H(施工中)
Apache 套件安装:关于各种 Apache 上面执行的套件的安装!
ADSL 频宽分享相关文件:主要利用不止是 Linux 的频宽分享!
第二个:Linux - 标签
博主介绍:Vamei,一名编程爱好者熟悉python/Linux/网络协议/算法/Java/数据科学系列
博客介绍:如果你正在想学习Linux,你完全没有基础,那么这个博客正适合你。通读几篇文章练习练习一些基本的命令,不要再犹豫了,马上就动手吧。
博客目录摘要:
为什么要学习Linux
Linux文件系统的实现
Linux常用命令
Linux进程间通信
Linux多线程与同步
Linux从程序到进程
Linux用户与“最小权限”原则
Linux进程关系
Linux信号基础
Linux进程基础
Linux架构 - Vamei
Linux文本流 - Vamei
Linux文件管理相关命令
Linux命令行与命令
Linux文件管理
Linux开机启动(bootstrap)
Linux简介与厂商版本
第三个:Linux大棚 – 不忘初心的技术博客,浮躁时代的安静角落
博客介绍:写了八年的博客、关于Linux关于Linux C。正如标题:不忘初心、浮躁时代的安静角落。用一个月用两个月去学习阅读一遍别人的八年、何尝不是一种享受。学习前辈的经验、学习别人总结的内容。
博客目录摘要(更多精彩内容请进博客):
《service》-“linux命令五分钟系列”之二
《命令》-linux命令五分钟系列之三
《chkconfig命令》
《uname命令》
《tr命令》-linux命令五分钟系列之六
《海量运维、运营规划之道》
你应该知道的16个Linux服务器监控命令
《ssh--id帮你建立信任》
《神探tcpmp第五招》-linux命令五分钟系列之三十九
[转]知名互联网公司系统工程师面试题
第四个:fudan_abc的Linux内核专栏
博客介绍:如果你对Linux内核以及usb比较感兴趣,这里将是你的不二选择。本专栏将Linux内核的学习分为四个层次:全面了解,掌握基本功;兴趣导向,选择重点深度钻研。还等什么,让我们一起开始Linux之旅吧!
博客目录摘要(更多精彩内容请进博客):
《Linux那些事儿之我是USB》我是U盘 -- 系列
《Linux内核修炼之道》精华分享与讨论 -- 内核系列
Linux那些事儿 -- 系列
第五个:专栏:Linux 运维
博客介绍:如果你想做运维,Linux运维的话。来这里吧,整个专栏都是关于Linux运维的内容,再不来学习就晚了。教程都在这里你还在犹豫吗?当然此博主还有另一个专栏,写的全是与Linux编程相关的内容,如果你有兴趣同样可以取访问另一个专栏,这里给上这个专栏的链接:专栏:Linux 编程
博客目录摘要(更多精彩内容请进博客):
重装Windows后修复Linux引导
Linux下top命令详解
Shell编程入门(第二版)(下)
Shell编程入门(第二版)(中)
Shell编程入门(第二版)(上)
Linux用户管理案例(第二版)
用户管理实用命令(第二版)
Linux用户管理命令(第二版)
Linux特殊权限分析(第二版)
Linux用户配置文件(第二版)
Vim/Vi实用技巧(第二版)
Vim/Vi常用操作(第二版)
GRUB与Linux系统修复(第二版)
inittab文件剖析[CentOS 5.X](第二版)
CentOS 6.X启动流程
/etc/fstab文件出错,无法进入Linux系统
Linux引导流程(第二版)
Linux备份策略(第二版)
设置磁盘配额(第二版)
/etc/fstab文件分析(第二版)
第五个:最实用的Linux博客
博客介绍:博文收集了很多关于Linux比较实用比较有意义的一些文章和教程。
博客目录摘要(更多精彩内容请进博客)(目录结构分类+文章数量):
linux安全(100)
linux客户端工具(3)
linux开发之汇编(1)
linux性能监控与调整(49)
linux服务器深度历险(电子书)(12)
linux系统管理(336)
linux网站(0)
linux网络管理(138)
第六个:依云's Blog
博
客介绍:如果大家有仔细翻阅上一篇的python篇的博客,你就会发现这一期将会有一两个博客的重复,因为我实在觉得这两者之间有种强烈的关系。博客大部
分都是关于Linux和Python方面的~看完就是感觉:哇大神。关于Linux方面的内容写的都很有深度。不是很适合新手朋友阅读。
比较适合对系统有所研究的同学。
博客关键词:Linux 、Python
博客目录摘要:
1、发包太快,请勿跟踪
2、Linux 作业控制实践
3、SIGHUP, nohup, disown 以及 expect + sudo + bash + ssh
4、当 SSD 坏掉之后
5、从 slim 到 lightdm
6、交换 ThinkPad 键盘上的 Insert 和 End 键
在上一期的评论区,大家说博客有点多不知道如何下手,今天从以前的10博客缩减到7个博客。如果有选择恐惧症,可以直接选择第一个进行学习。
(待更。。。
❷ linux运维面试常见问题
linux运维面试常见问题
这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,如下是我给大家整理的linux运维面试常见问题,希望对大家有所作用。
一、Linux操作系统知识
1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块?
2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解?
3.企业中Linux服务器系统分区标准是什么?(以硬盘为300G,内存16G为例)
4.某一天突然发现Linux系统文件只读,该怎么办呢?完整操作步骤。
5.安装一台系统使用DVD光盘安装,如何安装50台Linux系统如何安装呢?思考一下。
6.用虚拟机安装了一台Linux系统,突然想克隆一台服务器,克隆后发现无法上网,如何解决?
7.Linux网卡配置文件路径是什么?要使服务器上外网,必须满足的条件有哪些?需要配置什么?
8.一般可以使用什么软件远程linux服务器?通过什么上传文件和下载文件?
9./mnt目录主要用于什么?/root目录跟root用户有什么关系?/根目录与/boot目录有什么联系?
10.某一天误操作,执行了rm -rf * ,会有哪些情况发生?请举例。
二、Linux命令及文件操作
1.在/tmp/目录下创建test.txt文件,内容为: Hello,World! ,用一个命令写出来。
2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。
3.用vi命令编辑test.txt,如何跳转到末行,首行,行首、行末,如何在光标行下一行插入,如何复制5行,删除10行,查找jingfeng的字符、把jingfeng替换为jfe.net
4.查找linux系统下以txt结尾,30天没有修改的文件大小大于20K同时具有执行权限的文件并备份到/data/backup/目录下。
5.当前test.txt所属的用户为root,组为abc,请将test.txt使拥有者为abc,组为root,写出命令。
6.如何修改Linux启动级别为字符模式并永久生效,如何临时、永久关闭selinux及防火墙,请分别写出操作方法。
7.每次开机在/tmp目录下创建一个当天的日期文件夹(提示:当前日期表示的方法为:`date +%Y%m%d`)
8.如何查看文件内容,命令有哪些?查看文件第1行到3行,查看文件最后一行。
9.查看linux服务器IP的命令,同时只显示包含ip所在的行打印出来。
10.将普通用户test加入root组的命令是?
三、Linux磁盘及软件管理操作
1.如何添加一块新的50G硬盘到linux服务器系统作为单独的分区,并正在使用?需要哪些操作步骤?
2.有个金士顿U盘,需要往服务器/var/www/html/目录下上传一个index.html文件,如何操作并完成。
3.有一块移动硬盘,上面有300G数据,如何快速cp到linux服务器?
4.光盘里面有一个httpd-2.2.15.xx.rpm包,如何挂载并安装呢?
5.使用rpm命令安装、卸载、删除、更新ntp-0.7.12.x86_64.rpm这个软包。
6./var/www/html/是网站的发布目录,如何每天凌晨0点30对其进行自动备份,写出操作步骤?
7.使用tar命令打包并压缩/root目录,然后移动到/tmp下,将其权限设置其他人只读。
8.Yum命令与rpm命令的区别?如何使用rpm安装一个有依赖的包?
9.在这个月内,每天的早上 6 点到 12 点中,每隔 2 小时创建一个test.txt文件,内容为ok,如何实现?
10.将/usr/local/test目录下大于100K 的文件转移到/tmp 目录下。
11.简述 raid0 raid1 raid5三种工作模式的工作原理及特点。
12.如何查看占用端口 8080 的进程。
四、Linux服务配置及管理
1.请写出 apache2.X 版本的两种工作模式,以及各自工作原理。如何查看apache 当前所支持的'模块,并且查看是工作在哪种模式下?
2.Linux下nfs在客户端无法挂载,请写出排查步骤?
3.Linux下已经部署了dhcp服务器,客户端无法获取的IP,如何解决?
4.常见的FTP软件有哪些?Linux最常用的是?如何共享一个资源让他人使用用户名和密码访问?
5.如何禁止FTP使用匿名用户登录?命令行如何访问ftp服务器?
6.ApacheWEB服务器的发布目录在哪里?
7.ApacheWEB服务器有几种工作模式,每种模式的简单区别?
8.MySQL服务器的用途是?Apache和mysql可以安装在一台机器吗?如何查看apache和mysql端口和进程?
9.如何在虚拟机上面部署4个网站,访问的域名分别为www.a1.com test.a1.com www.a2.com test.a2.com?
10.假设 Apache 产生的日志文件名为access_log,在 apache 正在运行时,执行命令 mv access_log access_log.bak,执行完后,请问新的 apache的日志会打印到哪里,为什么?
11.我们都知道 FTP 协议有两种工作模式,说说它们的大概的一个工作流程?
12.Linux内核引导时,从哪个文件中读取要加载的文件系统。
13.写出下面服务的常用端口ftp http dns snmp pop3、dhcp、nfs、mysql、samba等服务。
14.Mysql创建数据库的命令,创建表的命令,插入语句的命令?
15.Mysql备份命令?Mysql如何给root用户对jfe授权访问,密码为jfe.net,请写出命令?
16.Mysql忘记密码该如何操作呢?
17.Linux运维工程师都需要具备哪些技能和职业品质?
;❸ Linux运维工程师会面试哪些
知识上面的答主说的很精准了,我来说说技巧。我本身是一名HR,负责新盟教育的Linux讲师招聘,所以我需要懂Linux基础知识,方便对面试者提问。
首先,我会就应聘者简历上填写的内容进行,提问,一般会包括拿到的证书,有无经验,熟悉的技能,然后我的同事会提问专业内容。比如你写了擅长MySQL ,Jquery,bootstrap,那么我们就会提问这些内容,当然都不会特别困难,只需要证明你确实知道,不是在吹嘘就行。
其次我们会就岗位需求进行提问,我会问到加班,出差,经验等问题,我的同事会问会不会某些特定要求的内容,比如zabbix、nagios、elk等……
如果不会,请千万不要吹牛,我们会问到说明我们肯定知道这玩意,如果吹牛肯定一眼就看出来,然后三两句话把你送走这样。
如果你一面过了,要准备二面,那么请你至少,在二面之前,把我们提到的岗位要求的内容了解一下,避免我们再次提到的时候还是不知道,这样很影响面试结果。
❹ 刚出炉的网易Linux运维面试题(附带答案)
1、Linux系统中,用户文件描述符0表示 ()。
2、Linux系统中某个可执行文件属于root并且有suid权限,当一个普通用户lutixia运行这个程序时,产生的进程的有效用户和实际用户分别是?()
3、以下哪些命令可以打印文件(access.log)中包含chrome的行到标准输出()
4、运行在多核处理器上的Linux环境中,若临界区非常短,且不允许线程上下文切换的情况下,使用下列哪种机制满足上述需求并且性能最好?()
5、具有很多C语言的功能,又称过滤器的是?()
6、在OSI模型中,HTTP协议工作在第()层,交换机工作在第()层。
7、如何获取上一条命令执行的返回码?()
8、下列关于网络编程的描述中,错误的是?()
9、当前目录下有a和b两个文件,执行命令“ls>c”,请问文件c里面的内容是什么?()
10、下面那些命令可以用来查看Linux主机的默认路由()
11、下面的内存管理模式中,会产生外零头的是()
12、vsftpd服务流量控制的参数()
13、进程之间通信都有哪些方式?()
14、在Linux上,对于多进程,子进程继承了父进程的下列哪些?()
15、关于Linux系统的负载情况,以下表述正确的是()。
欢迎 点赞 , 收藏 ,你的喜欢就是我原创的动力,运维面试,笔试题系列将会持续更新,希望对你找工作有帮助!
❺ Linux系统工程师面试题附答案
一、简答题
1.如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0:
答:# iptables -t nat -A PREROUTING -d 192.168.16.1 -p tcp --dport 80 -j DNAT --to 192.168.16.1:8080
或 者:# iptables -t nat -A PREROUTING -i eth0 -d 192.168.16.1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
2.什么是NAT,常见分为那几种,DNAT与SNAT有什么不同,应用事例有那些?
SNAT,DNAT,MASQUERADE都是NAT。
MASQUERADE是SNAT的一个特例。
SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机。
MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE。
DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B
因为,路由是按照目的地址来选择的,因此,DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,因此是在POSTROUTING链上进行的。
3.包过滤防火墙与代理应用防火墙有什么区别,能列举几种相应的产品吗?
4.iptables是否支持time时间控制用户行为,如有请写出具体操作步骤。
5.说出你知道的几种linux/unix发行版本。
Redhat、CentOS、Fedora、SuSE、Slackware、Gentoo、Debian、Ubuntu、FreeBSD、Solaris、SCO、AIX、HP…
6.列出linux常见打包工具并写相应解压缩参数(至少三种)
7.计划每星期天早8点服务器定时重启,如何实现?
8.列出作为完整邮件系统的软件,至少二类。
9,当用户在浏览器当中输入一个网站,说说计算机对dns解释经过那些流程?注:本机跟本地dns还没有缓存。
答:
a.用户输入网址到浏览器;
b.浏览器发出DNS请求信息;
c.计算机首先查询本机HOST文件,看是否存在,存在直接返回结果,不存在,继续下一步;
d.计算机按照本地DNS的顺序,向合法dns服务器查询IP结果;
e.合法dns返回dns结果给本地dns,本地dns并缓存本结果,直到TTL过期,才再次查询此结果;
f.返回IP结果给浏览器;
g.浏览器根据IP信息,获取页面;
10,我们都知道,dns既采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么时候采用udp协议?为什么要这么设计?
答:这个题需要理解的东西比较的多,分一下几个方面
a,从数据包大小上分:UDP的最大包长度是65507个字节,响应dns查询的时候数据包长度超过512个字节,而返回的只要前512个字节,这时名字 解释器通常使用TCP从发原来的请求。
b,从协议本身来分:大部分的情况下使用UDP协议,大家都知道UDP协议是一种不可靠的协议,dns不像其它的使用UDP的Internet应用 (如:TFTP,BOOTP和SNMP等),大部分集中在局域网,dns查询和响应需要经过广域网,分组丢失和往返时间的不确定性在广域网比局域网上更 大,这就要求dns客户端需要好的重传和超时算法,这时候使用TCP。
11,一个EXT3的文件分区,当使用touch test.file命令创建一个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况,说说你的理由。
答:两种情况,一种是磁盘配额问题,另外一种就是EXT3文件系统的设计不适合很多小文件跟大文件的一种文件格式,出现很多小文件时,容易导致inode 耗尽了。
12,我们都知道FTP协议有两种工作模式,说说它们的大概的一个工作流程?
FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。
服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通 知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的.FTP是指服务器被动地等待客户端连接自己的数据端口。
被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过。
因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。
13.编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
Q:主要是考察awk 这些的用法
#/bin/sh
#Programm :
# Using for move currently directory to /tmp
for FileName in `ls -l |awk ‘$5>10240 {print $9}’`
do
mv $FileName /tmp
done
ls -la /tmp
echo “Done! ”
14.apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式?
apache主要有两种工作模式:prefork(apache的默认安装模式)和worker(可以在编译的时候加参数–with-mpm- worker选择工作模式)
❻ Linux系统工程师面试题附答案(2)
Linux系统工程师面试题(附答案)
prefork的特点是:(预派生)
1.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销
2.可以防止意外的内存泄漏
3.在服务器负载下降的时候会自动减少子进程数
worker的特点是:支持混合的多线程多进程的多路处理模块
如果对于一个高流量的HTTP服务 器,worker MPM是一个比较好的选择,因为worker MPM占用的内存要比prefork要小。
15.名词解释 HDLC,VTP,OSPF,RIP,DDOS,system V,GNU,netscreen,ssh,smartd,apache,WAIT_TIME 等等。
16.编写shell脚本获取本机的网络地址。比如:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是
192.168.100.1/255.255.255.0
方法一:
#!/bin/bash
#This script print ip and network
file=”/etc/sysconfig/network-scripts/ifcfg-eth0″
if [ -f $file ] ;then
IP=`grep “IPADDR” $file|awk -F”=” ‘{ print $2 }’`
MASK=`grep “NETMASK” $file|awk -F”=” ‘{ print $2 }’`
echo “$IP/$MASK”
exit 1
fi
方法二:
#!/bin/bash
#This programm will printf ip/network
#
IP=`ifconfig eth0 |grep ‘inet ‘ |sed ‘s/^.*addr://g’|sed ‘s/ Bcast.*$//g’`
NETMASK=`ifconfig eth0 |grep ‘inet ‘|sed ‘s/^.*Mask://g’`
echo “$IP/$NETMASK”
exit
17.在命令行下发一邮件,发件人:[email protected], 收信人:[email protected]
二、简述题:
1.linux下如何改IP,主机名,DNS
2.linux下如何添加路由
3.简述linux下编译内核的意义与步骤
4.简述Linux启动过程
5.简述DDOS攻击的原理
6.简述Tcp三次握手的过程
7.简述VPN,常见有哪几种?
三、设计题:
1.系统设计
请考虑以下系统的设计. 您可以翻阅资料,查询任何您有帮助的资料、指南等。
您有的资源:
8台安装Linux (2.6内核) 的双网卡PC服务器以及相关开源软件,交换机
Apache 2.2.x
Tomcat 5.5.X
数据库系统
最多8个Internet IP地址,请您设计一个系统:
1、使用双apache web server前端;
2、采用AJP连接后段的3台Tomcat应用服务器,这些tomcat被配置成cluster, 因此需要考虑apache对后端的分配,分配采用完全平衡的方法;配置使用cookie来实现session stickness;
3、1台数据库服务器只有tomcat才需要连接,也不需要对Internet提供服务。
4、考虑系统的安全性和维护方便性;
5、通过rewrite规则配置把下属URL规则改写成友好的URL
http://server/webapp/getinfo?id=XXXX&name=YYYY –> http://server/getinfo/YYYY/XXXX
您需要提交
1、服务器规划,包括:
*网络结构图
*每台机器的IP地址分配
*每台机器上运行的关键软件
*您从安全性和维护性方面的考虑
2、Apache的以下配置文件给我们:
*extra/http-proxy-ajp.conf
*extra/http-rewrite.conf
2.你可以采取任何设备和不同操 作系统服务器设计对两台WWW服务器和两台FTP服务器做负载均衡,用网络拓扑图表示并加以说明!(方法越多越好)
第一种方法: DNS轮巡
www1 IN A 192.168.1.1
www2 IN A 192.168.1.2
www3 IN A 192.168.1.3
ftp1 IN A 192.1.1.4
ftp2 IN A 192.1.1.5
ftp3 IN A 192.1.1.6
www IN CNAME www1
www IN CNAME www2
www IN CNAME www3
ftp IN CNAME ftp1
ftp IN CNAME ftp2
ftp IN CNAME ftp3
;❼ Linux下各种锁的理解和使用及总结解决epoll惊群问题(面试常考)-
锁出现的原因
临界资源是什么: 多线程执行流所共享的资源
锁的作用是什么, 可以做原子操作, 在多线程中针对临界资源的互斥访问... 保证一个时刻只有一个线程可以持有锁对于临界资源做修改操作...
任何一个线程如果需要修改,向临界资源做写入操作都必须持有锁,没有持有锁就不能对于临界资源做写入操作.
锁 : 保证同一时刻只能有一个线程对于临界资源做写入操作 (锁地功能)
再一个直观地代码引出问题,再从指令集的角度去看问题
上述一个及其奇怪的结果,这个结果每一次运行都可能是不一样的,Why ? 按照我们本来的想法是每一个线程 + 20000000 结果肯定应该是60000000呀,可以就是达不到这个值
为何? (深入汇编指令来看) 一定将过程放置到汇编指令上去看就可以理解这个过程了.
a++; 或者 a += 1; 这些操作的汇编操作是几个步骤?
其实是三个步骤:
正常情况下,数据少,操作的线程少,问题倒是不大,想一想要是这样的情况下,操作次数大,对齐操作的线程多,有些线程从中间切入进来了,在运算之后还没写回内存就另外一个线程切入进来同时对于之前的数据进行++ 再写回内存, 啥效果,多次++ 操作之后结果确实一次加加操作后的结果。 这样的操作 (术语叫做函数的重入) 我觉得其实就是重入到了汇编指令中间了,还没将上一次运算的结果写回内存就重新对这个内存读取再运算写入,结果肯定和正常的逻辑后的结果不一样呀
来一幅图片解释一下
咋办? 其实问题很清楚,我们只需要处理的是多条汇编指令不能让它中间被插入其他的线程运算. (要想自己在执行汇编指令的时候别人不插入进来) 将多条汇编指令绑定成为一条指令不就OK了嘛。
也就是原子操作!!!
不会原子操作?操作系统给咱提供了线程的 绑定方式工具呀:mutex 互斥锁(互斥量), 自旋锁(spinlock), 读写锁(readers-writer lock) 他们也称作悲观锁. 作用都是一个样,将多个汇编指令锁成为一条原子操作 (此处的汇编指令也相当于如下的临界资源)
悲观锁:锁如其名,每次都悲观地认为其他线程也会来修改数据,进行写入操作,所以会在取数据前先加锁保护,当其他线程想要访问数据时,被阻塞挂起
乐观锁:每次取数据的时候,总是乐观地认为数据不会被其他线程修改,因此不上锁。但是在更新数据前, 会判断其他数据在更新前有没有对数据进行修改。
互斥锁
最为常见使用地锁就是互斥锁, 也称互斥量. mutex
特征,当其他线程持有互斥锁对临界资源做写入操作地时候,当前线程只能挂起等待,让出CPU,存在线程间切换工作
解释一下存在线程间切换工作 : 当线程试图去获取锁对临界资源做写入操作时候,如果锁被别的线程正在持有,该线程会保存上下文直接挂起,让出CPU,等到锁被释放出来再进行线程间切换,从新持有CPU执行写入操作
互斥锁需要进行线程间切换,相比自旋锁而言性能会差上许多,因为自旋锁不会让出CPU, 也就不需要进行线程间切换的步骤,具体原理下一点详述
加互斥量(互斥锁)确实可以达到要求,但是会发现运行时间非常的长,因为线程间不断地切换也需要时间, 线程间切换的代价比较大.
相关视频推荐
你绕不开的组件—锁,4个方面手撕锁的多种实现
“惊群”原理、锁的设计方案及绕不开的“死锁”问题
学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享
自旋锁
spinlock.自旋锁.
对比互斥量(互斥锁)而言,获取自旋锁不需要进行线程间切换,如果自旋锁正在被别的线程占用,该线程也不会放弃CPU进行挂起休眠,而是恰如其名的在哪里不断地循环地查看自旋锁保持者(持有者)是否将自旋锁资源释放出来... (自旋地原来就是如此)
口语解释自旋:持有自旋锁的线程不释放自旋锁,那也没有关系呀,我就在这里不断地一遍又一遍地查询自旋锁是否释放出来,一旦释放出来我立马就可以直接使用 (因为我并没有挂起等待,不需要像互斥锁还需要进行线程间切换,重新获取CPU,保存恢复上下文等等操作)
哪正是因为上述这些特点,线程尝试获取自旋锁,获取不到不会采取休眠挂起地方式,而是原地自旋(一遍又一遍查询自旋锁是否可以获取)效率是远高于互斥锁了. 那我们是不是所有情况都使用自旋锁就行了呢,互斥锁就可以放弃使用了吗????
解释自旋锁地弊端:如果每一个线程都仅仅只是需要短时间获取这个锁,那我自旋占据CPU等待是没啥问题地。要是线程需要长时间地使用占据(锁)。。。 会造成过多地无端占据CPU资源,俗称站着茅坑不拉屎... 但是要是仅仅是短时间地自旋,平衡CPU利用率 + 程序运行效率 (自旋锁确实是在有些时候更加合适)
自旋锁需要场景:内核可抢占或者SMP(多处理器)情况下才真正需求 (避免死锁陷入死循环,疯狂地自旋,比如递归获取自旋锁. 你获取了还要获取,但是又没法释放)
自旋锁的使用函数其实和互斥锁几乎是一摸一样地,仅仅只是需要将所有的mutex换成spin即可
仅仅只是在init存在些许不同
何为惊群,池塘一堆, 我瞄准一条插过去,但是好似所有的都像是觉着自己正在被插一样的四处逃窜。 这个就是惊群的生活一点的理解
惊群现象其实一点也不少,比如说 accept pthread_cond_broadcast 还有多个线程共享epoll监视一个listenfd 然后此刻 listenfd 说来 SYN了,放在了SYN队列中,然后完成了三次握手放在了 accept队列中了, 现在问题是这个connect我应该交付给哪一个线程处理呢.
多个epoll监视准备工作的线程 就是这群 (),然后connet就是鱼叉,这一叉下去肯定是所有的 epoll线程都会被惊醒 (多线程共享listenfd引发的epoll惊群)
同样如果将上述的多个线程换成多个进程共享监视 同一个 listenfd 就是(多进程的epoll惊群现象)
咱再画一个草图再来理解一下这个惊群:
如果是多进程道理是一样滴,仅仅只是将所有的线程换成进程就OK了
终是来到了今天的正题了: epoll惊群问题地解决上面了...
首先 先说说accept的惊群问题,没想到吧accept 平时大家写它的多线程地时候,多个线程同时accept同一个listensock地时候也是会存在惊群问题地,但是accept地惊群问题已经被Linux内核处理了: 当有新的连接进入到accept队列的时候,内核唤醒且仅唤醒一个进程来处理
但是对于epoll的惊群问题,内核却没有直接进行处理。哪既然内核没有直接帮我们处理,我们应该如何针对这种现象做出一定的措施呢?
惊群效应带来的弊端: 惊群现象会造成epoll的伪唤醒,本来epoll是阻塞挂起等待着地,这个时候因为挂起等待是不会占用CPU地。。。 但是一旦唤醒就会占用CPU去处理发生地IO事件, 但是其实是一个伪唤醒,这个就是对于线程或者进程的无效调度。然而进程或者线程地调取是需要花费代价地,需要上下文切换。需要进行进程(线程)间的不断切换... 本来多核CPU是用来支持高并发地,但是现在却被用来无效地唤醒,对于多核CPU简直就是一种浪费 (浪费系统资源) 还会影响系统的性能.
解决方式(一般是两种)
Nginx的解决方式:
加锁:惊群问题发生的前提是多个进程(线程)监听同一个套接字(listensock)上的事件,所以我们只让一个进程(线程)去处理监听套接字就可以了。
画两张图来理解一下:
上述还没有进行一个每一个进程都对应一个listensock 而是多线程共享一个listensock 运行结果如下
所有的线程同时被唤醒了,但是实际上会处理连接的仅仅只是一个线程,
咱仅仅只是将主线程做如上这样一个简单的修改,每一个线程对应一个listensock;每一个线程一个独有的监视窗口,将问题抛给内核去处理,让内核去负载均衡 : 结果如下
仅仅唤醒一个线程来进行处理连接,解决了惊群问题
本文通过介绍两种锁入手,以及为什么需要锁,锁本质就是为了保护,持有锁你就有权力有能力操作写入一定的临界保护资源,没有锁你就不行需要等待,本质其实是将多条汇编指令绑定成原子操作
然后介绍了惊群现象,通过一个巧妙地例子,扔一颗石子,只是瞄准一条鱼扔过去了,但是整池鱼都被惊醒了,
对应我们地实际问题就是, 多个线程或者进程共同监视同一个listensock。。。。然后IO连接事件到来地时候本来仅仅只是需要一个线程醒过来处理即可,但是却会使得所有地线程(进程)全部醒过来,造成不必要地进程线程间切换,多核CPU被浪费喔,系统资源被浪费
处理方式 一。 Nginx 源码加互斥锁处理。。 二。设置SO_REUSEPORT, 使得多个进程线程可以同时连接同一个port , 为每一个进程线程搞一个listensock... 将问题抛给内核去处理,让他去负载均衡地仅仅将IO连接事件分配给一个进程或线程