linux与windows最大的区别:

目录的区别,linux是树状的文件结构,并且linux的磁盘是通过挂载在某个目录下的。比如boot、home、root分别挂载了不同的分区

ubuntu根目录下的目录:

  1. /bin
  • 存放内容:系统的基本命令(二进制可执行文件)。
  • 说明:包含所有用户都可以使用的命令,如 lscpmkdir 等。
  • 示例文件/bin/ls/bin/cp
  1. /boot
  • 存放内容:启动引导程序相关的文件。
  • 说明:包含内核文件(vmlinuz)、初始化内存盘(initrd)和引导加载程序(如 GRUB)的配置文件。
  • 示例文件/boot/vmlinuz/boot/grub/grub.cfg
  1. /dev
  • 存放内容:设备文件。
  • 说明:Linux 将所有硬件设备抽象为文件,存放在此目录下。例如,硬盘设备文件为 /dev/sda,终端设备文件为 /dev/tty
  • 示例文件/dev/sda/dev/tty1
  1. /etc
  • 存放内容:系统配置文件。
  • 说明:包含系统和应用程序的配置文件。例如,网络配置文件 /etc/network/interfaces,用户配置文件 /etc/passwd
  • 示例文件/etc/hosts/etc/fstab
  1. /home
  • 存放内容:用户的主目录。
  • 说明:每个用户都有一个独立的目录,用于存放个人文件和配置。例如,用户 john 的主目录是 /home/john
  • 示例文件/home/john/Documents
  1. /lib/lib64
  • 存放内容:系统库文件。
  • 说明:包含系统运行所需的共享库文件。/lib 是 32 位库,/lib64 是 64 位库。
  • 示例文件/lib/libc.so.6/lib64/ld-linux-x86-64.so.2
  1. /media
  • 存放内容:可移动设备的挂载点。
  • 说明:当插入 U 盘、光盘等可移动设备时,系统会自动挂载到 /media 下的子目录。
  • 示例文件/media/usb/media/cdrom
  1. /mnt
  • 存放内容:临时挂载点。
  • 说明:用于手动挂载文件系统或网络共享。
  • 示例文件/mnt/network_share
  1. /opt
  • 存放内容:可选应用程序的安装目录。
  • 说明:通常用于安装第三方软件或大型应用程序。
  • 示例文件/opt/google/chrome
  1. /proc
  • 存放内容:虚拟文件系统,提供内核和进程的信息。
  • 说明:文件内容动态生成,用于查看系统状态和进程信息。例如,/proc/cpuinfo 显示 CPU 信息,/proc/1 显示进程 ID 为 1 的进程信息。
  • 示例文件/proc/meminfo/proc/uptime
  1. /root
  • 存放内容:超级用户(root)的主目录。
  • 说明:与普通用户的 /home 目录类似,但专门为 root 用户提供。
  • 示例文件/root/.bashrc
  1. /run
  • 存放内容:运行时数据。
  • 说明:存放系统启动后运行时的临时文件,如 PID 文件、锁文件等。
  • 示例文件/run/udev/run/user/1000
  1. /sbin
  • 存放内容:系统管理员使用的命令。
  • 说明:包含系统管理和维护的命令,如 fdiskifconfig
  • 示例文件/sbin/ifconfig/sbin/reboot
  1. /srv
  • 存放内容:服务数据。
  • 说明:存放系统服务相关的数据,如网站数据、FTP 数据等。
  • 示例文件/srv/www/srv/ftp
  1. /sys
  • 存放内容:虚拟文件系统,提供内核和硬件的信息。
  • 说明:用于管理和配置内核参数和设备。
  • 示例文件/sys/class/net/eth0
  1. /tmp
  • 存放内容:临时文件。
  • 说明:存放系统和应用程序的临时文件,重启后可能会被清除。
  • 示例文件/tmp/tempfile.txt
  1. /usr
  • 存放内容:用户程序和资源。

  • 说明

    :包含用户安装的应用程序、库文件、文档等。通常分为多个子目录:

    • /usr/bin:用户命令。
    • /usr/lib:用户库文件。
    • /usr/share:共享数据(如文档、字体)。
    • /usr/local:本地安装的软件。
  • 示例文件/usr/bin/python3/usr/share/man

  1. /var
  • 存放内容:可变数据。

  • 说明

    :存放经常变化的文件,如日志文件、缓存文件、数据库文件等。主要子目录:

    • /var/log:日志文件。
    • /var/cache:缓存数据。
    • /var/lib:应用程序的状态信息。
  • 示例文件/var/log/syslog/var/cache/apt

  1. /lost+found
  • 存放内容:文件系统修复后的丢失文件。
  • 说明:当文件系统发生错误并修复后,丢失的文件片段会存放在这里。
  • 示例文件/lost+found/file1

