笔记-LINUX

文章讲述了Linux中du-sh命令的用法,它用于查看目录大小,而df命令则用于查看磁盘空间占用。同时,文章介绍了C++中的互斥量、计时互斥量和条件变量等同步机制,以及如何使用它们进行线程间的同步。还提到了C++20中的信号量支持。最后,文章通过示例展示了如何使用这些工具实现进程和线程的交互。
摘要由CSDN通过智能技术生成
du -sh 在不指定目录的情况下,默认会显示当前目录下的所有子目录的总大小。
du -sh 目录名 在指定目录的情况下,会显示指定目录下的所有文件或文件夹的大小。
du -sh * # 显示当前目录下的所有文件和文件夹大小
du -sh / # 显示根目录下所有的文件和文件夹大小
du -sh /data # 显示/data目录下所有的文件和文件夹大小

df -h (-h参数使结果以K,M,G为单位,提高信息的可读性)

不同:

df 是从总体上统计系统各磁盘的**占用情况**,不能统计具体的文件夹或文件的大小。
du 既可以从总体上统计,又可以统计具体的某个文件夹或文件的**大小**。
df 通过文件系统来快速获取空间大小的信息,速度快,效率高
du通过逐级进入指定目录的每一个子目录,逐个计算每个文件大小并相加,最终显示出来。 所以计算速度慢,当文件目录较多文件较大时要等很久很久!!
df 可以获取已经删除的文件。当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件。所以当一个文件刚删除清空没完全释放时,df 仍会把它计算在内。
du 只能看到当前存在的、没有被删除的文件。

vda1 代表系统盘分了几个区,数字往后递增

C++互斥量:
头文件:#include<mutex>
属于std命名空间
使用:
std::mutex m;
m.lock(); m.unlock();

C++ 计时互斥量:
头文件:#include<mutex>
属于std命名空间
使用:
std::timed_mutex mtx;
mtx.try_lock_for(timeout) ;
mtx.unlock() ;

C++条件变量:
头文件:#include <condition_variable>
属于std命名空间
使用:
std::condition_variable cv;
cv.wait(lock); //释放持有的互斥锁
cv.notify_one(); / cv.notify_all();

std::lock_guard 是 C++ 标准库提供的一个 RAII 风格的互斥锁封装,用于在代码块中自动获取互斥锁,并在离开该代码块时自动释放互斥锁,从而避免了手动加锁解锁的错误和繁琐。
使用方式:
std::lock_guard<std::mutex> lock(mtx); //mtx是要获取的互斥锁

  1. unique_lock比lock_guard更加灵活,可以在构造时不加锁,也可以在中途解锁或重新加锁,还可以转移所有权。(①调用unique_lock的lock和unlock函数中途解锁,或者再加锁 ②调用unique_lock的release函数释放unique_lock对象所有权,并返回一个指针,可以通过指针完成lock和unlock操作 ③使用Move移动语义将一个unique_lock对象转移给另一个unique_lock对象)
  2. unique_lock比lock_guard占用更多的空间和时间,因为它要维护锁的状态,并提供更多的成员函数。
//使用unlock()成员函数
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx); //构造时加锁
//do some work
lck.unlock(); //中途解锁
//do some other work
lck.lock(); //重新加锁

//使用release()成员函数
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx); //构造时加锁
//do some work
std::mutex* ptr = lck.release(); //释放所有权并返回指针
//do some other work
ptr->lock(); //手动加锁
delete ptr; //手动释放指针

//使用移动语义
std::mutex mtx;
std::unique_lock<std::mutex> lck1(mtx); //构造时加锁
//do some work
std::unique_lock<std::mutex> lck2(std::move(lck1)); //转移所有权给lck2
//do some other work
lck2.unlock(); //解锁

信号量直到 C++20 才被支持
在C11实现信号量需要维护一个计数,当计数不够用时,阻塞到条件变量里。

#ifndef _SEMAPHORE_H
#define _SEMAPHORE_H
#include <mutex>
#include <condition_variable>
using namespace std;
 
class Semaphore
{
public:
    Semaphore(long count = 0) : count(count) {}
    //V操作,唤醒
    void signal()
    {
        unique_lock<mutex> unique(mt);
        ++count;
        if (count <= 0)
            cond.notify_one();
    }
    //P操作,阻塞
    void wait()
    {
        unique_lock<mutex> unique(mt);
        --count;
        if (count < 0)
            cond.wait(unique);
    }
    
private:
    mutex mt;
    condition_variable cond;
    long count;
};
#endif

C++实现交替打印:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

mutex mtx;
condition_variable cv;
bool flag = false;

void printNum(int num) {
    for (int i = 1; i <= num; i++) {
        unique_lock<mutex> lock(mtx);
        while (flag) cv.wait(lock);
        cout << i;
        flag = true;
        cv.notify_all();
    }
}

void printChar(char ch) {
    for (int i = 0; i < 3; i++) {
        unique_lock<mutex> lock(mtx);
        while (!flag) cv.wait(lock);
        cout << ch;
        flag = false;
        cv.notify_all();
    }
}

int main() {
    thread t1(printNum, 3);
    thread t2(printChar, 'a');
    thread t3(printChar, 'b');
    thread t4(printChar, 'c');
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    return 0;
}

ps命令:
a显示所有进程,包括其他用户的。
u使用面向用户的格式,提供有关进程的详细信息
x显示所有程序,不以终端机来区分
ps结果有:
进程ID,CPU/内存占用,进程状态,正在执行的命令行命令
状态包括:
在这里插入图片描述
S表示等待某个事件完成,可以被唤醒。D 状态表示进程处于不可中断睡眠状态,通常是等待 IO 事件 。
Ctrl + C 发送 SIGINT信号,终止进程
Ctrl + Z 发送 SIGTSTP 信号,程序暂停 ,但并没有释放内存 ,此时在的进程是挂起转态,可以使用 fg 和bg 命令 前台或 后台 继续该任务

top -p
观察指定pid进程
默认按照CPU使用率排序,可以在结果界面按M(MEM),N(PID),P(CPU)切换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值