Linux编程的几个重要知识点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux编程的几个重要知识点相关的知识,希望对你有一定的参考价值。

第一阶段:linux基础入门
Linux基础入门主要包括: Linux硬件基础、Linux发展历史、Linux系统安装、xshell连接、xshell优化、SSH远程连接故障问题排查、L inux基础优化、Linux目录结构知识、Linux文件属性、Linux通配符、正则表达式、Linux系统权限等
第二阶段:linux系统管理进阶
linux系统管理进阶包括:Linux定时任务、Linux用户管理、Linux磁盘与文件系统、Linux三剑客之sed命令等。
第三阶段:Linux Shell基础
Linux Shell基础包括:Shell编程基础、Linux三剑客之awk命令等。
第四阶段:Linux网络基础
第五阶段:Linux网络服务
Linux网络服务包括:集群实战架构开始及环境准备、rsync数据同步服务、Linux全网备份项目、nfs网络存储服务精讲、inotify/sersync实时数据同步/nfs存储实时备份项目等。
第六阶段:Linux重要网络服务
Linux重要网络服务包括:http协议/www服务基础、nginx web介绍及基础实践、nginx web、lnmp环境部署/数据库异机迁移/共享数据异机迁移到NFS系统、nginx负载均衡、keepalived高可用等。
第七阶段:Ansible自动化运维与Zabbix监控
Ansible自动化运维与Zabbix监控包括: SSH服务秘钥认证、ansible批量自动化管理集群、 zabbix监控等。
第九阶段:大规模集群高可用服务(Lvs、Keepalived)
第十阶段:Java Tomcat服务及防火墙Iptables
第十一阶段:mysql DBA高级应用实践
MySQL DBA高级应用实践包括:MySQL数据库入门基础命令、MySQL数据库进阶备份恢复、MySQL数据库深入事务引擎、MySQL数据库优化SQL语句优化、MySQL数据库集群主从复制/读写分离、MySQL数据库高可用/mha/keepalved等。
第十二阶段:高性能数据库Redis和Memcached课程
第十三阶段:Linux大规模集群架构构建(200台)
第十四阶段:Linux Shell编程企业案例实战
第十五阶段:企业级代码发布上线方案(SVN和Git)
第十六阶段企业级Kvm虚拟化与OpenStack云计算
第十七阶段公有云阿里云8大组件构建集群实战
第十八阶段:Docker技术企业应用实践
第十九阶段:Python自动化入门及进阶
第二十阶段:职业规划与高薪就业指导
参考技术A 说白了,就几个操作,open,close,read,write,Linux将
所有东西都抽象为文件,例如存在于硬盘文件系统的固然不用说,连硬件的声卡,串口等都之需要像访问文件那样访问,这确实提供了很大的方便,不需要多记忆API。这样跟之前驱动程序看过的能联系起来了。一个驱动程序干些什么东西?很简单,最基本的必须提供这4个系统调用函数。具体实现就是驱动程序里面要实现的了。这个就是接口。
进程
父进程,子进程,创建进程等。线程的生成,等待控制等问题。这里比较好学,进程说白了就是一个执行的程序实力,一个应用程序执行了,那么至少生成了一条进程。或者干脆说,就是一个
“任务”
linux根据的就是这个最小单位来调度的,操作系统的任务调度。当然了,现在是上位机编程,所以不需要知道操作系统的细节,我们只需要了解API。
线程
在一个进程中分几个线程,调度颗粒更加小。着重讨论了
pthread 接口
内存管理
C标准的内存管理函数就不要说了,注意内存泄露等问题。这里主要是学习内存映像文件,就是说将一个文件搬到内存里面执行。
进程间通讯
管道,FIFO,共享内存,消息队列等进程间通讯的手段,这个是操作系统的一个比较重要的概念。所以还是必须好好的学习。
守护进程
参考技术B 主要有几个操作,open,close,read,write,
进程
父进程,子进程,创建进程等。线程的生成,等待控制等问题。这里比较好学,进程说白了就是一个执行的程序实力,一个应用程序执行了,那么至少生成了一条进程。或者干脆说,就是一个
“任务”
linux根据的就是这个最小单位来调度的,操作系统的任务调度。当然了,现在是上位机编程,所以不需要知道操作系统的细节,我们只需要了解API。
线程
在一个进程中分几个线程,调度颗粒更加小。着重讨论了
pthread 接口
内存管理
C标准的内存管理函数就不要说了,注意内存泄露等问题。这里主要是学习内存映像文件,就是说将一个文件搬到内存里面执行。
进程间通讯
管道,FIFO,共享内存,消息队列等进程间通讯的手段,这个是操作系统的一个比较重要的概念。所以还是必须好好的学习。
守护进程
说白了就是后台服务程序,怎么通过系统log来调试等问题。
TCP/IP套接口编程
网络编程,虽然书上说的比较简单,但是实际作起来还是有点郁闷的。几个系统函数调用的处理问题,当然,如果想详细了解,得深入
TCP UDP
包的报文格式,TCP/IP
的4层网络模型等。更多Linux知识可参考下《Linux就该这么学》。
参考技术C 其实学习linux编程主要是要对linux系统操作进行掌握,以及对系统很对c语言代码有所了解,然后要对系统很对内核配置文件进行总结 参考技术D 一、Linux命令
1、文件操作
列出目录内容:ls,dirvdir创建特殊文件:mkdir,mknod,mkfifo文件操作:cp,mvu,rm修改文件属性:chmod,chown,chgrp,touch查找文件:locate,find字符串匹配:grep(egrep)
其它:pwd,cd,ar,file,grep,tar,more,less,head,tail,cat
2、进程操作
ps,killjobs,fg,bg,nice
3、其它
who,whoami,passwd,su,uname,…
man二、Linux工具
编辑工具:vi,emacs编译、链接:gcc(GNU C Compiler->GNU Compiler Colleciion调试:gdbmake命令
版本控制工具:cVs等
三、编程语言
1、High-level Language C/C++,Java,Fortran..…
2、ELF binary format Excutable and Linkable Format工具接口标准委员会(TIS)选择了正在发展中的ELF体系上不同操作系统之间可移植的二进制文件格式)四、GCC使用
E:只对源程序进行预处理(调用cpp预处理器)
-S:只对源程序进行预处理、编译
c:执行预处理、编译、汇编而不连接
-ooutput_file:指定输出文件名
-g:产生调试工具必需的符号信息
-0/On:在程序编译、链接过程中进行优化处理
Wall:显示所有的警告信息
-ldir:指定额外的头文件搜索路径
-Ldir:指定额外的库文件搜索路径
-Iname:链接时搜索指定的库文件
-DMACRO[=DEFN]:定义MACRO宏
Gcc过程:预处理、编译、汇编、链接 更多Linux知识可参考《Linux就该这么学》。