Ubuntu 的命令行界面(通常称为终端或 Terminal)是一个 Shell 解释器 的运行环境。

常用指令:

ps:查看进程

ps -T:查看线程

进程间通信方式:

1. 管道(Pipe)

管道是一种半双工的通信方式,数据只能单向流动,通常用于父子进程之间的通信。

特点

  • 单向通信,即半双工。
  • 只能在具有亲缘关系的进程之间使用(如父子进程)。
  • 以先进先出(FIFO)方式组织数据传输。
  • 数据是字节流,没有消息边界。

2. 消息队列

  1. 消息:
    • 进程间传递的数据单元,通常包含消息类型和消息内容。
  2. 队列:
    • 消息的存储区域,按照先进先出(FIFO)的原则管理消息。
  3. 发送者(Producer):
    • 将消息发送到队列的进程。
  4. 接收者(Consumer):
    • 从队列中接收并处理消息的进程。

3. 共享内存

  1. 共享内存段:
    • 一块被多个进程共享的内存区域。
  2. 映射:
    • 将共享内存段映射到进程的地址空间,使进程可以直接访问。
  3. 同步机制:
    • 由于多个进程可以同时访问共享内存,通常需要使用同步机制(如信号量或互斥锁)来避免竞争条件。

**4. Socket **

  1. 创建 Socket:
    • 使用 socket() 函数创建 Socket。
  2. 绑定地址(服务器):
    • 服务器使用 bind() 将 Socket 绑定到本地地址。
  3. 监听连接(服务器):
    • 服务器使用 listen() 开始监听连接请求。
  4. 发起连接(客户端):
    • 客户端使用 connect() 连接到服务器。
  5. 接受连接(服务器):
    • 服务器使用 accept() 接受客户端连接。
  6. 发送和接收数据:
    • 使用 send()recv() 进行数据传输。
  7. 关闭连接:
    • 使用 close() 关闭 Socket。

互斥锁(Mutex): 互斥锁是一种用于实现线程或进程间同步的机制。当一个线程获得互斥锁并访问共享资源时,其他试图获得该锁的线程将被阻塞,直到锁被释放。互斥锁可以保证同一时刻只有一个线程能够访问共享资源。

自旋锁(Spinlock):如果锁已经被其他线程持有,它将不断循环(“自旋”)检查锁是否可用,而不是进入阻塞状态。自旋锁适用于锁持有时间较短且线程不希望在等待锁时进入睡眠状态的场景。

死锁(Deadlock) 是多线程编程中的一种常见问题,指两个或多个线程在执行过程中因争夺资源而陷入互相等待的状态,导致程序无法继续执行。以下是死锁的产生条件和避免方法:

死锁的产生条件

死锁的产生需要同时满足以下四个条件(称为 死锁四要素):

  1. 互斥条件:
    • 资源一次只能被一个线程占用。
  2. 占有并等待:
    • 线程已经占有了至少一个资源,同时又在请求其他被占用的资源。
  3. 不可抢占:
    • 资源不能被其他线程强行抢占,只能由占有它的线程主动释放。
  4. 循环等待:
    • 多个线程之间形成一种循环等待的关系,例如线程 A 等待线程 B 占用的资源,线程 B 又等待线程 A 占用的资源。

死锁的避免方法

为了避免死锁,可以破坏上述四个条件中的任意一个或多个:

  1. 破坏互斥条件:
    • 使用共享资源或设计无锁数据结构(如 CAS 操作)。
  2. 破坏占有并等待:
    • 一次性申请所有需要的资源,如果无法获取全部资源,则释放已占有的资源。
  3. 破坏不可抢占条件:
    • 允许系统强制抢占资源(例如设置超时机制)。
  4. 破坏循环等待条件:
    • 对资源进行排序,要求线程按顺序申请资源,避免循环等待。
  • 终止线程/进程:强制终止一个或多个死锁中的线程/进程,从而释放其持有的资源。这种方法可能会导致数据丢失或不一致,因此需要谨慎使用。
  • 回滚线程/进程:将死锁中的线程/进程回滚到之前的某个状态,然后重新执行。这种方法需要系统支持事务和恢复功能,并且可能会影响系统性能。