慢读chrome(base)

这篇博客探讨了Chrome的基础组件,包括json解析、程序启动和关闭过程、Crash处理选项、数组大小计算宏以及单例模式的实现。文章提到了Google的特殊用法,如`arraysize`宏,以及`LazyInstance`如何确保线程安全。还讨论了MessageLoop的实现,特别是`ThreadLocalPointer`的角色,以及MessagePumpForUI如何处理Windows消息。
部署运行你感兴趣的模型镜像

cryptto 加解密的,太专业

json  json解析的

 

atexit.cc,顺便可以看一下crt0.c了解下程序的启动和关闭过程

程序退出前做动作的,通过超出变量范围时调用析构,执行事先注册在一个栈变量的函数,具体是执行的啥没看过

首先其他函数调用RegisterCallback

然后退出前具体执行 ProcessCallbacksNow();

 

base_switches.cc一些设置选项怎么用还待查

 

 

 

 

 

basictypes.h

 

template <typename T, size_t N>

char (&ArraySizeHelper(T (&array)[N]))[N];

#define arraysize(array) (sizeof(ArraySizeHelper(array)))

这个用法很是奇怪,google了下,发现跟stdlib的_countof是一样的

atlapp.h中的,符合一般的习惯用法

  #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))

 

 

stdlib.h中的,跟google这个一个原理

template <typename _CountofType, size_t _SizeOfArray>

char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];

#define _countof(_Array) sizeof(*__countof_helper(_Array))

具体解释参见http://blog.sina.com.cn/s/blog_494684f00100ihkd.html

为啥简单问题复杂化,难道atlapp中的不好么?继续看下去就知道答案了,

#define ARRAYSIZE_UNSAFE(a) ((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))

如果被传入的参数是个指针?safe就会报个编译错误,unsafe会返回一个你不想要的值,看google的代码就像看书,注释很详细

在vc下,sizeof不会返回0,但是gcc会

!(sizeof(a) % sizeof(*(a)))这个不知道什么意思,它里面说是bool跟具体实现相关,可能某些bool只占一个位?

// Since the size of bool is implementation-defined, we need to cast

 

// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final

// result has type size_t.

A bit field is an std::vector<bool>. It is a specialization of vector designed to optimize memory utilization. Every element in a bit field uses exactly 1 bit. The capacity of a bit field can only grow in multiples of 8, though.

 

lazy_instance.cc

使用位置new操作符 return new (instance) Type();

  int8 buf_[sizeof(Type)];  // Preallocate the space for the Type instance.

单例模式相对于全局静态变量,最大的问题就是多线程竟态下的不可预知性

google怎么做的呢?他通过原子操作InterlockedCompareExchange来比较是否为0

是的话,创建完成之后设为end,然后其他线程循环判断并sleep(0)等待创建完成,但是这个state_变量啥时候变成0的呢

难道这个类在外面也始终作为全局变量来用?是做为全局变量的

这个问题其实很难碰到,

写写应用,估计是从来不需要考虑这种问题

 

pickle.cc 处理其他格式合并到内存的一个类,以前都是使用结构,他这个不需要预定义结构了,只要打包进去就行了,再按顺序解包就行了

 

tuple 强大的元组出现了,以前要做这事,就得定义一大堆的struct,模板的使用很强大

 

终于看明白Messageloop类了,首先定义一个全局变量

 

    base::LazyInstance<base::ThreadLocalPointer<MessageLoop> > lazy_tls_ptr(

        base::LINKER_INITIALIZED);

这个会创建出ThreadLocalPointer,这个类的目的就是创建出来后,会分配一个tls slot,然后所有的messageloop就都用这个slot保存this变量,然后每个线程要用messageloop的时候从tls里取出来,所以一个线程里只能存在一个messageloop

感觉这个lazyinstance很蛋疼,只能用在全局变量处,跟弄个普通全局变量差距很大么?

也解决不了静态变量初始化顺序不确定的问题?难道只是为了省掉那个new的动作?这样的话google对性能的要求也太离谱了吧

chrome里大量使用栈内存,就为了一个指令的优化?内存碎片chrome应该不用考虑吧,频繁的开关进程

 

特别说下messagepumpforui,他会创建一个窗口用来产生计时器和接收kMsgHaveWork消息来调用ScheduleWork来唤醒这个线程

然后run 死魂环接收消息,其中第一个工作就是判断是否存在windows消息,如果存在,就转发给AcceleratorHandler,这里会判断是否

设置了热键,如果没有就         TranslateMessage(&msg);

            DispatchMessage(&msg); 转发出去,然后windowimpl就会接收到

 

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