Java并发编程:什么是线程安全,以及并发必须知道的几个概念

废话

众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。为了追求成为一个好的Java程序员,我决定从今天开始死磕Java的并发编程,尽量弥补自己在这方面的知识缺陷。

并发必须知道的概念

在深入学习并发编程之前,我们需要了解几个基本的概念。

同步和异步

同步和异步用请求返回调用的方式来理解相对简单。

同步:可以理解为发出一个请求后,必须等待返回结果才能执行下面的操作。

异步:请求发出后,不需要等待返回结果,可以继续执行后续操作,异步请求更像是在另一个 “空间” 中处理请求的结果,这个过程不会影响请求方的其他操作。

举个生活中的例子,比如我们去实体店买衣服,挑选完款式后下单让售货员去仓库拿货,在售货员拿货的过程你需要在店里等待,直到售货员把衣服交给你后才算购物成功,这就相当于同步的过程。

不过,如果是在网上购物的话,我们只需下单并完成支付,对我们来说整个购物过程就算完成了。网上的商家接到订单会帮我们加紧安排送货,这段时间我们可以去做其他的事,比如去外面打个篮球之类的。等送货上门并签收商品就完事了,这个过程就相当于异步。

并发和并行

并发和并行的功能很相似,两者都可以表示多个任务一起执行的情况,但本质上两者其实是有区别的。

严格意义上来说,并行的多任务是真实的同时执行,而并发更多的情况是任务之间交替执行,系统不停的在多个任务间切换执行,也就是 “串行” 执行。

