android系统就是跑在linux上的系统。Linux层里面包含系统和硬件驱动等一些本地代码的环境。
linux的目录
- mount:
用于查看哪个模块输入只读,一般显示为:
[root@localhost ~]# mount
/dev/cciss/c0d0p2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/cciss/c0d0p7 on /home type ext3 (rw)
/dev/cciss/c0d0p6 on /var type ext3 (rw)
/dev/cciss/c0d0p3 on /usr type ext3 (rw)
/dev/cciss/c0d0p1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/dm-0 on /home/book/upload/BookFile1 type ext3 (rw)
/dev/dm-1 on /home/book/upload/BookFile2 type ext3 (rw)
/dev/dm-2 on /backup type ext3 (rw)
/dev/dm-3 on /home/book/upload/BookFile3 type ext3 (ro)
如果发现有ro,就重新mount,或者umount以后再remount
-
umount /dev/dm-3
如果发现有提示“device is busy”,找到是什么进程使得他busy
fuser -m /mnt/data
将会显示使用这个模块的pid
fuser -mk /mnt/data
将会直接kill那个pid
然后重新mount即可。还有一种方法是直接remount,
mount -o rw,remount /mnt/data
。 -
如何查看cpu占用状态?
要查看CPU占用状态,可以使用以下命令:
-
top命令:在终端输入“top”命令,可以查看当前系统的进程信息和CPU占用情况。可以按“q”键退出。
-
htop命令:htop是top的升级版,可以在终端输入“htop”命令来查看CPU占用状态和进程信息。可以按“q”键退出。
-
ps命令:在终端输入“ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head”命令,可以查看当前运行的进程中CPU占用率最高的前几个进程。
-
mpstat命令:在终端输入“mpstat -P ALL”命令,可以查看每个CPU核心的使用情况。
-
sar命令:在终端输入“sar -u”命令,可以查看系统整体CPU使用率情况,也可以使用“sar -P ALL”查看每个CPU核心的使用情况。
注意:以上命令需要在终端中执行。在Android设备上,可以使用adb shell命令进入设备终端执行相应的命令。
-
linux内核的启动过程
有些设备需要解锁system分区
在调试过程中,需要单独的替换某一个分区,可以通过 update 工具来替换,可以替换
的分区有 bootloader,logo,recovery ,system,vendor 等 -
Linux查看命令行历史命令记录(默认1000条命令历史操作记录)
history
history -w history.txt
Cache
Cache是集成在CPU内部的极高速缓存。一般来讲,它的访问速度几乎可以媲美CPU。CPU在访问Cache的时候几乎不会浪费多少时间,不过,速度的提升是用容量为代价的,容量很小。
为什么需要Cache ?当CPU访问内存的时候,并不是立刻就能访问到它想访问的内存,而是有个“WaitState”的过程。那么,把常用的数据放在Cache中,CPU在访问的时候直接访问Cache就行了,不用耗费时间去访问内存了。
在读内存的时候,CPU先读Cache,看看有没有想要的数据的“副本”,有的话直接读取,没有的话在去读内存。写内存时,CPU先将数据写在Cache中,Cache写满后更新到内存中,同时清空Cache。
RAM
RAM(Random Access Memory)随机存储器。内容可按需随意存取,且存取的速度与存储单元的位置无关,掉电丢数据。
按照存储信息的不同,分为静态堆积存储器(Static RAM,SRAM)和动态随机存储器(Danamic RAM,DRAM)。
SRAM 不需要刷新电路既能保存数据;DRAM每隔一段时间,需要刷新充电一次,否则内部的数据会消失。
SRAM具有较高性能,但是集成度低,既相同容量的DRAM内存可设计成较小的体积,而SRAM却需要很大的体积,且功耗较高。
SRAM速度非常快,是目前读写最快的存储设备了,而且不需要刷新。缺点是价格比较贵,所以只在要求很苛刻的地方使用,比如CPU的一级缓存,二级缓存。
DRAM保留数据的时间很短,速度也比SRAM慢,不过还是比任何的ROM都要快,价格上比SRAM便宜很多,计算机内存就是DRAM的。
ROM
ROM(Read-Only Memory)只读存储器,是一种只能读出事先存储的数据的固态半导体存储器 ,掉电不丢数据。ROM也有很多种,PROM是可编程的ROM,PROM和EPROM(可擦除可编程ROM)两者区别是:PROM是一次性的,也就是软件烧录后,就无法修改了,这是早期产品了,现在已经不可能使用了;而EPROM是通过紫外线的照射擦除原先的程序,是一种通用的存储器。
还有一种EEPROM是通过电子擦除,价格很高,写入时间很长。手机软件一般放在EEPROM中。
Flash
闪存,是一种长寿命的非易失性(在断电情况下不丢数据)的存储器,数据删除不是以单个字节为单位而是以固定的区块为单位(注意:NOR Flash为字节存储),区块一般为256K到20MB。
Flash主要有两种:NOR Flash 和 NAND Flash。
任务Flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除操作。NAND Flash擦除十分简单,而NOR Flash则要求在进行擦除前要将目标块内所有的位都写1。
core,host,device
-
线程池的实现步骤
线程池是一种常见的多线程并发处理模型,它可以有效地管理和控制多线程的执行,提高系统的性能和稳定性。线程池的实现步骤通常包括以下几个方面:
创建线程池对象:线程池通常由一个线程池对象来管理,可以通过调用线程池类的构造函数来创建线程池对象。
初始化线程池参数:在创建线程池对象之后,需要设置线程池的各项参数,包括线程池中线程的数量、任务队列的容量、线程池中线程的命名前缀、拒绝策略等。
创建任务队列:任务队列用来存储待执行的任务,可以采用阻塞队列或非阻塞队列的方式实现。
创建工作线程:在线程池初始化完成后,需要创建指定数量的工作线程,并将它们添加到线程池中。
执行任务:当有任务提交到线程池时,线程池会将任务添加到任务队列中,等待工作线程来执行。
执行拒绝策略:当任务队列已满且线程池中的所有线程都处于忙碌状态时,新提交的任务将无法被执行,这时就需要采取拒绝策略来处理。
关闭线程池:当线程池不再需要使用时,需要将线程池中的所有工作线程停止,并释放线程池占用的资源。
总的来说,线程池的实现步骤可以根据具体的应用场景和需求进行灵活调整,以达到最优的效果和性能。 -
有哪些线程同步的方法
在多线程编程中,为了避免竞态条件和死锁等问题,通常需要使用线程同步方法来协调不同线程之间的操作。常见的线程同步方法包括:
锁机制:包括互斥锁(Mutex)、读写锁(Reader-Writer Lock)、自旋锁(Spinlock)等,用于保证临界区代码的互斥执行,从而避免竞态条件。
条件变量(Condition Variable):用于线程之间的通信和协调,例如等待某个事件的发生、唤醒等待的线程等。
信号量(Semaphore):用于限制并发访问某个资源的线程数目,避免资源竞争。
屏障(Barrier):用于控制多个线程在某个点上的同步,例如所有线程必须在该点执行完成后才能继续执行。
原子操作(Atomic Operation):一些特殊的操作,例如比较交换、自增等,可以保证在并发环境下的原子性,从而避免竞态条件。
读写锁(Reader-Writer Lock):一种特殊的锁,用于优化读操作与写操作的竞争,可以提高并发性能
需要根据具体场景和需求选择合适的线程同步方法,避免出现竞态条件和死锁等问题,提高多线程程序的稳定性和性能。 -
什么是C++中的智能指针,shard_ptr是线程安全的吗,为什么不保证线程安全
C++中的智能指针是一种用于自动管理内存的指针,可以防止内存泄漏和野指针的问题。智能指针是一个类对象,它封装了一个原始指针,并在析构时自动释放所持有的内存。 C++标准库提供了两种智能指针:std::unique_ptr和std::shared_ptr。
std::shared_ptr是一种智能指针,可以在多个地方共享同一块内存,通过计数器来跟踪内存块的引用次数。当最后一个引用被销毁时,计数器将变为零,内存块将被释放。由于使用引用计数,因此std::shared_ptr是线程安全的。
但是需要注意的是,即使std::shared_ptr是线程安全的,也并不保证使用它的代码是线程安全的。例如,如果多个线程访问相同的std::shared_ptr对象,但没有使用任何同步机制来保护这些访问,那么就可能会出现数据竞争和不一致的状态。因此,尽管std::shared_ptr本身是线程安全的,但使用它时需要注意线程安全问题。 -
运行一个.exe程序的详细流程可以分为以下步骤:
加载程序文件:操作系统将程序文件从磁盘中加载到内存中,创建一个进程并分配空间给程序。
解析导入表:程序中包含了很多函数调用,这些函数可能是由其他程序提供的。操作系统需要解析这些函数的入口地址,将这些入口地址填入程序的导入表中。
分配内存空间:程序在运行时需要使用内存空间,操作系统需要分配内存空间给程序,并将分配的地址返回给程序。
初始化程序:操作系统会执行程序的初始化代码,包括对全局变量和静态变量进行初始化。
执行程序:操作系统从程序的入口地址开始执行程序。
加载依赖的动态链接库:程序中可能依赖其他的动态链接库,操作系统需要加载这些动态链接库。
进程结束:程序执行完毕或者异常终止后,操作系统会释放程序占用的内存空间,并将进程退出。
文章评论