你看到的 `./.cache` 占用了 **55G**,这是一个非常大的缓存目录。我们来详细解释 `.cache` 是什么、里面通常包含哪些内容,以及为什么它可能变得这么大。 --- ### ✅ `.cache` 目录是什么? `.cache` 是 Linux 桌面用户的**用户级缓存目录**,位于每个用户的家目录下(即 `~/.cache`),遵循 [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html)。 > 它的作用是:**存储应用程序的临时数据缓存,用于加速启动和运行,可安全删除(但可能导致程序重新生成)** --- ### 📁 `.cache` 里通常有哪些子目录?(常见且可能占用大量空间) ```bash ~/.cache/ ├── abrt # 系统崩溃报告(少见) ├── chrome / chromium # 浏览器缓存(图片、脚本、视频片段等)→ 可能几十 GB! ├── code-server / vscode # VS Code Web 版或远程开发缓存 ├── dconf # GNOME 桌面设置缓存(一般小) ├── electron # Electron 应用(如 VSCode 桌面版) ├── fontconfig # 字体渲染缓存 ├── google-chrome # Chrome 用户配置文件缓存 ├── intel-igc-cache # Intel 显卡编译缓存(某些系统) ├── npm / yarn / pnpm # Node.js 包管理器缓存 → 常见大头! ├── rustup / cargo # Rust 工具链缓存(编译中间文件) ├── thumbnails # 文件管理器缩略图(图片/视频预览)→ 长期积累可达数 GB ├── Steam # Steam 游戏更新缓存 └── pip / pip3 # Python 包安装缓存 ``` --- ### 🔍 你的 `.cache` 占了 55G —— 如何排查是谁占的? 运行以下命令查看 `.cache` 下各子目录大小: ```bash du -h --max-depth=1 ~/.cache | sort -hr | head -10 ``` #### 示例输出: ``` 28G /home/gbt/.cache/chromium 15G /home/gbt/.cache/npm 8.0G /home/gbt/.cache/thumbnails 2.1G /home/gbt/.cache/pip 556M /home/gbt/.cache/yarn ``` 👉 这样就能定位到具体哪个应用在“吃磁盘”。 --- ### 💡 常见大户分析 | 目录 | 是否可以清理 | 清理方法 | |------|---------------|----------| | `~/.cache/chromium` 或 `google-chrome` | ✅ 安全 | 关闭浏览器后删除即可 | | `~/.cache/thumbnails` | ✅ 安全 | 删除后下次打开文件夹会重新生成缩略图 | | `~/.cache/npm`, `yarn`, `pnpm` | ✅ 安全 | 使用 `npm cache clean --force` 或直接删 | | `~/.cache/pip` | ✅ 安全 | `rm -rf ~/.cache/pip` | | `~/.cache/cargo` (Rust) | ✅ 安全 | 删除不影响项目,但下次构建变 | | `~/.cache/dconf` | ❌ 不建议删 | 存储 GNOME 设置,删了可能重置界面 | --- ### ✅ 如何安全清理 `.cache` #### 方法 1:手动删除特定目录(推荐) ```bash # 清理 Chromium 缓存 rm -rf ~/.cache/chromium/Default/Cache/* # 清理缩略图(最安全的大户之一) rm -rf ~/.cache/thumbnails/* # 清理 npm 缓存 npm cache clean --force # 清理 pip 缓存 pip cache purge # 或 rm -rf ~/.cache/pip ``` #### 方法 2:使用系统工具 ```bash # 使用内置的磁盘清理工具(Ubuntu) sudo apt install bleachbit bleachbit ``` > 图形化操作,支持安全清理浏览器缓存、临时文件、缩略图等。 --- ### ⚠️ 注意事项 - **不要直接 `rm -rf ~/.cache` 整个目录**,有些程序可能出错。 - 删除后首次打开应用会变(因为要重建缓存)。 - 如果你在做嵌入式开发、AI 训练、前端构建,缓存很大是正常的。 --- ### 🧩 小知识:为什么 `du` 报权限错误? 你看到: ``` du: 无法取目录'./.dbus': 权限不够 du: 无法取目录'./.cache/dconf': 权限不够 ``` 但实际上你又能访问 `.cache`?这是因为: - `.dbus`, `.gnupg`, `.ssh` 等目录权限为 `700`,但你是 owner,所以你可以访问。 - 报错可能是由于某些子进程或挂载问题导致短暂不可。 - 加上 `2>/dev/null` 可以忽略这些警告: ```bash du -h --max-depth=1 . 2>/dev/null | sort -hr ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值