最直接的例子的就是我们的计算机系统,在单核CPU时代,系统表面上能同时进行多任务处理,比如听歌的同时又浏览网页,但真实环境中这些任务不可能是真实并行的,因为一个CPU一次只能执行一条指令,这种情况就是并发,系统看似能处理多任务是因为不停的切换任务,但因为时间非常短,所以在我们的感官来说就是同时进行的。而计算机系统真实的并行是随着多核CPU的出现才有的。

临界区

临界区表示公共资源或是共享数据,可以被多个线程使用。但是每次只能有一个线程使用它,一旦临界区的资源被占用,其他线程就必须等到资源释放后才能继续使用该资源。在Java程序开发中,对于这样的资源一般都需要做同步的操作,例如下面的这段代码,用的就是synchronized关键字来对临界区资源进行同步

public class SyncTest implements Runnable {
    
    //临界区资源
    public static SyncTest instance = new SyncTest();

    @Override
    public void run() {
        synchronized (instance) {
            
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new SyncTest());
        Thread t2 = new Thread(new SyncTest());
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

阻塞和非阻塞

阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区的资源,那么其他需要这个资源的线程就必须等待。等待的过程会使线程挂起,也就是阻塞。如果临界区的资源一直不释放的话,那么其他阻塞的线程就都不能工作了。

非阻塞则相反,强调的是线程之间并不互相妨碍,所有的线程都会不断尝试向前执行。

死锁、饥饿和活锁

这三种情况表示的是多线程间的活跃状态,对于线程来说,以上的情况都是 “非友好” 的状态。

1、死锁一般是指两个或者两个以上的线程互相持有对方所需的资源,并且永远在等待对方释放的一种阻塞状态。例如有两个线程A和B同时共享临界区的资源C,当A占用C时,B处于阻塞状态,然而A的释放需要用到B的资源,这样一来,就变成了A一直在等待B,B也一直在等待A,互相之间永远在等待对方释放的状态。

一般来说,死锁的发生是由于程序的设计不合理导致,而且死锁很难解决,最好的方式就是预防

2、饥饿是指某一个或者多个线程因为种种原因无法获得所需的资源,导致一直无法执行。比如它的线程优先级太低,而高优先级的线程不断抢占它所需的资源,导致低优先级资源无法工作。

3、活锁的情况是线程一种非常有趣的情况,在生活中我们可能会碰到这样的情况,那就是出门的时候可能会遇到有人要进门,你打算让他先进门,他又打算让你先出门,结果,两个人都互相退后了,然后你打算先出门时对方也向前一步,来来回回就一直卡在门口。当然,这种事情正常人很快就能解决,但如果是线程碰到就没那么幸运了。

如果两个线程占用着公共的资源,并且秉承着 “谦让” 的原则,主动把资源让给他人使用,你让我也让,这样就造成资源在两个线程间不断跳动但线程之间都拿不到资源的情况,这样的情况就是活锁了。

线程安全

线程安全指的是多线程的安全。如果一段程序可以保证被多线程访问后仍能保持正确性,那么程序就是线程安全的。一般来说,线程安全注重的是多线程开发中的共享数据的安全。就比如下面这段代码:

public class ThreadSafety implements Runnable{
    //共享数据
    public static int i = 0;

    public  void increase(){
        for (int j= 0;j<10; j++){
            i++;
        }
    }

    @Override
    public void run() {
        increase();
    }
    
    public static void main(String[] args) throws Exception{
        ThreadSafety demo = new ThreadSafety();
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(i);
    }
    
}

两个线程 t1 和 t2 同时开启,执行run方法,在我们的预想中,如果是线程安全的话,那么main的执行结果应该是20,但是因为 i 是共享数据,而程序没有对 i 的操作做同步的处理,最终运行的结果并不是20,所以这种情况就不是线程安全的情况。

解决的办法也比较简单,可以利用synchronized关键字来修饰方法或代码块,这部分的知识也是并发编程中非常重要的一块,当然,本文就不探究了,之后单独写篇文章出来细说。

参考:《实战Java:高并发程序设计》

以上是关于Linux编程的几个重要知识点的主要内容,如果未能解决你的问题,请参考以下文章

多线程并发相关的几个重要基础知识点解析

整理几个重要的Java知识,2021大厂面试合集

Java并发编程:什么是线程安全,以及并发必须知道的几个概念

Java坦克大战

[C#.NET 拾遗补漏]02:数组的几个小知识

Linux编程之UDP SOCKET全攻略